Namespaces
Variants

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

From cppreference.net

(1)
void remove ( const T & value ) ;
(C++20 前)
size_type remove ( const T & value ) ;
(C++20 起)
(C++26 起为 constexpr)
(2)
template < class UnaryPred >
void remove_if ( UnaryPred p ) ;
(C++20 前)
template < class UnaryPred >
size_type remove_if ( UnaryPred p ) ;
(C++20 起)
(C++26 起为 constexpr)

移除所有满足特定条件的元素。

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

仅使被移除元素的迭代器和引用失效。

目录

参数

value - 要移除的元素值
p - 一元谓词,当元素应被移除时返回​ true

表达式 p ( v ) 必须可转换为 bool ,其中 v 为类型(可能为 const) T 的任意实参,且与 值类别 无关,同时不得修改 v 。因此,不允许使用 T & 作为参数类型 ,也不允许使用 T ,除非对于 T 类型移动操作等同于复制操作 (C++11 起) 。 ​

类型要求
-
UnaryPred 必须满足 谓词 的要求。

返回值

(无)

(C++20 前)

被移除的元素数量。

(C++20 起)

复杂度

给定 N std:: distance ( begin ( ) , end ( ) )

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

注释

功能测试 标准 功能
__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 未明确说明迭代器
和/或引用是否失效
仅使被移除元素的迭代器
和引用失效

参见

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