std::inplace_vector<T,N>::erase
From cppreference.com
< cpp | container | inplace vector
| constexpr iterator erase( const_iterator pos ); |
(1) | (C++26以降) |
| constexpr iterator erase( const_iterator first, const_iterator last ); |
(2) | (C++26以降) |
コンテナから指定された要素を削除します。
1) pos が指す要素を削除します。
2)
[first, last) の範囲内の要素を削除します。削除された位置以降のイテレータ(end() イテレータを含む)および参照は無効になります。
イテレータ pos は有効で逆参照可能である必要があります。したがって、end() イテレータ(有効ですが逆参照可能ではありません)は pos の値として使用することはできません。
first == last の場合、first を逆参照する必要はありません。空の範囲の削除は何も行いません。
目次 |
[編集] パラメータ
| pos | - | 削除する要素へのイテレータ |
| first, last | - | 削除する要素の範囲を定義するイテレータのペア |
[編集] 戻り値
削除された最後の要素の次のイテレータ。
1) pos が最後の要素を指している場合、end() イテレータが返されます。
2) 削除前の last == end() の場合、更新された end() イテレータが返されます。
[first, last) が空の範囲の場合、last が返されます。[編集] 例外
T の代入演算子によって例外がスローされない限り、例外はスローされません。
[編集] 計算量
線形:`T` のデストラクタの呼び出し回数は削除された要素の数と同じであり、`T` の代入演算子は削除された要素より後のベクタ内の要素数と同じ回数呼び出されます。
[編集] 注釈
述語に基づいてコンテナ要素を削除する必要がある場合、コンテナを反復処理して単項 `erase` を呼び出す代わりに、イテレータ範囲オーバーロードが通常、std::remove() / std::remove_if() と共に使用され、残りの(削除されない)要素の移動回数を最小限に抑えます。これは erase-remove イディオムです。 std::erase_if() は erase-remove イディオムに取って代わります。
[編集] 例
このコードを実行
#include <inplace_vector> #include <print> int main() { std::inplace_vector<int, 10> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::println("{}", v); v.erase(v.begin()); std::println("{}", v); v.erase(v.begin() + 2, v.begin() + 5); std::println("{}", v); // Erase all even numbers for (std::inplace_vector<int, 10>::iterator it{v.begin()}; it != v.end();) if (*it % 2 == 0) it = v.erase(it); else ++it; std::println("{}", v); }
出力
[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]
[編集] 関連項目
| 特定の基準を満たすすべての要素を削除する (関数テンプレート) | |
| 内容をクリアする (公開メンバ関数) |