在做3.43练习时,使用范围for循环遍历二维数组的元素,代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int ia[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
for(int *row : ia){
//cout<<row[0]<<endl;
for(int col : row){
cout<<col<<endl;
}
}
return 0;
}
然后第二个for循环报错:此基于范围的“for”语句需要适合的 “begin” 函数,但未找到
为解决此错误,开始翻书:
1.范围for循环
C++11新标准中的语句,形式:for (declaration : expression),其中exp表示一个序列,dec负责访问序列中的基础元素。(《C++primer》P82)
- 第一个for循环中:
for(int *row : ia),ia是一个二维数组,二维数组是数组的数组,但编译器会将其自动转为指针,于是ia就变为了一个含有三个元素的指针,而每个元素又是含有4个int型数字的指针。
貌似第一个for循环并没有出错,因为ia序列中的基础元素就是指针,那第二个for循环:for(int col : row),又是什么意思呢?
- 注意到第二个for循环中的row是一个指针,并不是一个序列,所以此时出现了错误,因为编译器无法在一个指针内遍历。(《C++primer》P114)
所以书上才会强调:范围for循环处理多维数组,除了最内层的循环外,其余的循环控制变量都应该是引用类型
2.确定引用的对象
显然,row应该是一个包含四个元素的数组,那么改如何引用呢?
for(int *&row : ia),报错:无法用 “int [4]” 类型的值初始化 “int *&” 类型的引用(非常量限定)。for(int (&row)[4] : ia),正常运行。
第一个引用,没指出数组的大小,所以失败了。
3.最终代码
#include<iostream>
using namespace std;
int main()
{
int ia[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
for(int (&row)[4] : ia){
//cout<<row[0]<<endl;
for(int col : row){
cout<<col<<"\t";
}
cout<<endl;
}
return 0;
}
4.总结
数组类型和指针类型实际上是不一样的,只是编译器在处理数组时,习惯将其转为指针进行处理。(因为数组需要指明大小)
540





