您现在的位置是:首页 >技术交流 >C++/Qt遍历多维数组的三种方式网站首页技术交流

C++/Qt遍历多维数组的三种方式

cgsthtm 2024-06-17 10:14:48
简介C++/Qt遍历多维数组的三种方式

一、什么是多维数组

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

严格来说,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);
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。