1.C++11新特性之范围for循环
语法格式: for(declaration:expression) statement
解释:
declaration:变量;
expression:序列;数组,vector,string,等拥有能返回的begin和end成员的序列;
例:
vector<int> v={1,2,3,4,5,6,7,8,9,0};
for(auto &r:v)
r=r+1;
等价于
for(auto beg=v.begin(),auto end=v.end();beg!=end;++beg)
{
auto r=*beg;
r+=1;
}
2.C++11新特性之lambda表达式
一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。与任何表达式一样,lambda也具有一个返回类型,一个参数 列表,一个函数体。但与普通函数的不同之处是lambda可以定义在函数内部。
语法格式: [capture list] (parameter list) ->return type{function body}
解释:capture list(捕获列表)即包含lambda表达式的函数中的且能被lambda函数用到的 局部变量的列表;
parameter list(参数列表)和普通参数列表无区别;
return type(返回类型)作用和普通返回类型一样,但是必须是尾置返回类型;
function body(函数体)和普通函数体无区别;
其中参数列表和返回类型可以省略,但必须包括捕获列表和函数体
例: auto f=[ ] {return 5;};
lambda的调用方式和普通函数的调用方式相同,都使用调用运算符:
cout << f() <<endl; //打印42
注意:
A.与普通函数不同,lambda表达式不能有默认参数,即lambda表达式的实参和形参个 数永远一样;
B.lambda表达式可以使用局部变量,但必须在捕获列表[...,...]中指定;
C.捕获列表只用于局部非static变量,但lambda可以直接使用局部static变量和他所 在函数之外声明的名字;
D.变量的捕获方式可以是值捕获或者引用捕获;与普通的参数不同,被捕获的变量的 值是在lambda创建时拷贝,而不是调用时拷贝。当以引用捕获变量时,必须保证在 lambda执行时变量是存在的;
E.隐式捕获:为了支持编译器推断捕获列表,应在捕获列表中写一个=或者&。=告诉 编译器采用值捕获,&告诉编译器采用引用捕获;
F.可以混合使用隐式捕获和显示捕获,此时捕获列表的第一个元素必须是一个&或 =,此符号指定了默认捕获的方式,且显示捕获的变量必须使用与隐式捕获不同的方 式;
G.在返回类型缺省的情况下,如果一个lambda表达式包含除return之外的任何语句, 则编译器假定此lambda返回void,如果不希望返回void则必须使用尾置返回类型,
例:transform(vi.begin(),vi.end(),vi.begin(),[] (int i) ->int {if(i<0) return -i; else return i; }) 此时返回int,若采用缺省返回类型则返回 void。