You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用remove_if的正确方法:为何删除vector中偶数的代码未达预期

错误原因与修复方案

std::remove_if 属于STL通用算法,本身不会修改原容器的大小,只会调整容器内的元素顺序:执行时会把所有不满足删除条件的元素移动到容器的前半段,返回指向「第一个待删除元素」的迭代器,也就是调整后有效内容的末尾位置。

你的代码仅调用了remove_if调整元素顺序,没有删除末尾的无效元素,遍历整个容器时就会看到之前残留的旧值,也就是输出末尾出现的偶数。

标准修复方案

使用C++通用的erase-remove 惯用法,把remove_if返回的迭代器传入容器的erase方法,删除末尾所有无效元素即可,修改后代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool myCond(int i) { return i % 2 == 0; }

int main ()
{
  vector<int> myVector = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22};
  
  // 新增erase调用删除末尾无效元素
  myVector.erase(remove_if(myVector.begin(), myVector.end(), myCond), myVector.end());
  
  for(int i : myVector) cout << i << " ";
  cout << endl;
  return 0;
}

修改后输出结果为:11 13 15 17 19,符合预期。

如果你使用的是C++20及以上版本,还可以直接调用封装好的std::erase_if,写法更简洁:

// 直接替换remove_if和erase的两行代码即可
std::erase_if(myVector, myCond);

内容的提问来源于stack exchange,提问作者Sandeep。

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:06:03