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)
我对这两个案例感到困惑。它们完全一样吗?
不,它们不一样。
map情况1一次性移动了整体的内容。的map内部指针被“移动”到-映射中的mp2任何指针都不会受到影响。pairpair在地图中的位置一一移动。请注意,map Key无法const移动,但会被复制。mp仍将包含与以前一样多的元素 - 但值处于不确定状态。它们完全一样吗?
不,他们不是!
第一个调用第四个的移动构造函数,移动操作将在类/数据结构级别完成。std::map
[...]
- 移动构造函数。在容器移动构造 (
overload (4)) 之后,对 other 的引用、指针和迭代器(结束迭代器除外)仍然有效,但引用现在位于 中的元素*this。当前标准通过container.requirements.general中的总括声明做出此保证,并且正在通过LWG 2321考虑更直接的保证
复杂
4)恒定。如果给定 alloc 和
alloc != other.get_allocator(),则为线性。
第二个std::move来自<algorithm>header,它按元素(即键值对)移动到另一个映射。
- 将范围 中的元素移动
[first, last)到从 开始的另一个范围d_first,从第一个开始一直到最后一个 - 1。执行此操作后,移出范围中的元素仍将包含适当类型的有效值,但不一定是相同的值和搬家之前一样。
复杂
准确
last - first移动作业。
| 归档时间: |
|
| 查看次数: |
408 次 |
| 最近记录: |