如何在C++中动态分配二维数组

这个问题应该是我在CSDN蹭分时回答次数比较多的一个问题了,我的回答一般是三种方法:(1)用vector的vector,(2)先分配一个指针数组,然后让里面每一个指针再指向一个数组,这个做法的好处是访问数组元素时比较直观,可以用a[x][y]这样的写法,缺点是它相当于C#中的一个锯齿数组,内存空间不连续。(3)直接分配一个x*y大小的一维数组,这样保证空间是连续的,但访问数组元素不直观。对于我这个“经典”回答,我那时还一直是挺得意的,至少从蹭分的角度来看,这样回答还是很有效的。

今天在ChinaUnix论坛闲逛时看到一个贴子,再次证明了我在C++方面才疏学浅。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void **darray_new(int row, int col, int size)
{
void **arr;
arr = (void **) malloc(sizeof(void *) * row + size * row * col);
if (arr != NULL)
{
void *head;
head = (void *) arr + sizeof(void *) * row;
memset(arr, 0, sizeof(void *) * row + size * row * col);
while (row--)
arr[row] = head + size * row * col;
}
return arr;
}
void darray_free(void **arr)
{
if (arr != NULL)
free(arr);
}

嗯,连续分配内存,而且可以用a[x][y]的方式来访问!可谓二维数组动态分配的绝妙方法!这段程序是C的,似乎要改成支持对象分配的C++版也不是什么难事(不过估计得用上placement new吧,嗯,需要再思考一下……)。

如何在C++中动态分配二维数组》上有7条评论

  1. 为什么要用多维数组?

    T *arr=new T[col*rol];

    arr(col*i+j)=k //代替arr[i][j]=k,

    delete[] arr;

    定位用的乘法操作丝毫不会影响速度,因为多维数组的定位也用的这个过程。

  2. 我同意这是一种很好的做法,这也一直是我自己平时最常用的做法。
    但有些人会觉得这样写不够直观,所以想要追求一种语法上看上去比较像多维数组的写法。另外,这样做在数组维数更多的情况下,下标的转换有时比较容易写错。

  3. 封装一下,用arr(x,y,…)的形式定位更好一点,没见Matlab或者其他矩阵运算库大多用这种方式吗?更加灵活点。就是把多维映射到一维上去,定位再定位处理一下就行了。(写成[][]形式在机器内部也是要内存偏移定位的而且经过了多维指针的话,绝对没有直接运算快速。)

  4. 两个星号就是表示指向指针的指针啊.只有这样才可能用a[x][y]这样的语法去把这个指针当成一个二维数组来用.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据