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

How move map to other map

本文关键字:地图 其他 移动      更新时间:2023-10-16
std::map<long long, std::unique_ptr<A>> listOf1;
std::map<long long, std::unique_ptr<A>> listOf2;

如何将 listOf1 添加到 listOf2?可能这很棘手,因为价值是unique_ptr。诺莫尔解决方案:

listOf2.insert(listOf1.begin(), listOf1.end());

不起作用并给出错误

严重性代码说明项目文件行源抑制状态 错误 C2280 'std::p air::p air(const std::p air &(':尝试引用已删除的函数 c:\Program Files (x86(\Microsoft Visual Studio 14.0\VC\include\xmemory0 737 Build

你可能想要:

listOf2.insert(std::make_move_iterator(listOf1.begin()),
               std::make_move_iterator(listOf1.end()));
listOf1.clear();

如果您有实现 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';
}

现场演示

相关文章: