std::vector<T,Allocator>::erase
From cppreference.com
| (1) | ||
iterator erase( iterator pos ); |
(C++11まで) | |
| iterator erase( const_iterator pos ); |
(C++11以降) (C++20 以降 constexpr) |
|
| (2) | ||
iterator erase( iterator first, iterator last ); |
(C++11まで) | |
| iterator erase( const_iterator first, const_iterator last ); |
(C++11以降) (C++20 以降 constexpr) |
|
コンテナから指定された要素を削除します。
1) pos が指す要素を削除します。
2)
[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() と組み合わせて使用することが、残りの(削除されない)要素の移動回数を最小限に抑えるために一般的に推奨されます。これはイレーズ・リ moved ムーブ・イディオムです。 std::erase_if() はイレーズ・リ moved ムーブ・イディオムに取って代わります。(C++20 以降)
[編集] 例
このコードを実行
#include <vector> #include <iostream> void print_container(const std::vector<int>& c) { for (int i : c) std::cout << i << ' '; std::cout << '\n'; } int main() { std::vector<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::vector<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 は逆参照可能であることが要求されていましたが、 空の `vector` をクリアする動作が未定義になった |
不要な場合 first == last |
| LWG 414 | C++98 | 削除位置のイテレータが無効にされていなかった | それらも無効になります |
[編集] 関連項目
| 特定の基準を満たすすべての要素を削除する (関数テンプレート) | |
| 内容をクリアする (公開メンバ関数) |