C++11新特性:范围for循环和lambda表达式

来源:互联网 发布:30岁后的美工 编辑:程序博客网 时间:2024/04/30 19:52

1.C++11新特性之范围for循环

语法格式: fordeclarationexpressionstatement

解释:

declaration:变量;

expression:序列;数组,vectorstring,等拥有能返回的beginend成员的序列;

例:

vector<int> v={1,2,3,4,5,6,7,8,9,0};

for(auto &r:v)

 r=r+1;

等价于

forauto 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则必须使用尾置返回类型,

 例:transformvi.begin(),vi.end(),vi.begin(),[] (int i) ->int {if(i<0) return -i; else return i; }) 此时返回int,若采用缺省返回类型则返回void

0 0