Lambda表达式
格式
[capture list](params){body}
capture list: 捕捉列表
params:参数列表
body:函数执行体
方括号[]是闭包,闭包的一个强大之处是其可以通过传值或者引用的方式捕捉其封装作用域内的变量。
括号()里面可以放参数,如果需要就放,不需要就不用写。
花括号{}包含了lambda表达式体。
如果有返回值,返回类型要放在()后面,以->type形式呈现,也可以忽略
示例:
#include <iostream>
using namespace std;
int main(){
int x = 10;
auto a = [x](int a, int b)->int { return a + b + x;};
cout << a(1,2) << endl;
return 0;
}
输出:
13
上述示例中,我们在方括号[]中使用值捕获的方式,使用括号()传入了参数int a 和int b,表达式为 a + b + x。
捕捉模式
- []: 默认不捕获任何变量
- [=] : 默认以值捕获所有变量
- [&]:默认以引用捕获所有变量
- [x]:仅以值捕获x,其他变量不捕获
- [&x]:仅以引用捕获x,其他变量不捕获
- [=, &x]:默认以值捕获所有变量,但是x是例外,通过引用捕获
- [&, x]:默认以引用捕获所有变量,但是x是例外,通过值捕获
- [this]:通过引用捕获当前对象(其实是复制指针)
- [*this]:通过传值方式捕获当前对象
使用值传递的方式不能在表达式内部进行修改形参,使用引用传递可以在表达式内部修改形参的值。
示例:
#include <iostream>
using namespace std;
int main(){
int x = 10;
auto a = [x](int a, int b)->int {
return a + b + x;};
cout << a(1,2) << endl;
return 0;
}
输出:
13
示例2:
#include <iostream>
using namespace std;
int main(){
int x = 10;
auto a = [&x](int a, int b)->int {
x = 20;
return a + b + x;};
cout << a(1,2) << endl;
return 0;
}
输出:
23
应用
lambda 表达式⼀个更重要的应⽤是其可以⽤于函数的参数,通过这种⽅式可以实现回调函数。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int val = 3;
vector<int> v{1,2,3,4,5,6,7,8};
int a = std::count_if(v.begin(), v.end(), [val](int x){return x > val;}); //返回v中大于3的元素数量
cout<<a<<endl;
return 0;
}