C++如何删除vector中的指定元素?(erase用法)

删除vector指定元素应避免直接erase遍历,正确方法是:1.删全部等值元素用remove+erase;2.删满足条件元素用remove_if+erase;3.删首个匹配用find+erase;4.遍历时安全删除需用erase返回的迭代器或反向遍历。

删除 vector 中指定元素,不能直接用 erase 遍历删除,否则会跳过下一个元素或导致越界。核心方法是:**用 erase 配合 remove(或 remove_if)实现“逻辑删除 + 物理擦除”两步操作**。

删除所有等于某值的元素(如全部删掉 5)

std::remove 将目标元素“移走”,再用 erase 删除尾部冗余部分:

  • std::remove 不真正删除,而是把不匹配的元素前移,返回新逻辑结尾的迭代器
  • erase 接收该迭代器和 end(),一次性清除后面“被覆盖”的旧值

示例:

vector v = {1, 5, 3, 5, 7, 5};
v.erase(remove(v.begin(), v.end(), 5), v.end()); // 结果:{1, 3, 7}

删除满足条件的元素(如所有偶数)

std::remove_if + lambda 或函数对象:

  • lambda 写法简洁直观,适合简单判断
  • 注意 remove_if 同样只重排,需配合 erase 才生效

示例:

vector v = {1, 2, 3, 4, 5, 6};
v.erase(remove_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; }), v.end());
// 结果:{1, 3, 5}

只删第一个匹配的元素

不用 remove,改用 find 定位,再单次 erase

  • find 返回首个匹配迭代器,没找到时返回 end()
  • 必须检查是否找到,避免对 end() 调用 erase(未定义行为)

示例:

vector v = {1, 5, 3, 5, 7};
auto it = find(v.begin(), v.end(), 5);
if (it != v.end()) {
  v.erase(it); // 只删第一个 5
} // 结果:{1, 3, 5, 7}

遍历时安全删除(边查边删)

若必须在循环中按条件动态删除(比如根据运行时计算结果),要用反向遍历或调整迭代器:

  • 正向遍历时,erase 返回下一个有效迭代器,应赋值给当前迭代器继续循环
  • 反向遍历更直观,下标不会受前面删除影响

正向安全写法示例:

for (auto it = v.begin(); it != v.end(); ) {
  if (*it == 5) {
    it = v.erase(it); // erase 返回下一个位置
  } else {
    ++it;
  }
}