Когда итераторы ptr_vector признаны недействительными

Возможно ли, что вставка и / или удаление элементов могут сделать недействительными итераторы для существующих элементов.

Спасибо.

1

Решение

Да. документация за 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() вектора превышает количество элементов, зарезервированное для пространства.

4

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

Других решений пока нет …