基本语法
for (element_declaration : range) {
// 循环体,使用 element_declaration 表示 range 中的每个元素
}
-
element_declaration
:这是一个新的变量,用于表示range
中的每个元素。在for
循环的每次迭代中,element_declaration
都将被设置为range
中的下一个元素。 -
range
:这是一个可迭代的数据结构,例如字符串、数组、向量等。for
循环将遍历range
中的每个元素。
范围基于范围的for循环的工作原理
- for循环首先初始化element_declaration为range的第一个元素。
- 然后,它执行循环体,使用element_declaration表示当前元素。循环体可以对element_declaration进行操作,就像它是一个普通的变量一样。
- 循环体执行完毕后,for循环会自动将element_declaration更新为range中的下一个元素。
- 循环会一直执行,直到遍历完range中的所有元素。
优点:是它更加简洁和易读,特别适用于需要遍历容器或集合中的元素的情况。它隐藏了迭代器和循环索引等细节,使代码更加清晰。
代码实例
#include <iostream>
#include <vector>
using namespace std;
int main() {
char arc[] = "http://c.biancheng.net/cplus/11/";
//for循环遍历普通数组
for (char ch : arc) {
cout << ch;
}
cout << '!' << endl;
vector<char>myvector(arc, arc + 23);
//for循环遍历 vector 容器
for (auto ch : myvector) {
cout << ch;
}
cout << '!';
return 0;
}
程序执行结果为:
http://c.biancheng.net/cplus/11/ !
http://c.biancheng.net/!
这里有以下 2 点需要说明:
-
程序中在遍历 myvector 容器时,定义了 auto 类型的 ch 变量,当编译器编译程序时,会通过 myvector 容器中存储的元素类型自动推导出 ch 为 char 类型。注意,这里的 ch 不是迭代器类型,而表示的是 myvector 容器中存储的每个元素。
-
仔细观察程序的输出结果,其中第一行输出的字符串和 “!” 之间还输出有一个空格,这是因为新格式的 for 循环在遍历字符串序列时,不只是遍历到最后一个字符,还会遍历位于该字符串末尾的 ‘\0’(字符串的结束标志)。之所以第二行输出的字符串和 “!” 之间没有空格,是因为 myvector 容器中没有存储 ‘\0’。