|  | // 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()); | 
|  | } | 
|  | } | 
|  | } |