C++遍历“高维”数组的九种方法
一般认为C++中数组只有一维,高维数组如int ia[3][4]
其实是由三个包含四个int
型元素的一维数组元素组成的,即int ia[3][4]
含有三个元素,每个元素都是一个int[4]
类型的数组。
在阅读《C++ Primer》的过程中发现了以下几种遍历“高维”数组的方法,在这里记录下来。
所遍历的二维数组初始化如下:
int ia[3][4] = {
{
0,1,2,3},
{
4,5,6,7},
{
8,9,10,11}
};//列表初始化,还有许多等价的写法
文末附有所有九种访问方式的测试代码。
1、使用范围for语句遍历数组元素
范围for语句不同于一般的for循环,代码如下:
for (int(&row)[4] : ia) //此处必须加&,因为ia存储的是一个地址
for (int col : row) cout << col << " ";
cout << endl;
2、普通for语句,下标运算符访问
for (size_t i = 0; i < 3; i++) {
for (size_t j = 0; j < 4; j++) {
cout << ia[i][j] << " ";
}
cout << endl;
}
一种常规遍历数组的方法,这里size_t
可直接视为unsigned int
,取值非负。
3、普通for语句,指针访问
for (int(*row)[4] = ia; row != ia + 3; row++)
for (int* col = *row; col != *row + 4; col++)
cout << *col << " ";
cout << endl;
这里用到的row
和col
都是指针,所以最后访问具体元素时需要用到解引用符*
,通过*col
遍历数组中的元素。
此外,迭代器的用法和这里的指针非常相似,《C++ Primer》中比较推荐C++程序员采用迭代器的方式去访问元素,因为指针若处理不好可能会有意想不到的效果。这里用row != ia + 3
作为条件而不用row <= ia + 3
作为终止条件也是一个比较有趣的地方,《C++ Primer》推荐C++程序员这样处理。
4、类型别名+范围for循环访问
using int_array = int[4];
typedef int int_array[4]; //这一句和上面一句是等价的
for (int_array& row : ia) {
//若不加&会报错:
for (int col : row) {
//这句不用加//int *" 类型的值不能用于初始化 "int_array" 类型的实体
cout << col << " ";
}
cout << endl;
}
别名的两种定义方式是一个效果(这里using的定义方式似乎是C++ 11标准的特性),这样其实我们也可以通过两者等价知道int_array
的类型是int[4]
,这里的row
本质上还是一个指针。
5、类型别名+指针访问
using int_array = int[4];
typedef int int_array[4]; //这一句和上面一句是等价的
for (int_array* p = ia; p != ia + 3