Как скопировать набор объектов в массив объектов? - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно скопировать первый элемент размера из набора Solution (класса) с именем population в массив решений с именем parent.У меня есть некоторые проблемы с итераторами, потому что я должен сделать гибридное решение между нормой для цикла и для с итераторами.Идея такова: когда я на i-й итерации for, я объявляю новый итератор, указывающий начало заполнения, затем я перемещаю этот итератор в i-ую позицию, я беру этот элемент решения и копирую в родителей [i]

Solution* parents;   //it is filled somewhere else
std::set<Solution> population;   //it is filled somewhere else
for (int i = 0; i < size; i++) {
    auto it = population.begin();
    advance(it, i);
    parents[i] = *it;
}

Два сообщения об ошибках всплывают с этим предложением: «Выражение: невозможно разыменовать конечную карту / задать итератор» и «Выражение: не удается перейти к конечной карте / задать итератор»
Любая идея, как это сделатьтрюк?Я знаю, что это довольно плохое смешивание массива и набора, я должен использовать вектор вместо массива?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Вы используете std::copy_n.

#include <algorithm>

extern Solution* parents;   //it is filled somewhere else
extern std::set<Solution> population;   //it is filled somewhere else

std::copy_n(population.begin(), size, parents);
0 голосов
/ 11 декабря 2018

Кажется, что size может быть неправильно установлен.Чтобы ваш код работал должным образом, вам нужно просто использовать размер коллекции напрямую:

auto it = population.begin();
for (int i = 0; i < population.size(); i++) {
    parents[i] = *it;
    ++it;
}

Это также можно решить с помощью гораздо более простого выражения:

std::copy(population.begin(), population.end(), parents);
0 голосов
/ 11 декабря 2018

Мне нужно скопировать первый элемент размера из набора [..] в массив

Вы можете использовать std::copy_n.


for (int i = 0; i < size; i++) {
    auto it = population.begin();
    advance(it, i);

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


Выражение: невозможно разыменовать конец карты / задать итератор '

Проблема здесь заключается в том, чтоВаш набор не содержит по крайней мере size количество элементов.Вы не можете скопировать size количество элементов, если их не так много.Я предлагаю копировать меньше элементов, когда набор меньше.


я должен использовать вектор вместо массива?

Возможно.Массив очень большой?Не известен ли размер вектора во время компиляции?Если это так, используйте вектор.

...