Повторное использование итератора после вставки в вектор

Мне нужны некоторые пояснения относительно вектора и итератора. У меня есть вектор my_objectи итератор для этого вектора. Я выполняю вставку в позиции итератора и вторую вставку в том же месте:

myiteratornew = (my_vector).insert(myiterator, my_object1);
myiteratornew = (my_vector).insert(myiterator, my_object2);

После использования этой функции несколько раз для нескольких типов «входных» данных, сегодня я получаю ошибку памяти. Конечно, я думаю, что проблема вызвана использованием старый итератор на модифицированный (перераспределенный) вектор; модифицируя код таким образом, теперь он работает:

myiteratornew = (my_vector).insert(myiterator, my_object1);
myiteratornew = (my_vector).insert(myiteratornew , my_object2);

У меня вопрос, как это возможно, что я использовал свой код несколько раз, не получая ошибку памяти? Должен ли второй код предотвращать мой код, вызывающий ошибку памяти?

0

Решение

Если при вставке значения в вектор его размер станет больше его емкости, произойдет перераспределение. В этом случае все итераторы и ссылки становятся недействительными.

Иначе, только итераторы и ссылки перед точкой вставки остаются действительными. Итераторы и ссылки после точки вставки, а также past-the-end итератор также признан недействительным.

Скорее всего, это произойдет с вами — вы пытаетесь использовать итератор, который больше не действителен. Вот почему ваш второй пример работает так, как ожидалось: получить новый итератор и вставить его — это совершенно правильно.

4

Другие решения

То, что вы должны сделать, это вставить все объекты одновременно. Впоследствии итератор становится недействительным, но, поскольку вы уже вставили все, он вам больше не нужен. Также это более эффективно, поскольку вам нужно перемещать объекты за итератором только один раз, а не несколько раз.

my_vector.insert(myiterator, begin(my_objects), end(my_objects));

Если ваши объекты не в контейнере, вы можете поместить их туда:

my_object1;
my_object2;

std::reference_wrapper<decltype(my_object1)> myobjects[] = {my_object1, my_object2};
0

С помощью std::list вместо std::vector может освободить вас от ошибки памяти.

-2
По вопросам рекламы [email protected]