# 范围for循环 C++ 11标准之前(C++ 98/03 标准),如果要用 for 循环语句遍历一个数组或者容器,只能套用如下结构: ```c++ for(表达式1; 表达式2; 表达式3){ //循环体 } ``` 实例 ```c++ #include #include #include using namespace std; int main() { //普通的循环 char arc[] = "https://wangyuedong.com"; for (int i = 0; i < strlen(arc); i++) { cout << arc[i]; } cout << endl; vector myvector(arc, arc + 23); vector::iterator it; for (it = myvector.begin(); it != myvector.end(); ++it) { cout << *it; } return 0; } ``` 而 C++ 11 标准中,除了可以沿用前面介绍的用法外,还为 for 循环添加了一种全新的语法格式,如下所示: ```c++ for(declaration:expression){ //循环体 } ``` 其中,两个参数各自的含义如下: - declaration:表示此处要定义一个变量,该变量的类型为要遍历序列中存储元素的类型。需要注意的是,C++ 11 标准中,declaration参数处定义的变量类型可以用 auto 关键字表示,该关键字可以使编译器自行推导该变量的数据类型。 - expression:表示要遍历的序列,常见的可以为事先定义好的普通数组或者容器,还可以是用 {} 大括号初始化的序列。 可以看到,同 C++ 98/03 中 for 循环的语法格式相比较,此格式并没有明确限定 for 循环的遍历范围,这是它们最大的区别,即旧格式的 for 循环可以指定循环的范围,而 C++11 标准增加的 for 循环,只会逐个遍历 expression 参数处指定序列中的每个元素。 下面程序演示了如何用 C++ 11 标准中的 for 循环遍历实例一定义的 arc 数组和 myvector 容器: ```c++ #include #include using namespace std; int main() { char arc[] = "https://wangyuedong.com"; for (char ch : arc) { cout << ch; } cout << "!!!!" << endl; vector myvector(arc, arc + 23); for (auto ch : myvector) { cout << ch; } cout << "!!"; return 0; } ``` 程序中在遍历 myvector 容器时,定义了 auto 类型的 ch 变量,当编译器编译程序时,会通过 myvector 容器中存储的元素类型自动推导出 ch 为 char 类型。注意,这里的 ch 不是迭代器类型,而表示的是 myvector 容器中存储的每个元素。 仔细观察程序的输出结果,其中第一行输出的字符串和 "!" 之间还输出有一个空格,这是因为新格式的 for 循环在遍历字符串序列时,不只是遍历到最后一个字符,还会遍历位于该字符串末尾的 '\0'(字符串的结束标志)。之所以第二行输出的字符串和 "!" 之间没有空格,是因为 myvector 容器中没有存储 '\0'。 另外值得一提的是,在使用新语法格式的 for 循环遍历某个序列时,如果需要遍历的同时修改序列中元素的值,实现方案是在 declaration 参数处定义引用形式的变量。举个例子: ```c++ #include #include using namespace std; int main() { char arc[] = "adcde"; vector myvector(arc, arc + 5); //修改值 for (auto &ch : myvector) { ch++; } //for 循环遍历输出容器各个字符 for (auto ch : myvector) { cout << ch; } return 0; } ```