Namespaces
Variants

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]

参阅

删除所有满足特定条件的元素
(函数模板)
清除内容
(公开成员函数)