📅  最后修改于: 2023-12-03 14:59:45.519000             🧑  作者: Mango
在C++ STL中,algorithm是一个非常常用的库,其中remove_if()函数是一个非常常用的操作,用于删除满足特定条件的元素。
remove_if()函数位于algorithm头文件中,其形式如下:
template <class InputIterator, class Predicate>
InputIterator remove_if (InputIterator first, InputIterator last, Predicate pred);
该函数会将[first, last)区间内满足谓词pred条件的所有元素“移动”到区间尾部,然后返回一个指向新区间结尾的迭代器(指向第一个被移动元素的位置)。不属于该条件的元素仍然保持在[first, last)区间中。
注意:该函数并不真的删除元素,只是将符合条件的元素移动到了区间尾部。
举例来说,下面就是一个简单的使用remove_if()函数的例子:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 删除奇数
vec.erase(remove_if(vec.begin(), vec.end(), [](int n) { return n % 2 == 1; }), vec.end());
// 输出结果
for (auto n : vec) {
cout << n << " ";
}
cout << endl;
}
该代码会删除vector中的所有奇数,并输出结果:
2 4 6 8
值得注意的是,remove_if()函数只是将符合条件的元素移动到了区间尾部,需要使用vector中的erase()函数删除区间尾部的元素。由于remove_if()函数并不真的删除元素,因此end()并没有被改变,即不需要向erase()函数传递一个新的end()迭代器(这一点与erase()函数删除元素是不同的)。
remove_if()函数是一个非常常用的STL函数,可用于删除满足特定条件的元素。在使用该函数时,需要注意移动的元素并没有真正删除,需要使用erase()函数删除区间尾部的元素。