C++ STLのlist::remove()とremove_if()関数の使い方を徹底解説
C++のSTLにおいて、listコンテナが提供するremove()およびremove_if()関数の機能と使い方について詳しく解説します。
STLにおけるlistとは?
listは、シーケンス内の任意の位置に対して定数時間での挿入・削除を可能にするコンテナです。内部的には双方向リンクリストとして実装されており、非連続的なメモリ割り当てを行います。そのため、配列やvector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forward_listは単方向リンクリストであり、前方方向にしかイテレートできない点が異なります。
remove()関数とは?
remove()関数は、引数として渡された指定値に一致する要素をリストからすべて削除するために使用されます。
構文
listname.remove(val);
パラメータ
val − 削除対象となる値を指定します。
例
入力リスト: 1 2 3 3 4 5 出力リスト: 1 2 4 5 → 要素「3」がすべて削除されています。 入力リスト: 5 6 7 8 8 8 9 出力リスト: 5 7 8 8 8 9 → 要素「6」が削除されています。
処理の手順
まず、listを宣言します。
次に、listの内容を表示します。
その後、remove()関数を呼び出します。
上記の手順に従うことで、指定した値を持つ要素を簡単に削除できます。
サンプルコード
// STLのlist remove()関数の動作を示すC++コード
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> lst = { 21, 24, 28, 26, 27, 25 };
// リストを表示
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// remove()関数で値を削除
lst.remove(27);
cout << "\nNew List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
出力
上記のコードを実行すると、以下のような出力が得られます。
入力 – List: 21 24 28 26 27 25 出力 – New List: 21 24 28 26 25
同様に、別のリストに対しても同じように動作します。
入力 – List: 45 46 47 48 49 50 出力 – New List: 45 46 48 49 50(47が削除される)
remove_if()関数とは?
remove_if()関数は、引数として渡された条件(述語/predicate)がtrueを返すすべての要素をリストから削除するために使用されます。単純な値の一致だけでなく、柔軟な条件指定が可能な点が特徴です。
構文
listname.remove_if(predicate);
パラメータ
predicate − 削除条件を定義した述語関数を指定します。
例
入力 – List: 5 6 7 8 9 10 出力 – New List: 5 7 9 → すべての偶数要素が削除されています。 入力 – List: 5 10 15 20 25 30 出力 – New List: 5 15 25 → 10で割り切れる要素がすべて削除されています。
処理の手順
まず、述語関数(predicate)を宣言します。
次に、listを宣言します。
listの内容を表示します。
その後、remove_if()関数を呼び出し、述語を引数として渡します。
上記の手順により、任意の条件に基づいて要素を柔軟に削除できます。remove_if()を呼び出す際には、条件を定義した述語関数を必ず引数として渡してください。
サンプルコード
// STLのlist remove_if()関数の動作を示すC++コード
#include <iostream>
#include <list>
using namespace std;
bool div3(const int& val) {
return (val % 3) == 0;
}
int main() {
list<int> lst = { 2, 3, 4, 15, 9, 7, 21, 24, 13 };
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// remove_if()関数で条件に合う要素を削除
lst.remove_if(div3);
cout << "\nNew List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
出力
上記のコードを実行すると、以下の出力が生成されます。
入力 – List: 2 3 4 15 9 7 21 24 13 出力 – New List: 2 4 7 13
まとめ
remove()は特定の値に一致する要素を削除するシンプルな手段を提供し、remove_if()はユーザー定義の条件に基づいて柔軟に要素を削除できます。どちらもlistのメンバ関数として用意されており、イテレータ操作や標準アルゴリズムを意識せずに手軽に利用できるのが大きなメリットです。用途に応じて両者を使い分けることで、リスト操作のコードをより簡潔かつ読みやすくできます。
-
C++ STLのlistにおけるcrbegin()・crend()関数の使い方を解説
C++のSTL(標準テンプレートライブラリ)には、リストを逆方向に走査するための便利なメンバ関数が用意されています。本記事では、list::crbegin()とlist::crend()の2つの関数の動作について詳しく解説します。これらの関数はC++標準テンプレートライブラリの一部であり、使用するには<list>ヘッダーをインクルードする必要があります。list::crbegin()とはlist::crbegin()は、リストの逆先頭(つまりリストの末尾要素)を指す定数リバースイテレータを返します。この関数を使うと、リストを末尾から先頭へ向かって辿ることができますが、イテレータを通
-
C++ STLのlist::cbegin()とcend()関数の使い方を解説
本記事では、C++におけるlist::cbegin()およびlist::cend()関数の動作について解説します。list::cbegin()とlist::cend()は、C++標準テンプレートライブラリ(STL)の一部として提供されているメンバ関数です。これらの関数を呼び出すには、ヘッダーファイル<list>をインクルードする必要があります。list::cbegin()とはlist::cbegin()は、リストの先頭要素を指す定数イテレータ(const_iterator)を返す関数です。このイテレータを使えばリストを走査することはできますが、リスト内の値を変更することはできません