C++ 中的 Foreach 循环



Foreach 循环也称为**基于范围的**for 循环,它是一种以简单易读的方式迭代容器(如数组、向量、列表)中元素的方法,无需执行任何额外的性能操作,例如初始化、增量/减量和循环终止或退出条件。

语法

以下是 foreach 循环的语法:

for( data_type  element_variable__name : container_name ){
   // code to be executed
}

这里,

  • **element_variable_name** 是赋给存储在容器中的元素的变量名。
  • **container_name** 是任何类型容器(例如数组、向量、列表等)的变量名。

Foreach 循环的工作原理?

  • foreach 循环迭代给定容器的所有元素。该过程从第一个元素开始,该元素被赋值给变量,如代码中所示的 **element_variable_name**。
  • 然后,循环执行 foreach 循环的主体,允许您操作或使用这些元素。
  • 处理当前元素后,循环移动到容器中的下一个元素。
  • 此过程重复,直到到达容器的最后一个元素。

Foreach 循环示例

在这个例子中,基于范围的 for 循环使用引用 (int& num) 允许您直接修改向量的每个元素。

#include <iostream>
#include <vector>
using namespace std;

int main() {
   vector<int> digits = {10, 20, 30, 40, 50};

   // Range-based for loop to modify each element
   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 循环与 Foreach 循环

for 循环根据给定条件执行语句集,而 foreach 循环(或基于范围的 for 循环)迭代集合元素。考虑以下示例以了解 C++ 中 for 和 foreach 的区别:

标准方法:for 循环

以下是一个 for 循环的示例,我们在此打印整数数组的元素:

#include<iostream>
using namespace std;

int main() {
   // an Array
   int arr[] = {1,2,3,4};

   // Printing array elements using
   // for loop
   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};
   // Where x is variable name provided to 
   // elements inside container
   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:
      // Constructor with initialization list
      Iterable(const vector<int>& v) : values(v) {}

      // Provide begin() and end() methods
      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()。
广告