Краткий ответ: Все будет хорошо.Не беспокойтесь об этом и вернитесь к работе.
Средний ответ: Добавление элементов или удаление их из вектора делает недействительными все итераторы и ссылки / указатели (возможно, за исключением удалениясзади).Просто как тот.Не обращайтесь к каким-либо старым итераторам и получайте новые после такой операции.Пример:
std::vector<int> v = get_vector();
int & a = v[6];
int * b = &v[7];
std::vector<int>::iterator c = v.begin();
std::advance(it, 8);
v.resize(100);
Теперь a
, b
и c
недопустимы: вы не можете использовать a
и разыменование b
или c
.
Длинный ответ: Вектор отслеживает динамическую память.Когда память исчерпана, она выделяет новый, больший фрагмент в другом месте и копирует (или перемещает) все старые элементы поверх (а затем освобождает старую память, уничтожая старые объекты).Выделение и освобождение памяти осуществляется с помощью allocator (обычно std::allocator<T>
), который, в свою очередь, обычно вызывает ::operator new()
для извлечения памяти, который, в свою очередь, обычно вызывает malloc()
.Детали могут отличаться и зависеть от вашей платформы.В любом случае любые ранее удерживаемые ссылки, указатели или итераторы больше не действительны (предположительно, потому что они ссылаются на освободившуюся память, хотя в стандарте не указано, почему они недействительны).