删除vector指定元素应避免直接erase遍历,正确方法是:1.删全部等值元素用remove+erase;2.删满足条件元素用remove_if+erase;3.删首个匹配用find+erase;4.遍历时安全删除需用erase返回的迭代器或反向遍历。
删除 vector 中指定元素,不能直接用 erase 遍历删除,否则会跳过下一个元素或导致越界。核心方法是:**用 erase 配合 remove(或 remove_if)实现“逻辑删除 + 物理擦除”两步操作**。
用 std::remove 将目标元素“移走”,再用 erase 删除尾部冗余部分:
std::remove 不真正删除,而是把不匹配的元素前移,返回新逻辑结尾的迭代器erase 接收该迭代器和 end(),一次性清除后面“被覆盖”的旧值示例:
vector用 std::remove_if + lambda 或函数对象:
remove_if 同样只重排,需配合 erase 才生效示例:
vector不用 remove,改用 find 定位,再单次 erase:
find 返回首个匹配迭代器,没找到时返回 end()
end() 调用 erase(未定义行为)示例:
vector若必须在循环中按条件动态删除(比如根据运行时计算结果),要用反向遍历或调整迭代器:
erase 返回下一个有效迭代器,应赋值给当前迭代器继续循环正向安全写法示例:
for (auto it = v.begin(); it != v.end(); ) {
ase 返回下一个位置