std::hive<T,Allocator>::erase
来自 zh.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]
参阅
| 删除所有满足特定条件的元素 (函数模板) | |
| 清除内容 (公开成员函数) |