如何将地图移动到其他地图

时间:2017-04-14 21:48:15

标签: c++ algorithm c++11

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

2 个答案:

答案 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';
}

Live demo