Lambda表达式简介
简介
很多语言都提供了 lambda 表达式,如 Python,Java 8。lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式。原型
[capture](parameters)->return-type {body}
mutable 修饰符说明 lambda 表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获对象的 non-const 方法。
exception 说明 lambda 表达式是否抛出异常(noexcept),以及抛出何种异常,类似于void f() throw(X, Y)。
attribute 用来声明属性。
[]叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return-type表示返回类型,如果没有返回类型,则可以省略这部分。想知道为什么返回类型可以这么表示,这涉及到c++11的另一特性,参见自动类型推导,最后就是函数体部分了。
我们可以这样输出”hello,world”auto func = [] () { cout << "hello,world"; }; func(); // now call the function
另外,capture 指定了在可见域范围内 lambda 表达式的代码内可见得外部变量的列表,具体解释如下:
[a,&b] a变量以值的方式呗捕获,b以引用的方式被捕获。
- [this] 以值的方式捕获 this 指针。
- [&] 以引用的方式捕获所有的外部自动变量。
- [=] 以值的方式捕获所有的外部自动变量。
[] 不捕获外部的任何变量。
此外,params 指定 lambda 表达式的参数。
- 用例
对一个vector从小到大排序再输出,可以使用sort函数,这样写:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vint={1,3,2,8,5,6,7,9,4}; sort(vint.begin(),vint.end(),[](int a,int b){return a<b;}); for_each(vint.begin(),vint.end(),[](int a){cout<<a<<" ";}); return 0; }
- 用例
最后,lambda函数的类型是什么呢,答案是std:function。