通常情况下,遍历二维数组是通过使用嵌套的普通 for 循环,如下所示:
#include <iostream>
const int ROWS = 3;
const int COLS = 4;
int main() {
int arr[ROWS][COLS] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}};
// 打印二维数组的每个元素
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
std::cout << arr[i][j] << "\t";
}
std::cout << std::endl;
}
return 0;
}
上述代码使用嵌套的 for 循环来遍历二维数组 arr
的每个元素,并输出其值。
运行上述代码,输出将是:
1 2 3 4
5 6 7 8
9 10 11 12
这样可以正确输出二维数组 arr
中的每个元素。
但是C++11可以通过更快捷的方式遍历数组,如下所示:
int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };
for (auto &row : arr) {
for (auto num : row) {
cout << num << " ";
}
cout << endl;
}
这段代码可以正确输出二维数组 arr
中的每个元素是因为它使用了范围-based for 循环(range-based for loop),而范围-based for 循环仅适用于迭代器或具有 begin() 和 end() 成员函数的容器。并使用了引用符号 &
来避免副本的创建。
创建副本指的是在进行赋值操作或传递参数时,会复制原始数据的副本而不是直接操作原始数据本身。这意味着修改副本的值不会影响到原始数据。
在 C++ 中,当使用 auto
关键字声明变量时,编译器会根据变量的初始值自动推导变量的类型。对于范围-based for 循环中的 auto
,它会根据被迭代的元素的类型来推导变量的类型。
在这段代码中的第一个 auto &row
,auto
表示编译器会自动推导 row
的类型,并且由于使用了引用符号 &
,它会推导为一个引用类型。可以将 row
视为一个别名,它引用了 arr
中的每一行。通过引用 row
,可以直接访问二维数组中的每个元素。
在第二个 auto num
中,auto
会自动推导 num
的类型。由于它是在内部循环中声明的,并且是对 row
中的元素进行迭代,num
的类型将是 row
中元素的类型的副本。
引用类型是一种特殊的数据类型,它引用了某个对象或值的地址,并允许通过该引用来访问原始对象或值。
如果想修改二维数组中的元素,应该使用auto &
来获取每个元素的引用,以确保能够修改原始数组中的值。例如:
for (auto &row : arr) {
for (auto &num : row) {
num = 0; // 修改二维数组中的元素
cout << num << "\t";
}
cout << endl;
}
这样可以通过引用修改二维数组 arr 中的每个元素的值。