std::deque<T,Allocator>::erase
| (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以降) | |
コンテナから指定された要素を削除します。
[first, last) の範囲内の要素を削除します。削除される要素がコンテナの末尾または先頭にない限り、すべてのイテレータと参照が無効になります。ただし、削除される要素がコンテナの末尾または先頭にある場合は、削除された要素へのイテレータと参照のみが無効になります。end() イテレータも、削除される要素がコンテナの先頭にあり、最後の要素が削除されない限り無効になります。
イテレータ pos は有効であり、逆参照可能である必要があります。したがって、end() イテレータ(有効ですが、逆参照可能ではありません)は、pos の値として使用することはできません。
first == last の場合、first を逆参照する必要はありません。空の範囲の削除は何も行いません。
目次 |
[編集] パラメータ
| pos | - | 削除する要素へのイテレータ |
| first, last | - | 削除する要素の範囲を定義するイテレータのペア |
| 型要件 | ||
-T は MoveAssignable の要件を満たす必要があります。 | ||
[編集] 戻り値
削除された最後の要素の次のイテレータ。
[first, last) が空の範囲の場合、last が返されます。[編集] 例外
T の代入演算子によって例外がスローされない限り、例外はスローされません。
[編集] 計算量
線形: `T` のデストラクタの呼び出し回数は削除された要素の数と同じであり、`T` の代入演算子の呼び出し回数は、削除される要素の前の要素数と削除される要素の後の要素数のうち、小さい方の数以下になります。
[編集] 注釈
述語に基づいてコンテナ要素を削除する必要がある場合、コンテナを反復処理して単項 `erase` を呼び出すのではなく、イテレータ範囲オーバーロードが一般的に std::remove()/std::remove_if() と共に使用され、残りの(削除されない)要素の移動回数を最小限に抑えます。これはイレイズ・リムーブ・イディオムです。std::erase_if() はイレイズ・リムーブ・イディオムに取って代わります。(C++20以降)
[編集] 例
#include <deque> #include <iostream> void print_container(const std::deque<int>& c) { for (int i : c) std::cout << i << ' '; std::cout << '\n'; } int main() { std::deque<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; print_container(c); c.erase(c.begin()); print_container(c); c.erase(c.begin() + 2, c.begin() + 5); print_container(c); // Erase all even numbers for (std::deque<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 は逆参照可能であることが要求されていましたが、 空の `deque` をクリアする動作が未定義になった |
不要な場合 first == last |
| LWG 638 | C++98 | 終端を超えるイテレータが無効になっていなかった | 要素が次の状態の場合に無効になる 中間または末尾から削除される |
[編集] 関連項目
| 特定の基準を満たすすべての要素を削除する (関数テンプレート) | |
| 内容をクリアする (公開メンバ関数) |