c++11引入了auto类型说明符,auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。
ranged-base for 范围for
C++11 引入了一种崭新的for循环形式,可以逐一迭代某个给定的区间、数组、集合内的每个元素。其他编程语言可能称此为foreach循环。
其一般性语法如下:
for ( decl : coll)
{
statement
}
实例:
for ( int i :{ 2,3,5,7,9,13,17,19})
{
cout<<i<<endl;
}
vector<double> vec;
...
for(auto elem : vec) //编译器会一个一个的取vec中的元素取出来copy到elem中去,然后输出。
{
cout<<elem<<endl;
}
for(auto& elem : vec) //pass by reference
{ //这里声明elem为一个引用很重要,若不这么做,for循环中 的语句会作用在元素的一份本地拷贝身上。
elem*=3;
}
这里声明elem为一个引用很重要,若不这么做,for循环中 的语句会作用在元素的一份本地拷贝身上。
这意味着,为了避免调用每个元素的copy构造函数和析构函数,你通常应该声明当前元素为一个const引用。于是一个用来“打印某集合内所有元素”的泛型函数应该写成这样:
template <typename T>
void printElements (const T& coll)
{
for(const auto& elem : coll) {
std::cout << elem << std::endl;
}
}
// 这个所谓的range-based for语句等同于:
{
for(auto _pos = coll.begin(); _pos != coll.end(); ++_pos) {
const auto& elem = *_pos;
std::cout << elem << std::endl;
}
}
// 一般而言,如果coll提供成员函数begin()和end(),那么一个range-based for循环声明为
for(decl : coll) {
statement
}
// 便等同于
{
for(auto _pos = coll.begin(), _end = coll.end; _pos != coll.end(); ++_pos) {
decl = *_pos;
statement
}
}
范围for循环有两种用法:可以遍历字符串,数组,map,vector等容器。