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

C++:已知栈上创建二维vector的方法,如何在堆上实现?

在堆上创建二维vector的正确方式

你给出的代码是错误的,new操作符返回的是指向对象的指针,而vector<vector<int>> dp(...)声明的是栈上的对象,两者类型不匹配,不能直接赋值。下面是两种正确的堆上创建方式:

方式一:使用原始指针

直接用指针接收new创建的vector对象:

vector<vector<int>>* dp = new vector<vector<int>>(10, vector<int>(10, 0));

使用时需要通过解引用访问元素:

// 访问第i行第j列的元素
(*dp)[i][j] = 1;
// 或者用at()做边界检查
dp->at(i).at(j) = 2;

注意:这种方式需要手动释放内存,避免泄漏:

delete dp;

方式二:使用智能指针(推荐)

C++11及以后推荐用智能指针自动管理内存,无需手动执行delete:

#include <memory>

// unique_ptr:独占对象所有权
auto dp = std::make_unique<vector<vector<int>>>(10, vector<int>(10, 0));
// 或者用shared_ptr:支持多个指针共享对象所有权
auto dp = std::make_shared<vector<vector<int>>>(10, vector<int>(10, 0));

访问元素的方式和原始指针一致:

(*dp)[i][j] = 3;
dp->at(i).at(j) = 4;

额外说明

其实vector容器管理的元素本身就存储在堆上——哪怕你在栈上声明vector<vector<int>> dp(10, vector<int>(10,0)),dp这个容器对象在栈上,但它内部的所有int元素都存放在堆上。只有当你需要让vector容器对象本身位于堆上(比如需要它脱离当前作用域后仍存在,或者动态控制其生命周期)时,才需要使用上面的堆创建方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:45:06