64.多维数组 in C++
数组就是内存块,处理内存最简单的方法是使用指针
二维数组的实质:数组的数组
三维数组的实质:数组的数组的数组
以此类推
放堆上的二维数组的创建
int main() {
//创建一个指向指针合集的指针
int **array = new int*[5]; //但到这一步,储存的实际数组其实还没有被分配
for (int i = 0; i < 5; i < 5; ++i) {
arrray[i] = new int[5];
}
//注意这里总共可以储存5*5 = 25个整数!!!!!!
//这就是二维数组的分配了,如果是三维,则以此类推
int ***a3 = new int**[5];
for (int i = 0; i < 5; ++i) {
a3[i] = new int*[5];
for (int j = 0; j < 5; ++j) {
a3[i][j] = new int[5]
}
} //储存5 * 5 * 5 = 125个整数!
//因为这里是放堆上的,所以到最后需要删除!!(通过再一次的遍历,无法一次删除三维,一次只能删一维,delete[])
}
在这个例子中堆上创建只是分配了内存空间,但是没有往里面放具体的数据!(如果有初始化,则就会同步放数据)
根据上面的第一个例子的分配25个整数,因为是在堆上分配,所以内存上不是连续的,分配时间会远大于在栈上之间建立array[25]
的时间(所以分配一阶的数组会更快)
💡故其实上面的可以这样写
int main() {
int *array = new int(25);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
array[i + j * 5] = 1;
}
}
//类似于一个伪二阶数组,j每+1,就相当于跳了5个元素
//但是这样子处理二阶数组会比纯二阶数组更快,因为它的内存都是一块的
}
这样子就不需要每次遍历完一行后要再跳到其他内存地址去遍历其他行,这里的内存上的分布本身就是一行的,利用这样操作二维数组会快很多
💡所以从理论上,是可以不用二维数组的(当然用了可读性会好一点)(Cherno的个人习惯就是不常使用二维数组)
所以为了速度,可以尽量避免使用二维数组