基于范围的 for 循环

在一个范围上执行 for 循环。

用作对范围中的各个值(如容器中的所有元素)进行操作的传统 for 循环的更加可读的等价版本。

语法
属性(可选) for ( 初始化语句(可选)范围变量声明 : 范围表达式 ) 循环语句

注意,所有 初始化语句 必然以分号 ; 结尾,因此它经常被非正式地描述为后随分号的表达式或声明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// 示例

#include <iostream>
#include <vector>

int main()
{
std::vector<int> v = {0, 1, 2, 3, 4, 5};

for (const int& i : v) // 以 const 引用访问
std::cout << i << ' ';
std::cout << '\n';

for (auto i : v) // 以值访问,i 的类型是 int
std::cout << i << ' ';
std::cout << '\n';

for (auto&& i : v) // 以转发引用访问,i 的类型是 int&
std::cout << i << ' ';
std::cout << '\n';

const auto& cv = v;

for (auto&& i : cv) // 以转发引用访问,i 的类型是 const int&
std::cout << i << ' ';
std::cout << '\n';

for (int n : {0, 1, 2, 3, 4, 5}) // 初始化器可以是花括号初始化器列表
std::cout << n << ' ';
std::cout << '\n';

int a[] = {0, 1, 2, 3, 4, 5};
for (int n : a) // 初始化器可以是数组
std::cout << n << ' ';
std::cout << '\n';

for ([[maybe_unused]] int n : a)
std::cout << 1 << ' '; // 不必使用循环变量
std::cout << '\n';

for (auto n = v.size(); auto i : v) // 初始化语句(C++20)
std::cout << --n + i << ' ';
std::cout << '\n';

for (typedef decltype(v)::value_type elem_t; elem_t i : v)
// typedef 声明作为初始化语句(C++20)
std::cout << i << ' ';
std::cout << '\n';

for (using elem_t = decltype(v)::value_type; elem_t i : v)
// 别名声明作为初始化语句,同上(C++23)
std::cout << i << ' ';
std::cout << '\n';
}
输出:

0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
1 1 1 1 1 1
5 5 5 5 5 5
0 1 2 3 4 5
0 1 2 3 4 5