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

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

语法

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

range-declaration-它是与range-expression元素类型相同类型的变量的声明。通常,auto关键字用于自动标识range-expression中的元素类型。

range-expression-用于表示元素序列的任何表达式。也可以使用大括号中的元素序列。

loop-statement -for循环的主体,其中包含一个或多个要重复执行直到range-expression结束的语句。

与传统的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-终止所有其余迭代的循环。

继续-跳过当前迭代并移至下一个

goto-从循环跳到语句,后跟标签-

基于范围的优势

  • 易于使用和简单的语法。

  • 无需计算容器中元素的数量或range-expression的大小。

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

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

  • 最好一次性完成整个容器的迭代。

基于范围的缺点

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

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

  • 数组不能以相反的顺序进行迭代。对于该<boost / range / adaptor / reversed.hpp>库

示例

#include <iostream>
#include <vector>
#include <map>
int main(){
   int arr[] = { 10,20,30,40,50 };
   //传统
   for ( int i=0;i<5;i++ )
      printf("%d, ",arr[i]);
      printf("\n");
   for (int num : arr)
      printf("%d, ",num);
      printf("\n");
   //对于字符数组
      char str[] = "你好世界";
   for (char c : str)
      printf("%c ",c);
      printf("\n");
   for (char c : "你好世界")
      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 }