Ранее было несколько вопросов по этому вопросу; Насколько я понимаю, вызов std::vector::erase
сделает недействительными только итераторы, которые находятся на позиции после стертого элемента. Однако после удаления элемента итератор в этой позиции все еще действителен (при условии, конечно, что он не указывает на end()
после стирания)?
Мое понимание того, как будет реализован вектор, позволяет предположить, что итератор определенно пригоден для использования, но я не совсем уверен, может ли это привести к неопределенному поведению.
В качестве примера того, о чем я говорю, следующий код удаляет все нечетные целые числа из вектора. Этот код вызывает неопределенное поведение?
typedef std::vector<int> vectype;
vectype vec;
for (int i = 0; i < 100; ++i) vec.push_back(i);
vectype::iterator it = vec.begin();
while (it != vec.end()) {
if (*it % 2 == 1) vec.erase(it);
else ++it;
}
Код отлично работает на моей машине, но это не убеждает меня в его правильности.