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

 更新时间:2023年05月13日 10:03:41   作者:cgsthtm  
一维数组对于存储和处理一组数据很有用,但有时候,有必要使用多维数组,下面这篇文章主要给大家介绍了关于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++编程中的格式化输出详解

    C++编程中的格式化输出详解

    这篇文章主要介绍了C++编程中的格式化输出详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 详解c语言实现的内存池(适用于两个线程、不加锁、效率高)

    详解c语言实现的内存池(适用于两个线程、不加锁、效率高)

    这篇文章主要介绍了c语言实现的内存池(适用于两个线程、不加锁、效率高),设计一个内存池,要求效率比系统调用的效率要高(测试1万次),同时支持一个线程申请,另外一个线程释放,需要的朋友可以参考下
    2024-02-02
  • C++中队列queue的用法实例详解

    C++中队列queue的用法实例详解

    队列先进先出,即只能在容器的末尾添加新元素,只能从头部移除元素,下面这篇文章主要给大家介绍了关于C++中队列queue用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • C语言自制测色弱找方块游戏的示例代码

    C语言自制测色弱找方块游戏的示例代码

    这篇文章主要介绍了基于C语言自制测色弱找方块的游戏。该游戏是仿照最近网上流行的找方块游戏编写的,可玩性还是挺高的,感兴趣的可以了解一下
    2022-12-12
  • 如何用C++求两个数的最大公约数和最小公倍数

    如何用C++求两个数的最大公约数和最小公倍数

    最大公约数是指两个或多个整数共有约数中,最大的一个约数,常用的方法是欧几里得算法,也叫辗转相除法,下面这篇文章主要给大家介绍了关于如何用C++求两个数的最大公约数和最小公倍数的相关资料,需要的朋友可以参考下
    2023-01-01
  • C语言实现自动给QQ好友发窗口抖动

    C语言实现自动给QQ好友发窗口抖动

    这篇文章主要介绍了C语言实现自动给QQ好友发窗口抖动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C/C++中命名空间(namespace)详解及其作用介绍

    C/C++中命名空间(namespace)详解及其作用介绍

    今天小编就为大家分享一篇关于C++命名空间namespace的介绍与使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-09-09
  • C语言实例梳理讲解常用关键字的用法

    C语言实例梳理讲解常用关键字的用法

    关键字是C语言非常重要的一部分,熟练的掌握和使用关键字有助于我们更加熟悉了解C语言,同时C语言的关键字也是面试笔试中常考的内容。C语言的关键字共有32个,但并不是每个关键字都有坑,本篇文章将通过理论联系实际的方式为大家讲解C语言中易混易错以及常考的一些关键字
    2022-05-05
  • c++中new和delete操作符用法

    c++中new和delete操作符用法

    c++中new和delete运算符是用于动态分配和撤销内存的运算符,下面是示例,大家参考使用吧
    2014-04-04
  • C/C++实现获取系统时间的示例代码

    C/C++实现获取系统时间的示例代码

    C 标准库提供了 time() 函数与 localtime() 函数可以获取到当前系统的日历时间。本文将通过一些简单的示例为大家讲讲C++获取系统时间的具体方法,需要的可以参考一下
    2022-12-12

最新评论