调用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。
相关产品推荐
相关产品推荐

