C++11 lambda

来源:互联网 发布:路由器无网络怎么回事 编辑:程序博客网 时间:2024/05/17 08:12

参考:http://www.cnblogs.com/haippy/archive/2013/05/31/3111560.html

参考:https://www.zhihu.com/question/20125256


lamdba是C++11的一个新特性,用于使用lamdba表达式构造匿名函数

从一个最基础的小程序开始认识lambda

#include <iostream>using namespace std;int main(){    int x = 5;    auto func = [](){cout<<"hello lambda";};    func();}

控制台会打印hello lambda

这个程序里,[](){cout<<"hello lambda";};是一个lambda表达式,auto是C++11的新特性可以用来中自动适配func的类型。


lamdba表达式规范

C++11 的 lambda 表达式规范如下:

[ capture ](params)mutableexceptionattribute->ret{body}(1) [ capture ](params)->ret{body}(2) [ capture ](params){body}(3) [ capture ]{body}(4) 

其中

  • (1) 是完整的 lambda 表达式形式,
  • (2) const 类型的 lambda 表达式,该类型的表达式不能改捕获("capture")列表中的值。
  • (3)省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来:
    • 如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
    • 如果没有 return 语句,则类似 void f(...) 函数。
  • 省略了参数列表,类似于无参函数 f()。

mutable 修饰符说明 lambda 表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获对象的 non-const 方法。

exception 说明 lambda 表达式是否抛出异常(noexcept),以及抛出何种异常,类似于void f()throw(X, Y)

attribute 用来声明属性。

另外,capture 指定了在可见域范围内 lambda 表达式的代码内可见得外部变量的列表,具体解释如下:

  • [a,&b] a变量以值的方式呗捕获,b以引用的方式被捕获。
  • [this] 以值的方式捕获 this 指针。
  • [&] 以引用的方式捕获所有的外部自动变量。
  • [=] 以值的方式捕获所有的外部自动变量。
  • [] 不捕获外部的任何变量。

此外,params 指定 lambda 表达式的参数。


lamdba的用处?

1.令代码更加简洁,lamdba定义匿名函数可以让我们不必再定义一个(污染环境的)函数,尤其如果这个函数只会使用一次的话。

(引用知乎上一段形象的解释:好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情

bool compare(int a,int b){    return a<b;}int main(){    int nums[] = {6,5,8,9,3,2,1};    sort(nums,nums+7,compare);    return 0;}

可以简化为

int main(){    int nums[] = {6,5,8,9,3,2,1};    sort(nums,nums+7,[](int a,int b){return a<b;});    return 0;}

2.我们编程时经常使用一些逻辑相同的代码块,我们可以把它总结起来,做成一个函数,这样每次调用的时候就方便了

(可以把七零八散的代码聚集成一坨)

还没想好合适的例子,待补充。。。





原创粉丝点击