1.概述
考虑最简单的lambda function , [](){}
,它没有参数也没有返回值。
[]
里面用来捕获函数外部的变量,而()
里面就是匿名函数的参数,{}
里面就是函数的执行代码。
One easy example:
#include <iostream>
using namespace std;
int main()
{
auto func = [] () { cout << "Hello world"; }; //定义了一个lambda funciton
func(); // now call the function
}
2. lambda 表达式
形如: [capture](parameters)->return-type{body}
如果没有参数的话 ()
可以省略,返回值也可以省略。
Several easy examples:
[](int x, int y) { return x + y; } // 隐式返回类型
[](int& x) { ++x; } // 没有return语句 -> lambda 函数的返回类型是‘void‘
[]() { ++global_x; } // 没有参数,仅访问某个全局变量
[]{ ++global_x; } // 与上一个相同,省略了()
3 .lambda 函数中的变量截取
Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制允许这些变量被按值或按引用捕获.下面这些例子就是:
[] //不截取任何变量,试图在Lambda内使用任何外部变量都是错误的(全局变量除外).
[&] //截取外部作用域中所有变量,并作为引用在函数体中使用
[=] //截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=, &foo] //截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar] //截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[this] //截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
-----------------------------
[x, &y] //x 按值捕获, y 按引用捕获.
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
4 .lambda函数与STL结合
常用举例1:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
int main()
{
vecetor<PII>p;
//假设p数组中已经有了数据,现在我们要对其根据PII的第二个值从大到小排序
sort(p.begin(), p.end(), [](PII a, PII b){
return a.second > b.second;
});//如此编写调用lambda函数即可。
return 0;
}
常用举例2:
lambda函数的引入为STL的使用提供了极大的方便。比如下面这个例子,当你想便利一个vector的时候,原来你得这么写:
vector<int> v;
v.push_back( 1 );
v.push_back( 2 );
//...
for ( auto itr = v.begin(), end = v.end(); itr != end; itr++ )
{
cout << *itr;
}
现在有了lambda函数你就可以这么写
vector<int> v;
v.push_back( 1 );
v.push_back( 2 );
//...
for_each( v.begin(), v.end(), [] (int val)
{
cout << val;
} );
而且这么写了之后执行效率反而提高了。因为编译器有可能使用”循环展开“来加速执行过程(计算机系统结构课程中学的)
5 . References:
https://blog.csdn.net/xiaoguyin_/article/details/79798362
https://www.cnblogs.com/pzhfei/archive/2013/01/14/lambda_expression.html
https://www.cnblogs.com/lidabo/p/3908663.html
原文:https://www.cnblogs.com/Ivessas/p/14647554.html