c++里不在‘二维数组’这种类型,二维数组会被解释为这个一维数组的元素是类型是另一种一维数组。
方法一:使用常量
如果将b声明为一个常量,如new int[a][5],它的实质和一维动态数组没有太大区别只是数组元素被声明为了int[5]。
void TestFunc_(unsigned int n)
{
unsigned int i, j;
// 元素类型为‘int[5]’的数组,可赋值给‘int[5]’类型的指针.
int (* array2D)[5] = new int[n][5];
for(i=0; i<n; ++i)
{
for(j=0; j<5; ++j)
{
array2D[i][j] = i * 5 + j;
}
}
// 回收方法和普通动态数组相同,使用'delete[]'即可
delete[] array2D;
}
这个方法需要确定b的大小。
方法二:使用指针间接引用
声明多个一维数组,然后将这些数组的首地址按顺序储存到一个动态数组中。
void TestFunc_pointer(unsigned int height, unsigned int width)
{
unsigned int i, j;
// 数组的元素类型为‘int *’,可赋值给指向‘int *’的指针.
int **array2D = new int *[height];
for(i=0; i<height; ++i)
{
array2D[i] = new int[width];
}
// 访问.
for(i=0; i<height; ++i)
{
for(j=0; j<width; ++j)
{
// 内存非连续,注意防止越界.
array2D[i][j] = i * width + j;
}
}
// 首先回收低一级的动态数组.
for(i=0; i<height; ++i)
{
delete[] array2D[i];
}
// 然后回收高一级的动态数组.
delete[] array2D;
}
这个方法实现了两个维度的动态创建,访问也比较方便。但是有一个缺点:由于低一级的数组是分开创建的,所以整个二维数组的内存不连续——类似‘array2D[i * width + j]’这样的访问就不要使用了,容易造成访问越界。
方法三:使用Vector
void TestFunc_vector(unsigned int height, unsigned int width)
{
typedef std::vector<int> IntVector;
typedef std::vector<IntVector> IntVector2D;
unsigned int i, j;
IntVector2D *pArray2D = new IntVector2D;
// 动态设置大小.
pArray2D->resize(height);
for(i=0; i<height; ++i)
{
(*pArray2D)[i].resize(width);
}
for(i=0; i<height; ++i)
{
for(j=0; j<width; ++j)
{
(*pArray2D)[i][j] = i * width + j;
}
}
delete pArray2D;
}
可以看到,在vector这个‘更高级’的数组帮助下,我们能够很轻易的创建二维数组。稍微美中不足的是由于引入了STL,程序会变得更大一些——但基本不影响运行速度。
本文介绍了在C++中创建二维动态数组的三种方法:使用常量声明、使用指针间接引用以及使用Vector。每种方法都有其特点,如常量声明需要预先确定大小,而Vector则利用STL简化了创建过程。
9204

被折叠的 条评论
为什么被折叠?



