C++中Lambda表达式快速入门
c++中Lambda表达式其实就是匿名函数,它可以增加代码灵活性和简洁性
Lambda表达式格式如下:
[变量捕获](参数列表)->返回值类型{ 函数体 };
// 例1
[&](int a,int b)->int{
return a+b;
};
// 例2
[&](int a,int b){
return a+b
};
// 极简形式
[](){};
要点说明:
- Lambda表达式实际上就是三个括号(这也是构成lambda表达式所必需的,对应于上面的[极简形式])
- Lambda表达式中可以不写返回值类型(系统自动推导返回值类型),也就是把上面"->返回值类型"去掉,例2
- [ ]:表示变量捕获,变量捕获的意思就是在此函数体内可以使用外部的变量,取值形式有两种(参考函数列表的引用变量和普通变量):
- [&],按引用捕获,既可以访问也可以修改(常用),[&]这样写是捕获全部外部变量,[&a,&b]这样写是捕获外部a和b
- [=],按值捕获,只可访问外部变量不可修改其值,[=],[=a,=b]意思同上。
- [ ]中 & 和 = 可以组合使用,但一般很少组合使用,同时这里面也可以对捕获的变量进行重命名
- ( ):参数列表,同函数定义一样
- { }:函数体,同函数定义一样
- 使用:Lambda表达式定义的是一个匿名函数,所以要想使用它应该先把它赋给一个函数变量,通过函数变量来使用。下面展示两种常用的形式:
// 例1 定义了一个排序的比较函数,从大到小排序
int arr[10]; sort(arr, arr + 10, [&](int a, int b) { return a > b; });
// 例2 将Lambda表达式赋给一个函数变量,其中函数变量的声明:function<返回值类型(参数列表类型)>
function<int(int, int)> func = [&](int a, int b){
return a + b;
};
这时候有人就会有疑问了,这跟普通定义的函数一样的调用,相比之下Lambda表达式也没什么优势嘛
Lambda表达式一个很大的优势就是,Lambda表达式的定义可以写在main等其他函数的函数体里面,像变量一样声明一个函数,这时候如果Lambda表达式采用的是引用捕获,那么在Lambda表达式函数体中就可以直接使用main函数或者其他函数中的局部变量了,这是普通函数没办法做到的,如果普通函数要访问局部变量那就只有把局部变量当成参数传递进去,要访问的变量比较多时参数列表就会很长。