foreach 循环也被称为基于范围的 for 循环,它是一种简单且易读的方式,用于遍历容器(如数组、向量、列表)中的元素,而无需执行诸如初始化、递增/递减和循环终止或退出条件等额外操作。
语法
foreach 循环的语法如下:
for( 数据类型 元素变量名 : 容器名 ){
}
这里,
-
-
容器名
是任何类型的容器变量名,如数组、向量、列表等。
foreach 循环如何工作?
foreach 循环遍历给定容器的所有元素。过程从第一个元素开始,将元素赋值给 元素变量名
如代码所示。 循环然后执行 foreach 循环的主体,允许您操纵或使用这些元素。 处理完当前元素后,循环移动到容器中的下一个元素。 这个过程重复直到达到容器的最后一个元素。
foreach 循环示例
在这个例子中,带有引用(int& num)的基于范围的 for 循环允许您直接修改向量的每个元素。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> digits = {10, 20, 30, 40, 50};
for (int& num : digits) {
num *= 2;
}
for (int num : digits) {
cout << num << " ";
}
cout << endl;
return 0;
}
输出
20 40 60 80 100
使用向量的 foreach 循环
foreach 循环可以用来遍历向量元素。
示例
在这个例子中,我们使用 foreach 循环迭代并打印向量的元素。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> numbers = {1, 2, 3, 4};
for (int num : numbers) {
cout << num << " ";
}
return 0;
}
输出
1 2 3 4
使用列表的 foreach 循环
类似地,foreach 循环也可以用来遍历列表元素。
示例
在这里,我们使用 foreach 循环迭代并打印列表的元素。
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> numbers = {10, 20, 30, 40, 50};
for (int num : numbers) {
cout << num << " ";
}
cout << endl;
return 0;
}
输出
10 20 30 40 50
for 循环 vs. foreach 循环
for 循环基于给定条件执行一组语句,而 foreach 循环(或基于范围的 for 循环)则遍历集合元素。考虑下面的例子来理解 C++ 中 for 和 foreach 之间的区别。
标准方法:for 循环
下面是一个 for 循环的例子,我们在其中打印整型数组的元素。
#include<iostream>
using namespace std;
int main() {
int arr[] = {1,2,3,4};
for (int i = 0; i <= 3; i++) {
cout << i<<" ";
}
return 0;
}
输出
0 1 2 3
foreach 循环方法
下面是一个 foreach 循环的例子,我们在其中迭代并打印整型数组的元素。
#include<iostream>
using namespace std;
int main() {
int arr[] = {1,2,3,4};
for(int x: arr) {
cout<< x<<" ";
}
return 0;
}
输出
1 2 3 4
使用非容器类型的 foreach 循环
通常,foreach 循环用于迭代容器类型,如数组、向量、列表、双端队列、集合和映射等,但它也用于非容器类型,前提是该类型是可迭代的,意味着它必须有 begin() 和 end() 方法来返回迭代器。
传统容器如向量等本身满足这些要求,因此我们不需要特别指定 begin() 和 end() 方法。
示例
下面的例子演示了使用非容器类型元素的 foreach 循环的工作原理。
#include <iostream>
#include <vector>
using namespace std;
class Iterable {
public:
Iterable(const vector<int>& v) : values(v) {}
auto begin() const -> vector<int>::const_iterator {
return values.begin();
}
auto end() const -> vector<int>::const_iterator {
return values.end();
}
private:
vector<int> values;
};
int main() {
Iterable myIterable({1, 2, 3, 4, 5});
for (int num : myIterable) {
cout << num << " ";
}
cout << endl;
return 0;
}
输出
1 2 3 4 5
解释
在上述代码中,begin() 方法返回一个指向容器第一个元素的迭代器,而 end() 方法返回一个指向容器最后一个元素之后位置的迭代器。 然后使用 for() 迭代器逐个迭代容器中的每个元素/值,并将每个值打印到控制台。
foreach 循环的优点
-
-
可读性 —— 相比传统的 for、while 和 do-while 循环方法,它以简单且易于阅读的方式编写代码。
-
安全性 —— 它减少了与索引管理和边缘情况相关的错误。
foreach 循环的局限性
-
-
不可中断的遍历 —— 在到达最后一个索引或最后一个元素之前没有选项可以跳过任何元素或中断迭代。
-
迭代时无直接访问元素 —— 在 foreach 循环迭代过程中无法直接访问当前元素的索引或位置。
foreach 循环的应用
-
只读迭代 —— 当用户想要在不进行任何修改的情况下遍历元素时,foreach 循环是一个不错的选择,因为它提供了更干净简单的代码。
-
遍历容器 —— 当我们要遍历任何类型的容器(如数组、列表、向量)时,foreach 循环是有用的,因为这个循环简化了遍历容器元素的过程。
-
简单修改 —— 当我们需要执行任何简单操作时,它有用,因为它相比旧的标准迭代代码编写方法给出了更简单、更容易阅读的代码。
-
非容器类型的工作 —— 它同样适用于满足可迭代需求的任何类型,即包含 begin() 和 end() 的类型。