二维数组new小结 转自水木清华
1. A (*ga)[n] = new A[m][n]; ... delete []ga;缺点:n必须是已知优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)2. A** ga = new A*[m]; for(int i = 0; i < m; i++) ga[i] = new A[n]; ... for(int i = 0; i < m; i++) delete []ga[i]; delete []ga;缺点:非连续储存,程序烦琐,ga为A**类型优点:调用直观,n可以不是已知3. A* ga = new A[m*n]; ... delete []ga;缺点:调用不够直观优点:连续储存,n可以不是已知4. vector<vector<A> > ga; ga.resize(m); //这三行可用可不用 for(int i = 1; i < n; i++) // ga[i].resize(n); // ...缺点:非连续储存,调试不够方便,编译速度下降,程序膨胀(实际速度差别不大)优点:调用直观,自动析构与释放内存,可以调用stl相关函数,动态增长5. vector<A> ga; ga.resize(m*n);方法3,4的结合6. 2的改进版(Penrose提供,在此感谢) A** ga = new A*[m]; ga[0] = new A[m*n]; for(int i = 1; i < m; i++) ga[i] = ga[i-1]+n; ... delete [] ga[0]; delete [] ga;缺点:程序烦琐,ga为A**类型优点:连续储存,调用直观,n可以不是已知附:1,2,3,6还有对应的malloc-free版本个人推荐1和4,2可以用4来代替,3,5调用太烦琐,毕竟源程序是拿来看的不是拿来运行的下面是一些错误和没成功的版本1. A* ga = new A[m][n]; 必然错误2. vector<A[n]> ga; ga.resize(m); gcc 3.2下编译失败,不知道其它编译器效果如何 也不知道标准是否允许
函数参数也可以是二维及及更高维数组。但必须指定除最高维以后的各维大小。这一点和初始化时,可以省略不写最高维大小的规则一致:
//定义一个使用二维数组作为参数
void Func(int arr[][5]) //第二维的大小可以不指定
{
...
}
//定义一个使用三维数组作为参数
void Func(int arr[][2][5]) //第三维的大小可以不指定
{
...
}
