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 }
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP