C++用new创建二维数组的方法

问题来源

在C++中,数组可以被视为一种类型——但是,不存在‘二维数组’这种类型。二维数组本身会被解释成一个一维数组:这个数组的元素类型为另一种一维数组。比如int[2][3]这个二维数组,它会被编译器视作一个元素类型为‘int[3]’的一维数组。并且,‘int[3]’和'int[4]'会被当成不同的数据类型。


假设a, b为两个int型变量,如果你希望这样生成一个二维数组:new int[a][b],是不会得到编译器允许的——因为你没有指定这个数组的元素类型。由于b的大小未知,编译器无法确定‘int[b]’到底是一个什么类型。所以,要用new创建一个二维数组,这其中有讲究。


方法一:使用常量

接上:如果将b指定为一个常量,例如new int[a][5],其实质与new int[a]创建一个动态数组并无多大区别——只是元素类型由int变为了'int[5]'而已。

示例代码:

[cpp]  view plain  copy
  1. void TestFunc_(unsigned int n)  
  2. {  
  3.     unsigned int i, j;  
  4.   
  5.     // 元素类型为‘int[5]’的数组,可赋值给‘int[5]’类型的指针.  
  6.     int (* array2D)[5] = new int[n][5];  
  7.     for(i=0; i<n; ++i)  
  8.     {  
  9.         for(j=0; j<5; ++j)  
  10.         {  
  11.             array2D[i][j] = i * 5 + j;  
  12.         }  
  13.     }  
  14.   
  15.     // 回收方法和普通动态数组相同,使用'delete[]'即可  
  16.     delete[] array2D;  
  17. }  
用这个方法来创建二维数组,比较直观、易用,但它最大的限制在于:你必须在编译时确定b的大小


方法二:使用指针间接引用

首先创建若干个大小一致的动态数组,然后将这些数组的首地址(转化为指针)按顺序存储到一个动态数组中,就相当于模拟了一个二维动态数组。

示例代码:

[cpp]  view plain  copy
  1. void TestFunc_pointer(unsigned int height, unsigned int width)  
  2. {  
  3.     unsigned int i, j;  
  4.   
  5.     //  数组的元素类型为‘int *’,可赋值给指向‘int *’的指针.  
  6.     int **array2D = new int *[height];  
  7.     for(i=0; i<height; ++i)  
  8.     {  
  9.         array2D[i] = new int[width];  
  10.     }  
  11.   
  12.     // 访问.  
  13.     for(i=0; i<height; ++i)  
  14.     {  
  15.         for(j=0; j<width; ++j)  
  16.         {  
  17.             // 内存非连续,注意防止越界.  
  18.             array2D[i][j] = i * width + j;  
  19.         }  
  20.     }  
  21.   
  22.     // 首先回收低一级的动态数组.  
  23.     for(i=0; i<height; ++i)  
  24.     {  
  25.         delete[] array2D[i];  
  26.     }  
  27.     // 然后回收高一级的动态数组.  
  28.     delete[] array2D;  
  29. }  
这个方法实现了两个维度的动态创建,访问也比较方便。但是有一个缺点:由于低一级的数组是分开创建的,所以整个二维数组的内存不连续——类似‘array2D[i * width + j]’这样的访问就不要使用了,容易造成访问越界


方法三:使用vector

借助STL中的vector,我们可以很直观的创建一个二维数组,而不需要用到基本数组的概念。

示例代码:

[cpp]  view plain  copy
  1. void TestFunc_vector(unsigned int height, unsigned int width)  
  2. {  
  3.     typedef std::vector<int>  IntVector;  
  4.     typedef std::vector<IntVector>    IntVector2D;  
  5.     unsigned int i, j;  
  6.   
  7.     IntVector2D *pArray2D = new IntVector2D;  
  8.   
  9.     // 动态设置大小.  
  10.     pArray2D->resize(height);  
  11.     for(i=0; i<height; ++i)  
  12.     {  
  13.         (*pArray2D)[i].resize(width);  
  14.     }  
  15.   
  16.     for(i=0; i<height; ++i)  
  17.     {  
  18.         for(j=0; j<width; ++j)  
  19.         {  
  20.             (*pArray2D)[i][j] = i * width + j;  
  21.         }  
  22.     }  
  23.   
  24.     delete pArray2D;  
  25. }  
可以看到,在vector这个‘更高级’的数组帮助下,我们能够很轻易的创建二维数组。稍微美中不足的是由于引入了STL,程序会变得更大一些——但基本不影响运行速度。


==========================End============================

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值