C++官网参考链接:https://cplusplus.com/reference/forward_list/forward_list/remove_if/
公有成员函数模板
<forward_list>
std::forward_list::remove_if
template <class Predicate> void remove_if (Predicate pred);
删除满足条件的元素
从容器中移除谓词pred返回true的所有元素。这将调用这些对象的析构函数,并根据删除的元素数量减少容器大小。
该函数为每个元素调用pred(*i)(其中i是该元素的iterator)。list中任何返回true的元素都将从容器中删除。
形参
pred
一元谓词,接受与forward_list对象中包含的值相同类型的值,对于要从容器中删除的值返回true,对于剩余的值返回false。
它可以是函数指针,也可以是函数对象。
返回值
没有返回值。
用例
// forward_list::remove_if
#include <iostream>
#include <forward_list>
// a predicate implemented as a function:
bool single_digit (const int& value) { return (value<10); }
// a predicate implemented as a class:
class is_odd_class
{
public:
bool operator() (const int& value) {return (value%2)==1; }
} is_odd_object;
int main ()
{
std::forward_list<int> mylist = {7, 80, 7, 15, 85, 52, 6};
mylist.remove_if (single_digit); // 80 15 85 52
mylist.remove_if (is_odd_object); // 80 52
std::cout << "mylist contains:";
for (int& x: mylist) std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
输出:
复杂度
容器大小(pred的应用)中的线性。
iterator的有效性
指向被函数删除的元素的iterator、指针和reference将失效。
所有其他iterator、指针和reference保持它们的有效性。
数据竞争
完成容器的修改。
删除的元素被修改。同时访问或修改其他元素是安全的,但遍历容器就不安全了。
异常安全
如果pred保证不抛出,则该函数永远不会抛出异常(无抛出保证)。
否则,如果抛出异常,容器将保持有效状态(基本保证)。