基于循环的范围是在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 }