You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中安全提取std::map所有元素并清空原容器?

你的C++ take函数实现完全符合标准

这段代码完全符合C++标准,运行结果会和你预期的一致:原map m 的大小会变为0,新map m2 会包含原有的所有元素。

原因如下:

  • std::move(m) 将左值引用的m转换为右值引用,触发std::map的移动构造函数来创建返回的新对象。移动构造会直接转移原容器内部的资源(比如存储节点的指针),不会复制元素,效率很高。
  • 根据C++标准,容器被移动构造后,原容器会处于有效但未指定的状态,不过所有主流编译器(GCC、Clang、MSVC)对std::map的实现都会将原容器的大小置为0,完全符合你的需求。

如果想让代码的意图更明确,也可以在移动后手动清空原容器(虽然主流实现里这一步是多余的):

Map take(Map & m) {
    Map temp = std::move(m);
    m.clear();
    return temp;
}

内容的提问来源于stack exchange,提问作者calvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:53:19