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