我是靠谱客的博主 傻傻黑猫,最近开发中收集的这篇文章主要介绍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 · 13870517674/-2022-5-4- · GitHub

最后

以上就是傻傻黑猫为你收集整理的C++一个循环遍历嵌套vector与array的全部内容,希望文章能够帮你解决C++一个循环遍历嵌套vector与array所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(145)

评论列表共有 0 条评论

立即
投稿
返回
顶部