C++中的多维数组并没有Java安全,也没它方便,依旧是C的遗风,快速但不安全,当然,可以使用STL的Vector来解决,但是在玩算法的时候这个就行不通了,成本太高,对于简单的代码片段而言,你不需要它的大多数特性。本人觉得,使用C风格的数组还是很有必要的,当然这个不太容易驾驭。
这篇博文假设你已经了解并熟悉了C++的一维数组,以及动态分配。
一维静态数组形式如下:
type name[const];
这只是一个声明式,并未初始化,也就是说数组各元素的值是不明确的,具体视编译器而言,在G++中默认为0,如果你想让你的代码具有可移植性,请不要利用这种默认值。
type name[size];
不要奇怪,这在g++中是可以通过的,因为它是变长数组,但是vc6.0不可能通过编译的。
一维动态分配数组形式:
type* pStr = new type[size];
对于一维数组而言,这些相当简单,但是针对多维数组呢?
int** pNumArr = new int[n][6];//很好,出错了
为什么会出错呢?类型转换出错了,我们不能把int (*)[6]转换成int**,这个很明显,不是吗?
正确形式应该是这样的:
int (*pNumArr)[6] = new int[n][6];
是不是很恶心,我也这么认为。并且它的局限很大,你只能设置第二维,第一维依旧是const,也就是说无论是二维还是多维数组,采用这种形式,我们只能动态定义其最高维度,其它维度必须是const,没有意义啊。
对此我们有如下解决方案:
上图是我们的解决方案的原理示意图。
其实这个很简单
int** pNumArr = new int*[n];for(unsigned i = 0; i
然后就是赋值了,对,就是用你最熟悉的双重循环,这个就不一一详述了。
但是,这个完了吗?
答案是肯定的,远远没有完,因为我们做了件相当过分的危险的事情,大量的使用new。你可能会使用如下代码,并鄙视我说这个很简单啊。
delete [] pNumArr;
这个就是你的噩梦的开端,看看你造成了多少的内存泄漏。什么,无所谓?如果是n为上百万上千万时呢?
for(unsigned i=0; i
至此也许你可以松一口气了,但是很遗憾的告诉你,这件事还没完。绝对不要忘了做下面这件事避免你的指针虚吊!
pNumArr = 0;
至此,你可以放心的喝一口茶了。