为什么需要lambda函数
匿名函数是许多编程语言都支持的概念,有函数体,没有函数名。1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值。正因为有这样的需求,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了。
声明Lambda表达式
Lambda表达式完整的声明格式如下:
[capture list] (params list) mutable exception-> return type { function body }
各项具体含义如下
capture list:捕获外部变量列表
params list:形参列表
mutable指示符:用来说用是否可以修改捕获的变量
exception:异常设定
return type:返回类型
function body:函数体
例子:
class Solution {
public:
void exampleText(vector<int>&text) {
sort(text.begin(), text.end(), [](int a, int b)->bool {return a > b; });
}
};
**等价于**
bool cmp(int a,int b){
return a>b;
}
class Solution {
public:
void exampleText(vector<int>&text) {
sort(text.begin(), text.end(), cmp);
}
};
代码将会调用sort函数并且会重载比较函数对向量进行降序排序,其中[] 不截取任何变量,因为我()中传入了形参int a,int b
lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。
[] 不截取任何变量
[&} 截取外部作用域中所有变量,并作为引用在函数体中使用
[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量 [x, &y] x按值传递,y按引用传递
[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
更多内容可查看
https://www.cnblogs.com/DswCnblog/p/5629165.html
https://blog.csdn.net/booirror/article/details/26973611