std::hive<T,Allocator>::erase
ja.cppreference.net より
iterator erase( const_iterator pos );
|
(1) | (C++26 から) |
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 | - | 削除する要素の 範囲 を定義するイテレータの組 |
戻り値
最後に削除された要素の次のイテレータ。
1)
pos が最後の要素を指す場合、end() イテレータが返されます。2) 削除前に
last == end() だった場合、更新された end() イテレータが返されます。[first, last) が空の範囲である場合、last が返されます。計算量
1) 定数時間。
2) 削除される要素の数に線形。
さらに、この関数呼び出しの結果としてアクティブなブロックが要素の空になる場合、— 要素ブロックの数に対して最悪で線形時間。
注記
コンテナ要素を述語に基づいて削除する必要がある場合、コンテナを反復して単項の erase を呼び出すのではなく、通常は std::remove()/std::remove_if() とともにイテレータ範囲のオーバーロードを使用して、残りの(削除されない)要素の移動回数を最小限に抑えます。— これが erase-remove イディオムです。
std::erase_if() は erase-remove イディオムを置き換えます。
例
このコードを実行
#include <hive>
#include <print>
int main()
{
std::hive 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]
関連項目
| 特定の条件を満たすすべての要素を削除します (関数テンプレート) | |
| 内容をクリアします (パブリックメンバ関数) |