将unique_ptr从一个集合移到另一个集合

use*_*904 5 c++ stl c++11

我似乎无法弄清楚,并尝试了以下建议:

在集合之间移动`unique_ptr`

如何将std :: unique_ptr <>从一个STL容器移动到另一个?

我有两个包含唯一指针的集合:

std::set<std::unique_ptr<some_type>> s1, s2;
Run Code Online (Sandbox Code Playgroud)

指针当然是唯一的,但是some_type的值可以是也可以不是,因此,在将s2连接到s1之后,s1的大小可以等于或等于| s1 + s2 |。

看来我应该能够做到这一点:

move(s2.begin(), s2.end(), inserter(s1, s1.end()));
Run Code Online (Sandbox Code Playgroud)

但这在clang ++ 3.8 / g ++ 5.4中失败。

这里缺少什么?

Bri*_*ian 4

它不起作用,因为 astd::set只能const访问其元素。没有办法将某些东西移出std::set. 请参阅是否可以将项目移出 std::set?

在 C++14 中没有好的方法可以做到这一点,但在 C++17 中为此merge提供了一种方法,它只是重新排列数据结构的内部指针,而不复制或移动任何元素:

s1.merge(s2);
Run Code Online (Sandbox Code Playgroud)

C++14 中一个比较合理的解决方法是更改std::set<std::unique_ptr<T>>​​为std::map<T*, std::unique_ptr<T>>. 然后你可以这样做:

while (!s1.empty()) {
    s2[s1.begin()->first] = std::move(s1.begin()->second);
    s1.erase(s1.begin());
}
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以使用“shared_ptr”而不是“unique_ptr”。 (2认同)