C++一个循环遍历嵌套vector与array

这是一个很有趣的话题,我们只用一个循环遍历相当于二维的结构。

在谈这些之前,我们要先清楚数组,数组是一块连续的内存空间,记住不管是几维都是连续的内存空间,为什么这样强调,我打个比方。int a[10][10],如果想访问最后一个元素,你会怎么做呢?a[9][9]?让我告诉你,可以 a[0][99],记住内存是连续的,那么数组内的"越界"就可以通过编译,也不会产生错误。

同时,如果阅读熟悉标准的开发者应该也清楚,这是UB,未定义行为。所以我们不推荐使用,不过你偶尔为方便也可以这样做,毕竟优化不会导致什么问题。

打个比方,三维数组,如何遍历?

#include<iostream>
int main(){
    int a[10][10][10]{0};
    a[5][0][499]=99;
    for(int i=0;i<10*10*10;i++)
        std::cout<<a[0][0][i]<<'\t';
    system("pause");
}

除了最后一个数据,都会打印0,这都不是重点,我们先讲述了原生内存结构

那么问题来了,std::vactor能否这样做?显然不太行,vector的内存结构和普通数组并不一样

那么std::array呢?完全可以,它的内存结构和原生数组没什么区别。

但是vector可以通过直接一点有趣的方式遍历,所以我们得出下面的代码

#include<iostream>
#include<vector>
#include<array>

int main()
{
    const int m=10,n=12;
    int y=0;
    std::vector<std::vector<int>>arr(m,std::vector<int>(n,0));//构造初始化
    for(int i=0;i<m;++i)
        for(int j=0;j<n;++j)arr[i][j]=y++;//赋值
    for(int k=0;k<m*n;++k)std::cout<<arr[k/n][k%n]<<' ';//遍历

    std::endl(std::cout);
    //UB遍历array嵌套
    std::array<std::array<int, 10>, 10>A{};
    int* ptr = reinterpret_cast<int*>(&A);//强转
    for (int i = 0; i < 10* 10; ++i) //遍历
        std::cout << ptr[i] << ' '; 

    system("pause");
    return 0;
}

array这种方式和上面的数组操控没什么区别,的确是UB,我们只是标准一种这样的思想。好了,就这样。

有很多官方文档对此有讲解,大家可以自行查阅。

 更多有趣的源代码可以查看我的仓库-2022-5-4-/C++ at main · Mq-b/-2022-5-4- · GitHub

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值