MiddleДебаггингОчень частоЕщё не отвечали
Почему удаление в этом цикле — неопределённое поведение?
Этот цикл пытается выбросить чётные числа из вектора, но падает или пропускает элементы.
std::vector<int> v{1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); ++it) {
if (*it % 2 == 0) v.erase(it);
}
Найдите и исправьте ошибку.
vector::erase инвалидирует it и все итераторы после него; следующий ++it продвигает уже висячий итератор — UB. Решение: использовать возвращаемое значение, it = v.erase(it);, и делать ++it только если ничего не удалили. Либо std::erase_if(v, pred); (C++20).
- ✗Считать, что erase оставляет итератор на следующем элементе
- ✗Винить повторные вызовы end() вместо инвалидации итераторов
- ✗Думать, что идиома erase-remove здесь не нужна
- →Как идиома erase-remove полностью устраняет эту проблему?
- →Какие контейнеры НЕ инвалидируют другие итераторы при erase?