std::list<T,Allocator>:: erase
| (1) | ||
|
iterator erase
(
iterator pos
)
;
|
(C++11まで) | |
|
iterator erase
(
const_iterator pos
)
;
|
(C++11以降)
(constexprはC++26以降) |
|
| (2) | ||
|
iterator erase
(
iterator first, iterator last
)
;
|
(C++11まで) | |
|
iterator erase
(
const_iterator first, const_iterator last
)
;
|
(C++11以降)
(constexprはC++26以降) |
|
コンテナから指定された要素を削除します。
[
first
,
last
)
。
削除された要素への参照とイテレータは無効化されます。その他の参照とイテレータには影響しません。
イテレータ pos は有効かつデリファレンス可能でなければなりません。したがって、 end() イテレータ(有効ではありますが、デリファレンス可能ではありません)は pos の値として使用できません。
イテレータ first は、もし first == last の場合、デリファレンス可能である必要はありません:空の範囲の削除は何も行わない操作です。
目次 |
パラメータ
| pos | - | 削除する要素へのイテレータ |
| first, last | - | 削除する要素の範囲を定義するイテレータのペア range |
戻り値
削除された最後の要素に続くイテレータ。
[
first
,
last
)
が空の範囲であれば、
last
が返されます。
計算量
注記
コンテナ要素を述語に基づいて削除する必要がある場合、コンテナを反復処理して単項
erase
を呼び出すのではなく、残りの(削除されない)要素の移動回数を最小限に抑えるために、イテレータ範囲オーバーロードが一般的に
std::remove()/std::remove_if()
と共に使用されます — これがerase-removeイディオムです。
std::erase_if()
はerase-removeイディオムを置き換えます。
(C++20以降)
例
#include <list> #include <iostream> #include <iterator> void print_container(const std::list<int>& c) { for (int i : c) std::cout << i << ' '; std::cout << '\n'; } int main() { std::list<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; print_container(c); c.erase(c.begin()); print_container(c); std::list<int>::iterator range_begin = c.begin(); std::list<int>::iterator range_end = c.begin(); std::advance(range_begin, 2); std::advance(range_end, 5); c.erase(range_begin, range_end); print_container(c); // すべての偶数を削除 for (std::list<int>::iterator it = c.begin(); it != c.end();) { if (*it % 2 == 0) it = c.erase(it); else ++it; } print_container(c); }
出力:
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 6 7 8 9 1 7 9
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 151 | C++98 |
first
がデリファレンス可能であることが要求されていたため、
空の
list
をクリアする動作が未定義となっていた
|
以下の場合には要求されない:
first == last |
関連項目
|
特定の条件を満たすすべての要素を削除する
(関数テンプレート) |
|
|
内容をクリアする
(公開メンバ関数) |