std::map<long long, std::unique_ptr<A>> listOf1;
std::map<long long, std::unique_ptr<A>> listOf2;
如何将listOf1添加到listOf2? 可能它很棘手,因为值是unique_ptr。 Normall解决方案:
listOf2.insert(listOf1.begin(), listOf1.end());
不起作用并给出错误
严重级代码说明项目文件行源抑制状态 错误C2280'std :: pair :: pair(const std :: pair&amp;)':尝试引用已删除的函数c:\ program files(x86)\ microsoft visual studio 14.0 \ vc \ include \ xmemory0 737 Build
答案 0 :(得分:12)
你可能想要:
listOf2.insert(std::make_move_iterator(listOf1.begin()),
std::make_move_iterator(listOf1.end()));
listOf1.clear();
答案 1 :(得分:2)
如果您有一个实现C ++ 17 node handle接口的标准库实现,则可以使用map::merge
函数将节点从一个map
拼接到另一个{/ p}。
通过map::insert
执行此操作的好处是,不是移动构造元素,而是通过简单地复制一些内部指针来传输节点的所有权。
#include <map>
#include <iostream>
#include <memory>
struct A
{};
int main()
{
std::map<long long, std::unique_ptr<A>> listOf1;
std::map<long long, std::unique_ptr<A>> listOf2;
listOf1[10] = std::make_unique<A>();
listOf1[20] = std::make_unique<A>();
listOf1[30] = std::make_unique<A>();
listOf2[30] = std::make_unique<A>();
listOf2[40] = std::make_unique<A>();
listOf1.merge(listOf2);
for(auto const& m : listOf1) std::cout << m.first << '\n';
}