C++中如何实现运行时确定大小的多维数组并保留多下标语法?
C++动态多维数组的实现思路
在C++里声明静态大小的多维数组真的超简单,这些数组会以连续内存块的形式存储(采用行优先布局)。但如果要搞那种大小得等到运行时才能确定的动态多维数组,可就没那么轻松了——这也是很多开发者头疼的点。
要是你想保留多维数组原生的多下标语法(比如二维数组的[][]形式),最常见的做法是创建一个指针数组:
- 首先分配一个指针数组,每个指针对应数组的一行;
- 然后为每个指针单独分配对应行的内存空间。
给你举个二维数组的实际代码例子:
// 假设运行时通过逻辑获取行数和列数 int rows = 10; int cols = 20; // 第一步:创建存储行指针的数组 int** dynamic_arr = new int*[rows]; // 第二步:为每一行分配具体的内存 for (int i = 0; i < rows; ++i) { dynamic_arr[i] = new int[cols]; } // 像普通二维数组一样使用 dynamic_arr[3][5] = 42; // 注意:释放内存要先释放每行,再释放指针数组 for (int i = 0; i < rows; ++i) { delete[] dynamic_arr[i]; } delete[] dynamic_arr;
不过这种方式有个小缺点:每一行的内存不一定是连续的,要是你需要整个多维数组在内存里连续,那可以用一维数组模拟的方式,自己计算下标:
int rows = 10; int cols = 20; // 直接分配一块连续的内存,大小是行数×列数 int* continuous_arr = new int[rows * cols]; // 原本的arr[i][j]等价于continuous_arr[i * cols + j] continuous_arr[3 * cols + 5] = 42; // 释放内存就简单多了,直接delete[]就行 delete[] continuous_arr;
如果是用现代C++的话,更推荐用标准容器来实现,比如std::vector嵌套,不仅不用手动管理内存,还能保留[][]的访问语法:
#include <vector> int rows = 10; int cols = 20; // 直接初始化一个rows行、cols列的二维vector std::vector<std::vector<int>> vec_arr(rows, std::vector<int>(cols)); // 直接像普通数组一样访问赋值 vec_arr[3][5] = 42;
内容的提问来源于stack exchange,提问作者Šimon Hrabec
相关产品推荐
相关产品推荐

