C++二维vector(vector of vectors)使用move语义是否合法?
关于C++二维vector移动赋值的可行性解答
明确结论
result = std::move(tmp) 是完全符合C++标准的正确操作,你可以放心使用,不会出现逻辑问题,还能大幅降低赋值环节的性能开销。
原理说明
- C++标准库的
std::vector移动赋值是常数时间操作:只会交换目标和源vector内部的三个控制字段(指向堆内存的指针、当前元素个数、容量),不会复制任何实际存储的元素,时间复杂度为O(1)。 - 二维vector
vector<vector<int>>的元素是vector<int>类型对象,但移动外层vector时,不需要操作内层vector存储的int元素,只是把外层vector持有的所有内层vector对象的所有权整体转移给目标对象,不存在逐层拷贝的逻辑。 - 移动完成后源对象
tmp会处于合法但内容未定义的可析构状态,你当前的场景中tmp在移动后马上就会结束生命周期被销毁,不会产生任何副作用。
两种方案性能对比
- 拷贝赋值
result = tmp:需要完整拷贝所有内层vector存储的int元素,时间复杂度为O(N)(N为二维vector存储的总元素个数),还会产生额外的堆内存分配、释放开销。 - 移动赋值
result = std::move(tmp):仅交换几个控制变量,无任何内存分配、元素拷贝操作,性能提升非常明显,尤其适合动态规划场景下高频迭代的使用需求。
内容的提问来源于stack exchange,提问作者jaedong
相关产品推荐
相关产品推荐

