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遍历多维数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Libmicrohttpd搭建内嵌(本地)服务器的方法

    使用Libmicrohttpd搭建内嵌(本地)服务器的方法

    下面小编就为大家带来一篇使用Libmicrohttpd搭建内嵌(本地)服务器的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • C语言中自定义类型详解

    C语言中自定义类型详解

    大家好,本篇文章主要讲的是C语言中自定义类型详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C++ pimpl机制详细讲解

    C++ pimpl机制详细讲解

    PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问
    2022-08-08
  • C 语言基础之C语言的常见关键字

    C 语言基础之C语言的常见关键字

    C语言中有一些预先定义的字符串,他们本身被赋予了自身的功能。并且我们在定义变量的时候,不能去抢他们的名字来用。他们就是今天的主角:关键字,下面文章将给大家做详细介绍
    2021-09-09
  • C++使用chrono库处理日期和时间的实现方法

    C++使用chrono库处理日期和时间的实现方法

    C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,本文主要介绍了C++使用chrono库处理日期和时间的实现方法,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++文件的数据写入和文件的数据读取的方法实现

    C++文件的数据写入和文件的数据读取的方法实现

    本文主要介绍了C++文件的数据写入和文件的数据读取的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C语言动态内存分配图文讲解

    C语言动态内存分配图文讲解

    给数组分配多大的空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个更好的理解
    2023-01-01
  • VSCode插件开发全攻略之package.json详解

    VSCode插件开发全攻略之package.json详解

    这篇文章主要介绍了VSCode插件开发全攻略之package.json的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • C语言野指针及如何规避详解

    C语言野指针及如何规避详解

    这篇文章主要为大家介绍了C语言野指针及如何规避详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • QT5 Thread线程的具体实现

    QT5 Thread线程的具体实现

    本文主要介绍了QT5 Thread线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论