有没有办法从集合中删除并将值移动到临时值?

Bon*_*ero 3 c++ std c++11

有没有办法删除集合/映射中的项目并获取前一个值作为临时返回值,以便我可以 move() 到其他地方?

Hol*_*Cat 8

是的,使用.extract().

#include <iostream>
#include <memory>
#include <set>


int main()
{
    using elem = std::unique_ptr<int>;

    std::set<elem> set;
    set.insert(std::make_unique<int>(1));
    set.insert(std::make_unique<int>(2));
    set.insert(std::make_unique<int>(3));

    // auto iter = set.find(...);
    auto iter = set.begin(); // Some iterator.

    elem x = std::move(set.extract(iter).value());

    std::cout << *x << "\n\n"; // 1
    for (const auto &it : set)
        std::cout << *it << '\n'; // 2 3
}
Run Code Online (Sandbox Code Playgroud)

我使用不可复制std::unique_ptr<int>作为元素类型来证明没有复制。