std :: vector аннулирование итератора

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

Код отлично работает на моей машине, но это не убеждает меня в его правильности.

14
задан James McNellis 19 September 2010 в 23:03
поделиться