如何在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
相关产品推荐
相关产品推荐

