Ранее было несколько вопросов по этому вопросу; я понимаю, что вызов 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;
}
Код работает нормально на моей машине, но это не убеждает меня в том, что оно действительно.