std::inplace_vector<T,N>::erase
ja.cppreference.net より
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 は、逆参照可能である必要はありません。もし first == last: 空の範囲を削除することは何も行いません。
パラメータ
| pos | - | 削除する要素へのイテレータ |
| first, last | - | 削除する要素の範囲を定義するイテレータのペア range |
| 型要件 | ||
-
T
が
MoveAssignable
でない場合、動作は未定義です。
|
||
戻り値
削除された最後の要素に続くイテレータ。
1)
pos
が最後の要素を参照している場合、
end()
イテレータが返されます。
2)
削除前に
last
==
end
(
)
であった場合、更新された
end()
イテレータが返されます。
もし
[
first
,
last
)
が空の範囲であれば、
last
が返されます。
例外
Tの代入演算子によって例外がスローされない限り、例外をスローしません。
計算量
Linear: 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, 26> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::println("{}", v);
v.erase(v.begin());
std::println("{}", v);
v.erase(std::next(v.begin(), 2), std::next(v.begin(), 5));
std::println("{}", v);
// Erase all even numbers
for (auto 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]
関連項目
|
特定の条件を満たすすべての要素を削除する
(関数テンプレート) |
|
|
内容をクリアする
(公開メンバ関数) |