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

如何将vector<x>移动到vector<vector<x>>中以优化性能?

针对容器追加的移动优化方案

完全可以用a.push_back(std::move(v));来实现优化,这正是C++11及以后标准专为这类场景设计的最佳实践。

核心原理对比

  • 原代码a.push_back(v)会触发拷贝构造:将v的所有元素完整复制一份作为新元素加入a,原v内容保持不变。对于长容器来说,这会带来大量内存分配和元素拷贝的性能开销。
  • 而a.push_back(std::move(v))会触发移动构造:它直接转移v内部的内存指针、大小等核心数据到a的新元素中,原v会变成“空但合法”的状态(比如v.empty()返回true),完全符合你“后续不再使用v”的需求。这个过程本质只是几个指针和整数的赋值,几乎没有性能开销。

其他可选优化方式

  • 直接在a内构造元素:如果v的内容可以直接生成,完全可以跳过创建v的步骤,用emplace_back直接在a的末尾构造vector<X>,示例:
    a.emplace_back(构造参数列表);
    
    这种方式连移动步骤都能省去,直接在a的内存空间里完成新容器的构造。
  • emplace_back配合std::move:如果已经生成了v,也可以用emplace_back来移动,写法是:
    a.emplace_back(std::move(v));
    
    它和push_back(std::move(v))的效果、性能几乎一致,两者都是调用移动构造函数,选择哪种全看个人代码风格偏好。

关键注意事项

调用std::move(v)后,v的状态是有效但未定义的:标准仅保证你可以对它执行销毁、赋值、clear()这类不依赖原有状态的操作,但绝对不能再访问它原来的元素,否则会导致未定义行为。

内容的提问来源于stack exchange,提问作者Audrius Meškauskas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:10:57