常常需要将表达式的值赋给变量,为了解决声明变量时表达式的值未知的问题,引入了auto类型说明符。它可以根据初始值自动分析表达式所属类型:
// 由val1和val2相加的结果推断出item的类型 auto item = val1 + val2; //声明同一种类型 auto i = 0, *p = &i;//正确:p是整形指针 //不能声明不同类型 auto sz = 0, pi = 3.14 //错误
c++11引入了一种更简单的for语句,可遍历容器或序列的所有元素:
for (declaration: expression) statement
其中expression必须是一个序列,其拥有能返回迭代器begin和end成员;
declaration定义一个变量,序列中的每个元素都必须能转换成该变量的类型,通常使用auto。如果需要对序列中的元素执行操作,循环变量须声明成引用类型;
每次迭代都会重新定义循环控制变量,并将其初始化为序列中的写一个值,之后执行statement。所有元素都处理完毕后循环中止。
vector<int> v = {0,1,2,3,4,5,6,7,8,9}; //范围变量须是引用类型,才能对元素执行写操作 for(auto &r : v) //对v中每一个元素 r *= 2;//将v中每个元素翻倍
由于准备修改v中元素的值,因此将r声明成引用类型。此时在循环内给r赋值,即改变了r所绑定的元素的值。
范围for语句等价的传统for语句:
for (auto beg = v.begin(), end = v.end(); beg != end; ++beg) { auto &r = *beg; r *= 2; }
注
1.由于范围for语句预存了容器end()的值,所以不能在范围for语句内添加(删除)序列中的元素,否则end函数的值可能会无效。
2.由于for auto是c++11新特性,所以在使用vscode时可能会报错,需要在配置文件或CMakeLists中添加c++11特性