Ранее по этому поводу было несколько вопросов; Насколько я понимаю, вызов std :: vector :: erase
аннулирует только итераторы, которые находятся в позиции после стертого элемента. Однако после стирания элемента итератор в этой позиции все еще действителен (при условии, конечно, что он не работает) t указывает на 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;
}
Код отлично работает на моей машине, но это не убеждает меня в его правильности.