例子

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 更方便。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐