gpt4 book ai didi

c++ - 我可以将 std::map 的内容 move 分配到另一个 std::map 吗?

转载 作者:IT老高 更新时间:2023-10-28 21:34:50 33 4
gpt4 key购买 nike

是否可以通过使用 move 语义将临时 std::map temp 的内容插入到另一个 std::map m 中,这样来自临时不被复制并被重复使用?

假设有:

std::map<int, Data> temp;
std::map<int, Data> m;

将值从 temp 复制到 m 的一种方法是:

m.insert(temp.begin(),temp.end());

我如何 move temp 元素到m,而不是复制?

最佳答案

提示: 先阅读更新!

当前的 C++11 标准和 C++14 草案没有提供成员函数来启用此功能。正如 lavr 建议的那样,您仍然可以编写

m.insert(make_move_iterator(begin(temp)),
make_move_iterator(end (temp)));

这会将 从源容器 move 到目标容器。但是,容器节点和键都不会被 move 。这需要内存分配(至少用于在目标映射中创建新节点)。源容器中的元素数量将保持不变。复制背后的原因很简单:std::map 的值类型是 std::pair<const Key,T> .并从 const Key本质上是在复制 key (除非有人重载了 Key 构造函数,它采用了 const Key && ,对此我想不出足够的理由)。

如果您需要将数据从一个容器 move 到另一个容器,您可以考虑使用 std::list而不是 std::map .它有一个 member function splice 它以恒定的时间将元素从一个列表 move 到另一个列表。

更新:

从 C++17 开始有函数 std::map::merge() 它基本上把一个 std::map 的所有元素进入另一个 std::map无需 move 或复制实际元素,而是仅通过重新指向内部指针。它与 std::list::splice() 非常相似自 C++98 以来就存在。

所以你可以写

m.merge( temp );

实现你的目标。这比将所有元素从一个容器复制或 move 到另一个容器更有效。

但要小心!冲突的键不会被解决:对于重合的键,什么都不会做。

关于c++ - 我可以将 std::map 的内容 move 分配到另一个 std::map 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21724864/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com