C++/Qt遍历多维数组的3种方式示例

 

一、什么是多维数组

想要遍历多维数组,就得知道什么是多维数组。

严格来说,C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。谨记这一点,对今后理解和使用多维数组大有益处。

当一个数组的元素仍然是数组时,通常使用两个维度来定义它:一个维度表示数组本身大小,另外一个维度表示其元素(也是数组)大小:

int ia[3][4]; // 大小为3的数组,每个元素是含有4个int的数组
// 大小为10的数组,它的每个元素都是大小为20的数组
// 这些数组的元素是含有30个double的数组
double db[10][20][30] = {0}; // 将所有元素初始化为0

 

二、遍历多维数组

先来定义一个多维数组:

// dobuleArrMulti是个大小为2的数组,它的每个元素都是大小为3的数组
// 这些数组的元素是含有4个double的数组
double doubleArrMulti[2][3][4] = {
      {
          {0,1,2,3},
          {4,5,6,7},
          {8,9,10,11}
      },
      {
          {12,13,14,15},
          {16,17,18,19},
          {20,21,22,23}
      }
  };

2.1 使用范围for语句处理多维数组

要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型:

// 使用范围for语句处理多维数组
for(auto &arr : doubleArrMulti) // 对于最外层数组的每一个元素
  for(auto &arow : arr)	    // 对于次外层数组的每一个元素
      for(auto acol : arow)  // 对于内层数组的每一个元素
          qDebug() << "范围for遍历:" + QString::number(acol); // 打印

2.2 使用指针遍历多维数组

因为多维数组实际上是数组的数组,所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针:

int ia[3][4];     // 大小为3的数组,每个元素是含有4个int的数组
int (*p)[4] = ia; // p指向含有4个int的数组
p = &ia[2];		  // p指向ia的尾元素

随着C++11新标准的提出,通过使用auto或者decltype就能尽可能地避免在数组前面加上一个指针类型了:

// 使用指针遍历多维数组
for(auto arr = doubleArrMulti; arr != doubleArrMulti+2; ++arr) // arr指向最外层数组首元素
  for(auto arow = *arr; arow != *arr+3; ++arow)			   // arow指向次外层数组首元素
      for(auto acol = *arow; acol!= *arow+4; ++acol)		   // acol指向内层数组首元素
          qDebug() << "指针遍历:" + QString::number(*acol);  // 打印

当然,使用标准库函数begin和end也能实现同样的功能,而且看起来更简洁一些:

// 使用指针遍历多维数组
for(auto arr = std::begin(doubleArrMulti); arr != std::end(doubleArrMulti); ++arr)
  for(auto arow = std::begin(*arr); arow != std::end(*arr); ++arow)
      for(auto acol = std::begin(*arow); acol!= std::end(*arow); ++acol)
          qDebug() << "指针遍历1:" + QString::number(*acol);

2.3 使用类型别名遍历多维数组

类型别名简化多维数组的指针读、写和理解一个指向多维数组的指针是一个让人不胜其烦的工作,使用类型别名能让这项工作变得简单一点儿,例如:

using double_array1 = double[3][4]; // 新标准下的使用using的类型别名声明
typedef double double_array2[4];    // 等价的使用typedef的类型别名声明
for(double_array1 *da1 = doubleArrMulti; da1 != doubleArrMulti+2; ++da1)
  for(double_array2 *da2 = *da1; da2 != *da1+3; ++da2)
      for(double *d = *da2; d != *da2+4; ++d)
          qDebug() << "类型别名遍历:"+QString::number(*d);

 

附:多维数组初始化

int arr[2][3],一般在函数体中使用,所以是在栈中分配内存的局部变量,未初始化时内存上存的是0xCCCCCCCC,它的补码数即为-858993460。
int arr[2][3] = {0},为第一个元素赋值为0,其余元素由于没给值,所以也赋值为0.
int arr[2][3] = {1},为第一个元素赋值为1,其余元素由于没给值,所以赋值为0.
int arr[2][3] = {1,2,3,4},为前4个元素依次赋值为这些。(相当于把所有元素展开来数前4个)其余为0.
int arr[2][3] = { {1}, {2} },为每一行的首元素赋值。注意里面大括号的个数不能大于第一维度的大小。其余为0.
int arr[2][3] = { {1,2,3}, {4,5,6} },这是最完整的赋值。

 

总结

关于C++/Qt遍历多维数组的3种方式的文章就介绍至此,更多相关C++ Qt遍历多维数组内容请搜索编程宝库以前的文章,希望以后支持编程宝库

 前言三子棋应该是是我们最早接触到的棋类游戏,用C语言实现三子棋对初学者来说是一种不错的锻炼编写三子棋只需要用到数组、函数和生成随机数的知识,所以比较适合成为编程学习者编写的第一个小游戏。&n ...