c++_如何遍历二维数组
本文介绍了c++11引入的range-based for loop语法进行二维数组的遍历,并介绍了与之相关的多个知识点。
例子
c++数组使用vector<int>,二维数组使用vector<vector<int>>
在下面的例子中我定义了一个二维数组3x3martix。
然后使用了二重循环来遍历它。
我们当然可以用传统 for 循环来实现。
但这里我使用的是 范围基于循环(range-based for loop),是 C++11 中引入的一种新的语法特性。这个语法可以简化数组、容器(如 std::vector)等的遍历,避免了传统 for 循环的繁琐操作。
外层循环 (for (const auto& row : matrix)) 用于遍历二维数组的每一行(row)。
内层循环 (for (int num : row)) 用于遍历当前行的每个元素(num)。
现在我们来分析上上面的外层循环中,const,auto,&的作用:
==》
1)这里的 const 主要 防止通过 row 修改 matrix 中的内容。
即如果 row 没有 const 修饰,则 row 仍然是 matrix 的一部分,可以直接修改 matrix 的值;
但加上 const 之后,const 限制了 row 只能读取,而不能修改 matrix,起到了保护作用。
2)这里的 & 避免了复制每一行的内容,而是通过引用访问数据。
即如果使用for (const auto row : matrix) ,:row 变成 matrix 中一行的副本,每次循环都会 拷贝 整行数据,增加不必要的开销。
对于大矩阵(如 1000×1000),大量拷贝会造成性能损失。
而加上这里的&,row 不再是拷贝,而是直接引用 matrix 的数据,提高了性能,减少了内存使用。
3)matrix 的元素是 std::vector<int>,所以 row 的类型应该是:
for (const std::vector<int>& row : matrix)
使用 auto,让编译器自动推导类型,避免手动写 std::vector<int>,提高可读性。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 示例二维数组
vector<vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 遍历二维数组并输出每个元素
for (const auto& row : matrix) { // 遍历每一行
for (int num : row) { // 遍历当前行的每个元素
cout << num << " ";
}
cout << endl; // 每行输出后换行
}
return 0;
}
语法模板
范围基于循环的语法模板是:
for (变量 :要遍历的容器或范围) {
// 代码块
}
对比旧模板
在 C++11 之前,你需要使用下标或迭代器:
for (size_t i = 0; i < matrix.size(); ++i) {
for (size_t j = 0; j < matrix[i].size(); ++j) {
std::cout << matrix[i][j] << " ";
}
}
for (auto it = matrix.begin(); it != matrix.end(); ++it) {
for (auto jt = it->begin(); jt != it->end(); ++jt) {
std::cout << *jt << " ";
}
}
先根据这两个例子回答一些问题:
1)size_t 类型是什么?
2)matrix.size(),matrix[i].size()返回什么?
3)matrix.begin(),matrix.end()返回的是什么? it->begin(),it->end()返回的是什么? .
1)size_t 是 C++ 标准库中的 无符号整数类型,它的定义在 <cstddef> 头文件中。
typedef unsigned int size_t; // 在 32 位系统上
typedef unsigned long long size_t; // 在 64 位系统上
因为无符号,不会有负值,因此适用于表示大小。
在这里使用 size_t 存储 size() 返回值,避免符号类型混淆。
2)对于二维数组,vector<std::vector<int>>
matrix.size():返回 行数(即外层 vector 的大小)。
matrix[i].size():返回第 i 行的 列数(即 vector<int> 的大小)
3)
matrix.begin() 返回指向 第一行(vector<int>)的迭代器。
matrix.end() 返回 尾后迭代器(不指向任何元素)。
*it 是 vector<int>,即 matrix 的第一行 {1, 2, 3}。
(*it)[0] 访问第一行的第一个元素 1。
4)
it->begin() 返回当前行的起始迭代器(指向 vector<int> 的第一个元素)。
it->end() 返回当前行的尾后迭代器。
5)总结:
迭代器 it->begin() 适用于复杂遍历,但一般用 range-based for 更方便。
更多推荐
所有评论(0)