在C++11之前的版本,若要使用for对一个数组a进行遍历通常这么写:
int a[10] = {0,1,2,3,4,5,6,7,8,9};
for(int i=0; i<10 ;i++)
{
std::cout << a[i] << std::endl;
}
对一个容器a进行遍历这么写:
std::vector<int> a{0,1,2,3,4,5,6,7,8,9};
for(std::vector<int>::iterator it = a.begin(); it != a.end(); it++)
{
std::cout << *it << std::endl;
}
但是使用C++11中新添加的based for 循环可以这样写:
int a[10] = {0,1,2,3,4,5,6,7,8,9};
for(auto n : a)
std::cout << n << std::endl;
std::vector<int> a{0,1,2,3,4,5,6,7,8,9};
for(auto n : a)
std::cout << n << std::endl;
可以发现这极大提高了程序的可读性,但是这种遍历是不能对数组以及容器的值进行修改的,例如:
std::vector<int> a{0,1,2,3,4,5,6,7,8,9};
std::cout << "修改前" << std::endl;
for (auto n : a)
{
std::cout << n++ <<;
}
std::cout<< "修改后" << std::endl;
for (auto m : a)
{
std::cout << m <<;
}
输出结果为:
修改前
0123456789
修改后
0123456789
可以看到,for循环并未改变值,只对值进行了遍历,如果要遍历容器内的元素的同时又要修改元素的值,就需要将遍历的变量声明为引用类型:
std::vector<int> a{0,1,2,3,4,5,6,7,8,9};
std::cout << "修改前" << std::endl;
for (auto& n : a)
{
std::cout << n++;
}
std::cout<< "修改后" << std::endl;
for (auto m : a)
{
std::cout << m;
}
输出结果为:
修改前
0123456789
修改后
12345678910
可以看到,容器内的元素每个都加了1。
综上所述,based for 循环的遍历是只读的,除非将变量变量的类型声明为引用类型。