我是靠谱客的博主 傻傻黑猫,这篇文章主要介绍C++一个循环遍历嵌套vector与array,现在分享给大家,希望可以做个参考。

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

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

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

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

复制代码
1
2
3
4
5
6
7
8
#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可以通过直接一点有趣的方式遍历,所以我们得出下面的代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部