这个问题应该是我在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吧,嗯,需要再思考一下……)。
You can try boost::multi_array for C++
http://www.boost.org/libs/multi_array/doc/user.html
为什么要用多维数组?
T *arr=new T[col*rol];
arr(col*i+j)=k //代替arr[i][j]=k,
delete[] arr;
定位用的乘法操作丝毫不会影响速度,因为多维数组的定位也用的这个过程。
我同意这是一种很好的做法,这也一直是我自己平时最常用的做法。
但有些人会觉得这样写不够直观,所以想要追求一种语法上看上去比较像多维数组的写法。另外,这样做在数组维数更多的情况下,下标的转换有时比较容易写错。
封装一下,用arr(x,y,…)的形式定位更好一点,没见Matlab或者其他矩阵运算库大多用这种方式吗?更加灵活点。就是把多维映射到一维上去,定位再定位处理一下就行了。(写成[][]形式在机器内部也是要内存偏移定位的而且经过了多维指针的话,绝对没有直接运算快速。)
两个星号是什么意思?
两个星号就是表示指向指针的指针啊.只有这样才可能用a[x][y]这样的语法去把这个指针当成一个二维数组来用.
我知道一个不错的网站,也有很多好的技术文章
http://www.itrenjia.org