Перед этим возникло несколько вопросов по этому вопросу; я понимаю, что вызов std::vector::erase
приведет только к недействительным итераторам, которые находятся в позиции после стертый элемент. Однако, после стирания элемента, итератор в этой позиции все еще действителен (при условии, конечно, что он не указывает на end()
после удаления)?std :: vector iterator invalidation
Мое понимание того, как вектор будет реализован, кажется, предполагает, что итератор определенно полезен, но я не совсем уверен, может ли это привести к неопределенному поведению.
В качестве примера того, что я говорю, следующий код удаляет все нечетные целые числа из вектора. Вызывает ли этот код неопределенное поведение?
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;
}
Код работает нормально на моей машине, но это не убеждает меня в том, что оно действительно.
Почему вы передаете 'x' по константной ссылке, а не по стоимость? – fredoverflow
@Fred: Никакой особой причины; Спасибо что подметил это. –
@James Но как работает вышеописанный код, так как стирание аннулирует итераторы? – Kapil