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

C++将std::stack数据移动到std::vector时如何避免拷贝?

解决方案

核心优化思路

  • 替换拷贝赋值为移动赋值:std::vector 原生支持移动语义,移动操作仅转移容器内部的内存指针,不会拷贝存储的元素,时间复杂度为O(1),可以完全避免你提到的拷贝开销。
  • 修复原代码的下标越界bug:原代码中cnt++先自增再赋值,会导致params[0]空置,且尝试访问params[3]触发越界。

修改后的完整代码

void handle(const std::vector<std::vector<std::pair<size_t, double>>> & v) {  // 数据处理函数

}

int main() {
  std::stack<std::vector<std::pair<size_t, double>>> data; // 数据存储容器,类型为stack
  int cnt = 0;
  std::vector<std::vector<std::pair<size_t, double>>> params(3);
  while (cnt < 3) {   // 假设本次处理需要3条数据
    // 用std::move将stack顶部元素转为右值,触发移动赋值
    params[cnt] = std::move(data.top());
    data.pop();
    cnt++;
  }
  handle(params);
}

注意事项

  • 移动后的data.top()元素会处于合法但未定义的状态,后续调用data.pop()释放该元素是安全的,不会出现资源泄漏。
  • 如果你需要的元素顺序和stack出栈顺序相反,只需要调整下标的赋值顺序即可,移动赋值不会影响你要求的元素顺序规则。

内容的提问来源于stack exchange,提问作者nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:54:02