3种C++/Qt遍历多维数组的方法

发布时间:2023-08-28 17:33:41 作者:栢白
来源:亿速云 阅读:106

今天小编给大家分享的是3种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);

附:多维数组初始化

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} },这是最完整的赋值。

关于3种C++/Qt遍历多维数组的方法就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

推荐阅读:
  1. C++开源库
  2. VS2013解决error LNK2019: 无法解析的外部符号 mfcs120ud.lib

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:使用useDark()发现transition 动画失效

下一篇:Mac 安装 Python3.10 和 配置环境的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》