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

21k*_*zyd 4 c++ algorithm c++11

std::map<long long, std::unique_ptr<A>> listOf1;
std::map<long long, std::unique_ptr<A>> listOf2;
Run Code Online (Sandbox Code Playgroud)

如何将listOf1添加到listOf2?可能它很棘手,因为值是unique_ptr.Normall解决方案:

listOf2.insert(listOf1.begin(), listOf1.end());
Run Code Online (Sandbox Code Playgroud)

不起作用并给出错误

严重级代码描述项目文件行源抑制状态错误C2280'std :: pair :: pair(const std :: pair&)':尝试引用已删除的函数c:\ program files(x86)\ microsoft visual studio 14.0\vc\include\xmemory0 737 Build

Jar*_*d42 12

你可能想要:

listOf2.insert(std::make_move_iterator(listOf1.begin()),
               std::make_move_iterator(listOf1.end()));
listOf1.clear();
Run Code Online (Sandbox Code Playgroud)


Pra*_*ian 5

如果您有一个实现 C++17节点句柄接口的标准库实现,则可以使用该map::merge函数将节点从一个节点拼接map到另一个节点。

这样做的好处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';
}
Run Code Online (Sandbox Code Playgroud)

现场演示