概述
这是一个很有趣的话题,我们只用一个循环遍历相当于二维的结构。
在谈这些之前,我们要先清楚数组,数组是一块连续的内存空间,记住不管是几维都是连续的内存空间,为什么这样强调,我打个比方。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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复