Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ Операции над вектором, содержащим экземпляры структуры

Роман Protocol Мыслитель (8562), закрыт 6 лет назад
Всем привет!
Тренируюсь. Создал структуру.
struct MyObject
{
float m_fPosX;
float m_fPosY;
float m_fMass;
};

В теле Main() создал вектор
vector vecObjects(20);

Как заполнить этот вектор через generate()?
generate(vecObjects.begin(), vecObjects.end(), [=]() { return irand(a, b); }); //Заполнение вектора
Строка выше не верна, но я её для примера привёл. Не верна потому что vecObjects содержит переменные типа MyObject, а заполняется int. Как в этой строке (ах) показать, что нужно в каждом экземпляре структуры нужно открыть первое поле m_fPosX и заполнить его случайными числами через лямбду [=]() { return irand(a, b); }, потом открыть второе поле и заполнить его и тоже сделать с третьим?

Затем выполняю сортировку экземпляров структуры внутри вектора по одному из полей
sort(vecObjects.begin(), vecObjects.end(), [=](MyObject i, MyObject j) {return (i.m_fPosX<j.m_fPosX); }); //Сортировка по X

И вывод не знаю тоже как через copy() показать, что нужно открывать по одному экземпляру структуры в векторе и по очереди все поля выписывать, потом другую и так далее.
Дополнен 6 лет назад
Вот неправильный код для вывода. Нужно поля открывать.
copy
(
vecObjects.begin(), // итератор начала массива
vecObjects.end(), // итератор конца массива
ostream_iterator(cout, " ") //итератор потока вывода
);
Дополнен 6 лет назад
Может функцию irand(a, b); модернизировать для приёма типов MyObject и внутри неё поля раскрывать и наполнять?
Дополнен 6 лет назад
Но тогда текущий экземпляр нельзя передать в функцию через
generate(vecObjects.begin(), vecObjects.end(), [=](MyObject i) { return vecObSet(i, a, b); }); //Заполнение вектора
где написано (MyObject i) не должно быть аргументов для выдачи, иначе ошибка появится error C2064: результатом вычисления фрагмента не является функция, принимающая 0 аргументов
Точнее я попробовал так и эта ошибка появилась. Тогда как экземпляр для обработке получить?
Дополнен 6 лет назад
Вот такую функцию придумал, но туда нужен экземпляр.
MyObject vecObSet(MyObject i, int a, int b)
{
i.m_fPosX = irand(a, b);
i.m_fPosY = irand(a, b);
i.m_fMass = irand(a, b);
}
Дополнен 6 лет назад
int irand(int a, int b)
{
return a + rand() % (b - a + 1);
}
Лучший ответ
Чебуратор Мыслитель (8449) 6 лет назад
Что за функция irand? Для чисел с плавающей точкой нужно немного модифицировать rand, ибо он работает только с целыми числами... В векторе не указан тип - нужно указать < MyObject >
Роман ProtocolМыслитель (8562) 6 лет назад
int irand(int a, int b)
{
return a + rand() % (b - a + 1);
}

Пусть целыми числами заполнит, я думаю не страшно расширяющее преобразование.

Указан у вектора тип элементов MyObject. Это Mail.Ответы убирает что написано в треугольных скобках, когда я код на этот сайт заливаю.

Вот код (файл *.cpp), там много всего, что я по векторам тренируюсь, со 126 строки по этой теме.
https://yadi.sk/d/F_TB8C4K3PtNBs
Роман Protocol Мыслитель (8562) В функции vecObSet забыл установить возврат значения. MyObject vecObSet(MyObject i, int a, int b) { i.m_fPosX = irand(a, b); i.m_fPosY = irand(a, b); i.m_fMass = irand(a, b); return i; }
Остальные ответы
Камиль Ахметьянов Знаток (454) 6 лет назад
Что за функция irand? Для чисел с плавающей точкой нужно немного модифицировать rand, ибо он работает только с целыми числами... В векторе не указан тип - нужно указать < MyObject >
Похожие вопросы