移动 std::map 与移动 std::map 的所有元素

Yve*_*ves 5 c++ move stdmap std c++11

std::map<int, Obj> mp;
// insert elements into mp

// case 1
std::map<int, Obj> mp2;
mp2 = std::move(mp);

// case 2
std::map<int, Obj> mp3;
std::move(std::begin(mp), std::end(mp), std::inserter(mp3, std::end(mp3));
Run Code Online (Sandbox Code Playgroud)

我对这两个案例感到困惑。它们完全一样吗?

Ted*_*gmo 5

不,它们不一样。

  • map情况1一次性移动了整体的内容。的map内部指针被“移动”到-映射中的mp2任何指针都不会受到影响。pair
  • 情况 2 将个人pair在地图中的位置一一移动。请注意,map Key无法const移动,但会被复制。mp仍将包含与以前一样多的元素 - 但值处于不确定状态。


JeJ*_*eJo 5

它们完全一样吗?

,他们不是!

第一个调用第四个的移动构造函数,移动操作将在类/数据结构级别完成。std::map

[...]

  1. 移动构造函数。在容器移动构造 ( overload (4)) 之后,对 other 的引用、指针和迭代器(结束迭代器除外)仍然有效,但引用现在位于 中的元素*this。当前标准通过container.requirements.general中的总括声明做出此保证,并且正在通过LWG 2321考虑更直接的保证

复杂

4恒定。如果给定 alloc 和alloc != other.get_allocator(),则为线性。


第二个std::move来自<algorithm>header,它按元素(即键值对)移动到另一个映射。

  1. 将范围 中的元素移动[first, last)到从 开始的另一个范围d_first,从第一个开始一直到最后一个 - 1。执行此操作后,移出范围中的元素仍将包含适当类型的有效值,但不一定是相同的值和搬家之前一样。

复杂

准确last - first移动作业。