vector的erase函数迭代器失效
时间: 2025-02-15 16:50:40 浏览: 47
### C++ 中 `vector` 容器的 `erase` 函数导致迭代器失效的问题及解决方案
当使用 `std::vector` 的成员函数 `erase` 删除元素时,任何指向被删除元素及其后的迭代器都会失效。这意味着这些迭代器不能再用于访问或修改容器内的元素[^1]。
对于指定位置元素的删除操作——即调用 `v.erase(pos)` 后,如果尝试继续使用原来的迭代器,则会导致未定义行为。为了安全地遍历并可能移除多个元素,推荐的做法是在每次执行 `erase` 方法后立即更新当前使用的迭代器:
```cpp
#include <iostream>
#include <vector>
void safe_erase_example() {
std::vector<int> vec = {1, 2, 3, 4};
// 正确的方式:在 erase 返回新的有效迭代器后继续循环
for (auto it = vec.begin(); it != vec.end();) {
if (*it % 2 == 0) {
it = vec.erase(it);
} else {
++it;
}
}
// 输出剩余元素
for (const auto& elem : vec) {
std::cout << elem << ' ';
}
}
```
上述代码展示了如何安全地从向量中删除满足特定条件(这里是偶数值)的所有项而不引起迭代器失效问题。每当调用了 `vec.erase()` ,返回的新迭代器会替代旧的一个,从而保持后续迭代的有效性[^4]。
另外一种常见的模式是利用范围基for语句配合反向迭代来避免此问题的发生,因为这样可以在不影响现有迭代的情况下移除前面的元素[^5]。
阅读全文
相关推荐


















