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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值