std::inplace_vector<T,N>::erase
来自 zh.cppreference.net
constexpr iterator erase( const_iterator pos );
|
(自 C++26 起) | (2) |
constexpr iterator erase( const_iterator first, const_iterator last );
|
(自 C++26 起) | 从容器中擦除指定的元素。 |
1)
移除位于 的元素。
pos2) 移除范围 中的元素。
[first, last)迭代器(包括 迭代器)和指向擦除点或之后元素的引用均失效。
end()迭代器
必须有效且可解引用。因此 posend() 迭代器(有效但不可解引用)不能用作 的值。
pos迭代器
无需可解引用,若 firstfirst==lastfirst == last:擦除空范围是空操作。
参数
| pos | - | 指向待移除元素的迭代器 |
| first, last | - | 定义待移除元素范围的迭代器对 |
| 类型要求 | ||
-
T
不满足
MoveAssignable
要求,则行为未定义。
|
||
返回值
指向最后一个被移除元素之后的迭代器。
1)
如果
pos
指向最后一个元素,则返回
end()
迭代器。
2)
若移除前
last
==
end
(
)
,则返回更新后的
end()
迭代器。
如果
[
first
,
last
)
是空范围,则返回
last
。
异常处理
除非
T
的赋值运算符抛出异常,否则不会抛出异常。
复杂度
线性:调用
T
析构函数的次数与被擦除元素数量相同,调用
T
赋值运算符的次数等于擦除元素后向量中剩余元素的数量。
注解
当需要根据谓词擦除容器元素时,与其迭代容器并调用一元erase,通常使用迭代器范围重载与std::remove()/std::remove_if()一起,以最小化剩余(未删除)元素的移动次数,—这就是擦除-删除惯用法。
std::erase_if()取代了擦除-删除惯用法。
示例
运行此代码
#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]
参见
|
擦除满足特定条件的所有元素
(函数模板) |
|
|
清空内容
(公开成员函数) |