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