std::list<T,Allocator>::erase
From cppreference.com
| (1) | ||
iterator erase( iterator pos ); |
(C++11まで) | |
| iterator erase( const_iterator pos ); |
(C++11以降) | |
| (2) | ||
iterator erase( iterator first, iterator last ); |
(C++11まで) | |
| iterator erase( const_iterator first, const_iterator last ); |
(C++11以降) | |
コンテナから指定された要素を削除します。
1) pos が指す要素を削除します。
2)
[first, last) の範囲内の要素を削除します。削除された要素への参照およびイテレータは無効になります。他の参照およびイテレータは影響を受けません。
イテレータ pos は有効で逆参照可能である必要があります。したがって、end() イテレータ(有効ですが逆参照可能ではありません)を pos の値として使用することはできません。
first == last の場合、first を逆参照する必要はありません。空の範囲の削除は何も行いません。
目次 |
[編集] パラメータ
| pos | - | 削除する要素へのイテレータ |
| first, last | - | 削除する要素の範囲を定義するイテレータのペア |
[編集] 戻り値
削除された最後の要素の次のイテレータ。
[first, last) が空の範囲の場合、last が返されます。[編集] 例外
(なし)
[編集] 計算量
1) 定数時間。
2) first と 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); // Erase all even numbers 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 |
[編集] 関連項目
| 特定の基準を満たすすべての要素を削除する (関数テンプレート) | |
| 内容をクリアする (公開メンバ関数) |