命名空间
变体
操作

std::list<T,Allocator>::remove, remove_if

来自 cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
(1)
void remove( const T& value );
(直到 C++20)
size_type remove( const T& value );
(从 C++20 开始)
(2)
template< class UnaryPredicate >
void remove_if( UnaryPredicate p );
(直到 C++20)
template< class UnaryPredicate >
size_type remove_if( UnaryPredicate p );
(从 C++20 开始)

移除所有满足特定条件的元素。仅使指向已移除元素的迭代器和引用失效。

1) 移除所有等于 value 的元素(使用 operator==)。
2) 移除谓词 p 返回 true 的所有元素。

内容

[编辑] 参数

value - 要移除的元素的值
p - 一元谓词,如果应移除元素,则返回 true

表达式 p(v) 必须可转换为 bool,对于类型为 (可能是 const) T 的每个参数 v(无论 值类别 如何),并且不得修改 v。 因此,不允许使用 T& 的参数类型 ,也不允许使用 T,除非对于 T,移动等效于复制(从 C++11 开始)。 ​

类型要求
-
UnaryPredicate 必须满足 Predicate 的要求。

[编辑] 返回值

(无)

(直到 C++20)

移除的元素数量。

(从 C++20 开始)

[编辑] 复杂度

假设 Nstd::distance(begin(), end())

1) 使用 operator== 执行恰好 N 次比较。
2) 恰好对谓词 p 执行 N 次应用。

[编辑] 注释

功能测试 Std 功能
__cpp_lib_list_remove_return_type 201806L (C++20) 更改返回类型

[编辑] 示例

#include <list>
#include <iostream>
 
int main()
{
    std::list<int> l = {1, 100, 2, 3, 10, 1, 11, -1, 12};
 
    auto count1 = l.remove(1);
    std::cout << count1 << " elements equal to 1 were removed\n";
 
    auto count2 = l.remove_if([](int n){ return n > 10; });
    std::cout << count2 << " elements greater than 10 were removed\n";
 
    std::cout << "Finally, the list contains: ";
    for (int n : l)
        std::cout << n << ' ';
    std::cout << '\n';
}

输出

2 elements equal to 1 were removed
3 elements greater than 10 were removed
Finally, the list contains: 2 3 10 -1

缺陷报告

以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确的行为
LWG 1207 C++98 不清楚是迭代器
还是引用将失效
仅使指向已移除元素的迭代器和
引用失效

[编辑] 另请参阅

移除满足特定条件的元素
(函数模板) [编辑]