Что происходит, когда вы добавляете элементы к структуре данных, такие как вектор, во время итерации по ней.Могу ли я этого не делать?
Итератор станет недействительным, если вектор изменится сам.Так что вы в безопасности, пока вектор не изменяет свой размер.
Я бы посоветовал вам этого избежать.
Краткое объяснение, почему изменение размера делает итератор недействительным:
Изначально вектор имеет некоторую емкость (которую вы можете узнать, вызвав vector::capacity()
.), И вы добавляете к нему элементы, а когда он заполняется, он выделяет больший объем памяти, копируя элементы из старой памяти во вновь выделенную.памяти, а затем удаляет старую память, и проблема в том, что итератор все еще указывает на старую память, которая была освобождена.Именно так изменение размера делает итератор недействительным.
Вот простая демонстрация.Просто посмотрите, когда capacity
изменится:
std::vector<int> v;
for(int i = 0 ; i < 100 ; i++ )
{
std::cout <<"size = "<<v.size()<<", capacity = "<<v.capacity()<<std::endl;
v.push_back(i);
}
Частичный вывод:
size = 0, capacity = 0
size = 1, capacity = 1
size = 2, capacity = 2
size = 3, capacity = 4
size = 4, capacity = 4
size = 5, capacity = 8
size = 6, capacity = 8
size = 7, capacity = 8
size = 8, capacity = 8
size = 9, capacity = 16
size = 10, capacity = 16
См. Полный вывод здесь: http://ideone.com/rQfWe
Примечание: capacity()
сообщает максимальное количество элементов, которое вектор может содержать без выделения новой памяти , а size()
сообщает количество элементов, которое вектор содержит в настоящее время.