C++ 中 for 与 for_each 的用法
Yi Fan

for (;;)

for 语句是非常常见的重复执行语句。观察以下示例:

1
2
3
4
5
6
7
8
9
#include<iostream>
int n;
int main(){
cin >> n;
for (int i=1;i<=n;i++){
std::cout << i << std::endl;
}
return 0;
}

for 语句有三部分,中间用分号隔开:

  1. 第一条语句是初始化表达式,只在重复执行开始的时候在所有语句之前执行一次。
  2. 第二条语句是状态表达式,只有这个表达式返回真值才会继续重复执行。
  3. 第三条语句是循环表达式,在内容执行一次完毕以后执行。执行该语句后将会评估状态表达式,判断是否继续重复执行。

这三条语句都允许为空。其中,初始化表达式和循环表达式都可以包含多个用逗号分隔的语句,例如:

1
2
3
4
5
for (int i=1,j=1;;i++,j++){
std::cout << i+j << std::endl;
}
for (;;) std::cout << "Hello World!" << std::endl;
// 实现效果为不断循环输出 Hello World!

for_each

观察以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
#include<vector>
#include<algorithm>
int main(){
    std::vector<int>num;
    num.emplace_back(1);
    num.emplace_back(1);
    for (int i=2;i<=20;i++) num.emplace_back(num[i-1]+num[i-2]);
    std::for_each(num.begin(), num.end(), [](int cnt){
        std::cout << cnt << std::endl;
    });
    return 0;
}

这个程序使用 for_each 来输出这个构造完毕的斐波那契数列。

for_each 是基于范围的,用逗号分隔的三个区域分别指示了开始、结尾和方法,for_each 将对范围内的每个元素执行方法。

for (:)

这是 C++11 中引入的内容。先看一个例子:

1
2
3
4
5
6
7
8
#include<iostream>
int num[5]={123,234,345,456,567};
int main(){
for (int i:num){
std::cout << i << std::endl;
}
return 0;
}

其结果是遍历了数组中的每个元素并且输出。这种写法同样是基于范围的,此处 i 是数组(或者容器)中元素的一个副本。这种写法因其实用性更好,基本代替了 for_each

如果需要改变数组(或者容器)中的元素,可以采用如下方式:

1
2
3
for (int &i:num){
std::cout << i << std::endl;
}

此时的 i 是这个数组中的元素的引用,在修改 i 的同时也会修改数组中的元素。