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 的一元谓词。

对每个(可为 const 的) T 类型参数 v ,表达式 p(v) 必须可转换到 bool,无关乎值类别,而且必须不修改 v 。从而不允许 T& 类型参数,亦不允许 T ,除非对 T 而言移动等价于复制 (C++11 起)。 ​

类型要求
-
UnaryPredicate 必须符合谓词 (Predicate) 的要求。

返回值

(无)

(C++20 前)

移除的元素数。

(C++20 起)

复杂度

给定 Nstd::distance(begin(), end())

1) 应用 Noperator== 进行比较。
2) 应用 N 次谓词 comp

注解

功能特性测试 标准 备注
__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 << " 个等于 1 的元素\n";
 
    auto count2 = l.remove_if([](int n){ return n > 10; });
    std::cout << " 移除了 " << count2 << " 个大于 10 的元素\n";
 
    std::cout << "最后,链表包含:";
    for (int n : l)
        std::cout << n << ' ';
    std::cout << '\n';
}

输出:

移除了 2 个等于 1 的元素
移除了 3 个大于 10 的元素
最后,链表包含:2 3 10 -1

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 1207 C++98 不明确迭代器和/或引用是否会失效 只有到被移除元素的迭代器和引用会失效

参阅

移除满足特定判别标准的元素
(函数模板)