名前空間
変種
操作

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

From 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) 述語 ptrue を返すすべての要素を削除します。

目次

[編集] パラメータ

value - 削除する要素の値
p - 要素を削除すべき場合に ​true を返す単項述語。

p(v) は、[value category](値カテゴリ)に関係なく、すべての引数 v (型は (possibly const) T) に対して bool に変換可能であり、v を変更しない必要があります。したがって、パラメータ型 T& は許可されません。また、T の移動がコピーと同等である場合を除き、T も許可されません(C++11 以降)

型要件
-
UnaryPredicatePredicate の要件を満たさなければなりません。

[編集] 戻り値

(なし)

(C++20まで)

削除された要素の数。

(C++20以降)

[編集] 計算量

Nstd::distance(begin(), end()) とすると、

1) N 回の operator== による比較。
2) 述語 pN 回の適用。

[編集] 注釈

機能テストマクロ 規格 機能
__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 イテレータが
無効になるか、あるいは参照が
削除された要素へのイテレータと
参照のみを無効にするかは

[編集] 関連項目

特定の基準を満たす要素を削除する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)