为什么std :: set中的某些项目不能"弹出"?

Tho*_*eia 4 c++ stl stdset

我知道std :: set不允许非const访问它的项目.我知道项目移出集合是不可能的 - 因为任何类型的非const访问都可能破坏集合的顺序.

但是,我们可以从集合中删除项目.这不会破坏它,因为它只会强制重组.那怎么回事,我们不能'弹出'一个项目?为什么我不能拿出物品并同时擦掉它?

我问的原因是 - 我需要一个有序的unique_ptrs容器.偶尔我需要从一个容器中"弹出"unique_ptrs并将它们转移到另一个容器中.必须订购它们才是我制作的定制仿函数.

我不明白为什么不应该允许弹出功能?

Evg*_*Evg 5

要从中提取节点,std::set可以使用extract(...)C++ 17中引入的成员函数:

#include <set>
#include <iostream>

int main()
{
    std::set<int> set{1, 5, 3, 7, 2};

    std::cout << "Original set: ";
    for (auto e : set)
        std::cout << e << ' ';
    std::cout << '\n';

    auto first = set.extract(set.begin());
    std::cout << "Extracted value: " << first.value() << '\n';

    std::cout << "New set: ";
    for (auto e : set)
        std::cout << e << ' ';
    std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出:

Original set: 1 2 3 5 7
Extracted value: 1
New set: 2 3 5 7
Run Code Online (Sandbox Code Playgroud)