C++ 中的 Foreach 循环
Foreach 循环也称为基于范围 for 循环,它是一种简单易读的方式,可以遍历容器(如数组、向量、列表)中的元素,而无需执行任何额外操作,例如初始化、递增/递减、循环终止或退出条件。
语法
以下是 for each 循环的语法 -
for( data_type element_variable__name : container_name ){ // 要执行的代码 }
这里,
- element_variable_name 是赋给存储在容器中的元素。
- container_name 是任意类型容器的变量名,例如数组、向量、列表等。
Foreach 循环如何工作?
- foreach 循环遍历给定容器的所有元素。该过程从第一个元素开始,并将其赋值给变量,作为 element_variable_name,如代码所示。
- 然后,循环执行 for each 循环的主体,允许您操作或使用这些元素。
- 处理完当前元素后,循环移至容器中的下一个元素。
- 此过程重复进行,直到到达容器的最后一个元素。
Foreach 循环示例
在此示例中,基于范围的 for 循环带有引用 (int& num) ,允许您直接修改 向量中的每个元素。
#include <iostream> #include <vector> using namespace std; int main() { vector<int> digits = {10, 20, 30, 40, 50}; // 基于范围的 for 循环来修改每个元素 for (int& num : digits) { num *= 2; // Double each number } 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> int main() { using namespace std; 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 循环打印数组元素 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}; // 其中 x 是提供给的变量名称 // 容器内的元素 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) {} // 提供 begin() 和 end() 方法 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 循环的优势
在 C++ 中使用 Foreach 循环的优势如下:
- 简单 − 减少样板代码。
- 可读性 − 与 for、while 和 do-while 等传统循环方法相比,它提供了一种简单易读的代码编写方式。
- 安全性 − 减少与索引管理和边缘相关的错误情况。
Foreach 循环的局限性
以下是 foreach 循环的一些局限性 -
- 仅限于正向遍历 - 它不允许以反向顺序进行迭代。
- 不可中断遍历 - 在到达最后一个索引或最后一个元素之前,无法跳过任何元素或中断迭代。
- 迭代时无法直接访问元素 - 在通过 foreach 循环进行迭代时,无法直接访问当前元素的索引或位置。
Foreach 循环的应用
- 只读迭代 - 当用户想要迭代元素而不任何修改都适用,因为 foreach 循环提供了更简洁的代码。
- 遍历容器 − 当我们想要遍历任何类型的容器(例如数组、列表、向量)时,foreach 循环非常有用,因为此循环简化了对容器元素进行迭代的过程。
- 简单修改 − 当我们想要执行任何简单操作时,它都很有用,因为与编写迭代代码的旧标准方法相比,它提供了简单、易读的代码。
- 使用非容器类型 − 它也适用于任何满足可迭代要求的类型,包括 begin() 和 end()。