C++ STL list::erase() 関数の完全ガイド
この記事では、C++ STL の list::erase() 関数の動作、構文、使用例について解説します。
STL における List とは
std::list は、シーケンスの任意の位置への要素の挿入と削除を定数時間で行えるデータ構造です。内部的には 双方向連結リスト として実装されており、メモリ上では非連続な領域に要素が配置されます。
配列、vector、deque と比較して、任意の位置への挿入・削除・要素の移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅く、イテレータを用いた順次アクセスが基本となります。forward_list(単方向連結リスト)と似ていますが、list は双方向へのイテレーションが可能です。
list::erase() とは
list::erase() は <list> ヘッダで宣言される C++ STL の組み込み関数です。この関数はリストコンテナから要素を削除するために使用します。単一の要素を削除することも、要素の範囲を指定してまとめて削除することも可能です。削除後、リストのサイズは削除された要素の数だけ減少します。
構文
// 単一要素の削除
list_container.erase(position);
// 範囲指定による削除
list_container.erase(start_position, end_position);
この関数は1つまたは2つのパラメータを受け取ります。
パラメータ
- position — 削除したい要素を指すイテレータ。
- start_position, end_position — 削除したい要素の範囲を指定するイテレータのペア。
[start_position, end_position)の半開区間(開始位置を含み、終了位置を含まない)が削除対象となります。
戻り値
最後に削除された要素の 次の要素を指すイテレータ を返します。削除範囲がリストの末尾まで及ぶ場合は end() を返します。この戻り値を利用すると、イテレータを無効化せずにループ内で安全に要素を削除しながらイテレートを継続できます。
使用例 1:単一要素の削除
先頭要素を指すイテレータを取得し、それを erase() に渡して削除します。
#include <bits/stdc++.h>
using namespace std;
int main() {
// リストの作成と要素の追加
list<int> myList;
myList.push_back(2);
myList.push_back(4);
myList.push_back(6);
myList.push_back(8);
myList.push_back(10);
cout << "削除前のリスト: ";
for (auto it = myList.begin(); it != myList.end(); ++it) {
cout << *it << " ";
}
// 先頭要素を指すイテレータを取得して削除
auto it = myList.begin();
myList.erase(it);
// 削除後のリスト表示
cout << "\n削除後のリスト: ";
for (auto it = myList.begin(); it != myList.end(); ++it) {
cout << *it << " ";
}
return 0;
}
出力結果
削除前のリスト: 2 4 6 8 10
削除後のリスト: 4 6 8 10
使用例 2:範囲指定による複数要素の削除
2つのイテレータで範囲を指定し、その範囲内の要素をまとめて削除します。advance() を用いてイテレータを進める方法を示します。
#include <bits/stdc++.h>
using namespace std;
int main() {
list<int> myList;
myList.push_back(2);
myList.push_back(4);
myList.push_back(6);
myList.push_back(8);
myList.push_back(10);
cout << "削除前のリスト: ";
for (auto it = myList.begin(); it != myList.end(); ++it) {
cout << *it << " ";
}
// 範囲の開始と終了を指すイテレータ
auto it_start = myList.begin();
auto it_end = myList.begin();
advance(it_end, 4); // イテレータを4つ進める(インデックス 0〜3 の要素が範囲内)
// 範囲 [it_start, it_end) の要素を削除
myList.erase(it_start, it_end);
cout << "\n削除後のリスト: ";
for (auto it = myList.begin(); it != myList.end(); ++it) {
cout << *it << " ";
}
return 0;
}
出力結果
削除前のリスト: 2 4 6 8 10
削除後のリスト: 10
補足:イテレータの無効化と安全なループ処理
list::erase() は削除された要素を指すイテレータのみを無効化し、他の要素を指すイテレータは有効なままです。この性質を活かし、以下のようにループ内で条件に合う要素を安全に削除できます。
for (auto it = myList.begin(); it != myList.end(); ) {
if (*it % 2 == 0) { // 偶数なら削除
it = myList.erase(it); // 戻り値で次の要素へ進める
} else {
++it;
}
}
このパターンは list だけでなく、他の多くのシーケンスコンテナでも共通して使える重要なイディオムです。
-
C++ STLのlist::reverse()関数の使い方と実例解説
本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar
-
C++STLのlist back()関数の使い方を解説
C++のlist back()関数とは本記事では、C++におけるlist back()関数の動作について詳しく解説します。list::back()関数は、C++標準テンプレートライブラリ(STL)の一部であり、リストの最後(末尾)の要素を取得・表示するために使用されます。この関数を呼び出す前に、必ず<list>ヘッダーファイルをインクルードする必要がある点に注意してください。構文List_Name.back();パラメータこの関数は、いかなるパラメータも受け取りません。戻り値この関数は、リストの最後の要素の値を返します。なお、リストが空の場合の動作は未定義となるため、呼び出し前にリ