C++ 中基于范围的 for 循环


基于范围的 for 循环是在 C++ 11 标准中添加的,它是其传统等效形式的更紧凑的形式。基于范围的 for 循环用于迭代容器中的元素,从头到尾。基于范围的 for 循环的语法如下所示:

语法

for( range-declaration : range-expression ) loop statement

范围声明 - 它声明一个变量,其类型与范围表达式中元素的类型相同。通常使用 auto 关键字来自动识别范围表达式中元素的类型。

范围表达式 - 用于表示元素序列的任何表达式。也可以使用花括号中的元素序列。

循环语句 - for 循环的主体,包含一个或多个语句,这些语句将重复执行直到范围表达式的末尾。

与传统for 循环的比较 -

// Iterating over array
int arr[] = { 10,20,30,40,50 };
for (int num : arr)
printf("%d, ",num);
Is same as:
for ( int i=0;i<5;i++ )
printf("%d, ",arr[i]);

在这里,人们可以很容易地看到,在基于范围的 for 循环中不需要计算数组的大小,因此不需要条件表达式。此外,不需要增量或减量操作。上面的基于范围的 for 循环中的 num 在每次迭代中都从数组 arr[] 中获取从头到尾的元素值。在执行跳转语句之一之前,不会跳过任何元素。

break - 终止循环,对于所有剩余的迭代。

continue - 跳过当前迭代并移动到下一个。

goto - 跳出循环到标签后的语句 -

基于范围的 for 循环的优点

  • 易于使用且语法简单。

  • 无需计算容器中的元素数量或范围表达式的尺寸。

  • 如果范围声明的数据类型未知,则可以在其位置使用 auto 说明符,这会使其自动与范围表达式的类型兼容。

  • 不需要条件语句或增量/减量语句。

  • 最适合一次迭代整个容器的情况。

基于范围的 for 循环的缺点

  • 迭代 begin() 和 end() 之间的每个元素。无法处理特定的索引。

  • 使用基于范围的 for 循环无法重新访问一个或多个元素以及跳过一组元素。

  • 无法以相反的顺序迭代数组。为此,使用<boost/range/adaptor/reversed.hpp> 库。

示例

 在线演示

#include <iostream>
#include <vector>
#include <map>
int main(){
   int arr[] = { 10,20,30,40,50 };
   // traditional for
   for ( int i=0;i<5;i++ )
      printf("%d, ",arr[i]);
      printf("\n");
   for (int num : arr)
      printf("%d, ",num);
      printf("\n");
   // for character array
      char str[] = "Hello World";
   for (char c : str)
      printf("%c ",c);
      printf("\n");
   for (char c : "Hello World")
      printf("%c ",c);
      printf("\n");
      std::map <int, char> MAP({{1, 'A'}, {2, 'B'}, {3, 'C'}});
   for (auto m : MAP)
      printf("{ %d, %c }", m.first,m.second);
}

输出

10, 20, 30, 40, 50,
10, 20, 30, 40, 50,
H e l l o W o r l d
H e l l o W o r l d
{ 1, A }{ 2, B }{ 3, C }

更新于: 2020-07-28

4K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告

© . All rights reserved.