A ptr_vector::iterator
увеличивается, как обычный итератор произвольного доступа.В вашем примере вы можете стереть каждый элемент без фактического увеличения, потому что после удаления элемента каждый элемент после его перемещения перемещается в массиве.Поэтому, когда вы стираете 0-й элемент, ваш итератор теперь указывает на элемент, который использовал в качестве 1-го элемента, но теперь является 0-м элементом и т. Д.Другими словами, итератор остается на месте, пока весь вектор смещается влево.
Это не имеет никакого отношения к ptr_vector.Обратите внимание, что такое же поведение будет происходить с простым std::vector
.
. Также обратите внимание, что использование итератора после удаления элемента, на который он указывает, опасно.В вашем случае это работает, но лучше принять возвращаемое значение ptr_vector::erase
, чтобы вы получили новый итератор, который гарантированно будет действительным.
for (it = pv.begin(); it != pv.end(); )
it = pv.erase(it);
Что касается других ваших вопросов:
Если вы хотите стереть только определенный элемент, то, конечно, вы должны стереть его напрямую, используя pv.erase(pv.begin() + N)
.Чтобы назначить новое значение определенному элементу в векторе указателя, просто скажите pv[N] = Derived(whatever)
.Вам не нужно использовать new
при переназначении значения.Вектор указателя вызовет оператор присваивания объекта по индексу, которому вы присваиваете новое значение.