如何调整C++中vector<int> v[N]大小及两种vector声明方式的性能差异
vector<int> v[N] 调整大小实现方案 首先明确:vector<int> v[N] 本质是元素类型为vector<int>的固定长度原生数组,长度N必须为编译期常量,原生数组本身不支持运行时动态修改长度。如果需要调整为M的长度,可采用以下两种方案:
- 方案1(推荐):使用智能指针包裹动态数组,完全兼容原有语法,无需手动管理内存
// 原固定长度声明(仅支持编译期常量N) // const int N = 10; // vector<int> v[N]; // 改为动态长度版本,支持运行时指定/调整长度为M int M = 20; auto v = std::make_unique<std::vector<int>[]>(M); // 后续调整为new_M的长度示例 int new_M = 30; v.reset(new std::vector<int>[new_M]);
修改后原有v[i].push_back(xxx)、v[i][j]等操作逻辑完全不变。
- 方案2:手动管理动态数组,实现成本高,容易出现内存泄漏,非必要不推荐
int M = 20; std::vector<int>* v = new std::vector<int>[M]; // 调整为new_M的长度示例(如果需要保留原有数据需手动迁移) int new_M = 30; delete[] v; v = new std::vector<int>[new_M]; // 程序退出前必须执行delete[] v,否则会出现内存泄漏
两种二维向量声明的性能差异
声明过程差异
vector<int> v[N]:局部作用域下分配在栈空间,分配速度极快,仅需移动栈指针即可完成;全局作用域下分配在静态存储区,编译期就确定了内存地址。缺点是长度固定不可动态调整,局部声明时如果N过大很容易触发栈溢出。vector<vector<int>> v(N):外层vector的数组内存分配在堆空间,分配速度比栈分配稍慢,但长度支持运行时动态指定,不存在栈溢出风险,扩容时标准库会自动处理已有数据的迁移。
后续操作差异
- 元素访问、内层vector操作性能:两者完全一致,内层都是标准
vector<int>类型,增删元素、随机访问的逻辑和性能没有任何区别,CPU缓存友好度也相同。 - 外层扩容性能:
vector<vector<int>>的扩容逻辑经过标准库优化,会自动申请倍数扩容的空间、移动已有元素,性能远高于手动实现的动态数组扩容逻辑;而vector<int>[]的动态版本如果需要保留已有数据,需要手动实现元素迁移,实现成本高、出错概率大,性能也通常更低。
内容的提问来源于stack exchange,提问作者Milanor
相关产品推荐
相关产品推荐

