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
相关产品推荐
相关产品推荐

