// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <algorithm>
#include <vector>
bool Bool();
void IteratorInvalidationInAForLoop(std::vector<int>& v) {
for (auto it = std::begin(v); it != std::end(v); ++it) {
if (Bool()) {
// Calling `erase` invalidates `it`, and the next loop iteration will use
// it via `++it`
v.erase(it);
}
}
}
void IteratorInvalidationInAWhileLoop(std::vector<int>& v) {
auto it = std::begin(v);
while (it != std::end(v)) {
if (Bool()) {
// Calling `erase` invalidates `it`, and the next loop iteration will use
// it via `++it`
v.erase(it);
}
++it;
}
}
void IteratorInvalidationInAForeachLoop(std::vector<int>& v) {
// This is just a syntactic shorthand and uses iterator under the hood
for (int& x : v) {
if (x % 2 == 0) {
// We're invalidating the iterator here
v.erase(std::remove(v.begin(), v.end(), x), v.end());
}
}
}