Возможно ли, что вставка и / или удаление элементов могут сделать недействительными итераторы для существующих элементов.
Спасибо.
Да. документация за boost::ptr_vector<T>
состояния:
ptr_vector<T>
это контейнер указателя, который использует базовыйstd::vector<void*>
хранить указатели.
И вставка элементов в или стирание элементов из std::vector
может привести к перераспределению и, следовательно, к существующим итераторам.
В частности, в §23.3.6.5 / 3 C ++ 11 говорится о erase()
:
(3) Эффекты: аннулирует итераторы и ссылки в или после точки стирания.
и о insert()
а также push_back()
:
(1) Примечания: вызывает перераспределение, если новый размер больше, чем старый. Если перераспределение не происходит, все итераторы и ссылки до точки вставки остаются действительными.
Поэтому, чтобы предотвратить аннулирование итератора в случае вставки элемента, вы можете использовать reserve()
функция для увеличения емкости вектора перед получением любых итераторов из него. Эти итераторы останутся действительными до size()
вектора превышает количество элементов, зарезервированное для пространства.
Других решений пока нет …