是的,使用.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>作为元素类型来证明没有复制。