Назад к вопросам
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?