多维数组
严格来说,c++语言中没有多维数组,所谓的多维数组其实是数组的数组
当一个元素的数组仍是数组时,通常使用两个维度来表示它。一个维度表示数组本身大小,另一个维度表示其元素大小
int a[4][5] ; //大小为4的数组,每个元素含有5个整数的数组
1. 多维数组的初始化
int a[2][2] = {
{1,2},
{3,4}
}
也可以写成:int a[2][2] = {1,2,3,4}; //与前面的初始化等价
但是当显示初始化不能把数组中的每个元素都初始化时,就会有问题,如下所示:
int a[2][2] = {
{1},
{3}
} //数组的每一行第一个元素被初始化
当写成int a[2][2] = {1,3};时,相当于数组的第一行两个元素被初始化
2. 多维数组的下标使用
i[1][2] = a[0][1][2]; //数组元素之间的赋值
int (&a)[2] = i[1]; //a是一个引用,该引用中含有四个int类型的数据,i[1]是一个含有四个int类型的数组
2. 范围for循环处理多维数组
for(const auto &r : i) //对于外层数组的每一个元素
for( auto c : r) //对于内层数组的每一个元素
cout<<c<<endl;
使用范围for循环处理多维数组,除了最内层的循环外,其他所有的循环控制变量都应该是引用类型
3. 指针和多维数组
多维数组实际上是数组的数组,所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针
int i[2][3]; //大小为2的数组,数组的每个元素是大小为4的数组
int (*p)[3] = i; //p指向含有三个元素的数组
p = &i[3]; //p指向i的最后一个内层数组
使用auto或者decltype尽可能避免在数组前面加上指针类型
for( auto p = i; p != i+3;++p)
for( auto q = *p; q != *p+4;++q)
cout << *q<<" ";
换成begin和end函数后,也能实现同样的功能
for( auto p = begin( i ); p != end( i );++p)
for( auto q = begin ( *p ); q != end ( *p );++q)
cout << *q<<" ";
4. 使用类型的别名简化多维数组的指针
using int_arr = int[4];
for( int_arr *p = i; p != i+3; ++p )
for( int *q = *p; q != *p + 4;++q)
cout<<*q<<" ";