C++11引入了一种崭新的for循环形式,可以逐一迭代某个给定的区间,数组,集合内的每一个元素。其他语言可能称此为foreach循环。其一般性语法如下:
coll:存储数据的集合。
decl:coll集合中每个数据元素的声明。
statement:针对decl声明的元素所要执行的指令。
例如:
此特性也可用于容器。
例如:将vector容器中每个元素乘以3.
在上述例子中,将elem声明为一个引用(reference),以修改原数据且提高效率,如若不这样做,for循环将会作用在元素的一份本地拷贝(local copy)身上。(当然,不使用引用也可以,看你想要怎样使用数据)
在设计程序中,为了避免调用每个元素的copy构造函数和析构函数,通常应声明当前元素为一个const reference 。于是一个用来“打印某集合内所有元素”的泛型函数为:
一般而言,当coll提供成员函数begin()和成员函数end(),这样的range-based for语句等用于使用迭代器:
如果没有提供成员函数begin()和成员函数end(),那么也可以使用一个全局性的begin()和end(),且两者都接受coll为实参,其功能等同于上述方法。
于是,可以针对初值列使用range-based for 循环,因为class template(类模板)std::initializer_list<>提供了成员函数begin()和成员函数end()。
此外,对于寻常的,大小已知的C-style array也可以使用range-based for。
例如:
还可以:
注:当元素在for循环中被初始化为decl(decl:coll集合中每个数据元素的声明。)时,不得有任何显示类型转换。