Lambda是C++11增加的特性,利用Lambda表达式,可以创建匿名函数。
1.声明Lambda表达式
完整的声明格式:[capture list] (params list) mutable exception -> return type { function body}
- capture list:捕获外部变量列表
- params list:形参列表
- mutable指示符:用来说明是否可以修改捕获的变量
- exception:异常设定
- return type:返回类型
- function body:函数体
常见声明:
格式 | 说明 |
[]{function body} | 最简单的lambda表达式 |
[capture list](params list) -> return type {function body} | const类型的表达式,函数体中不能修改捕获列表中的值 |
[capture list](params list) {function body} | 省略了返回值,编译器自行判断:1)如果函数体中存在return语句,则返回类型由return语句中的返回类型确定;2)如果函数体中没有return语句,返回值为void型 |
[](params list) -> return type{function body} | 省略了捕获列表 |
[capture list] ()-> return type {function body} | 省略了形参列表,类似无参函数 |
- 注意:如果mutable,exception,return type三者只要一种出现,小括号()不可省略,均不出现则可省略。
简单应用举例:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a < b;
}
int main()
{
vector<int>vec1{ 12,36,25,47,84,13,26,45,81,21 };
vector<int>vec2(vec1);
for (auto i : vec1)
{
cout << i << " ";
}
cout << endl;
sort(vec1.begin(), vec1.end(), cmp);
for (auto i : vec1)
{
cout << i << " ";
}
cout << endl;
sort(vec2.begin(), vec2.end(), [](int a, int b)->bool {return a < b; });
for (auto i : vec2)
{
cout << i << " ";
}
cout << endl;
return 0;
}
2.捕获外部变量
//值捕获
int a = 123;
auto f1 = [a]{cout << a << endl; }; //值捕获外部变量a,类似值传递
cout << "a=" << ++a << endl; //输出a=124
cout << "in lambda expr f1,a=";
f1(); //输出123
cout << endl;
a = 123;
//auto f2 = [a] {cout << ++a << endl; }; //由于是const表达式,所以函数体中不能修改捕获的外部变量
auto f2 = [a]()mutable {cout << ++a << endl; }; //mutable指明可以在函数体中修改外部变量的值
cout << "a=" << ++a << endl;
cout << "in lambda expr f2,a=";
f2(); //输出124
cout << endl;
//引用捕获
int b = 456;
auto f3 = [&b] {cout << b << endl; }; //引用捕获外部变量b,类似引用传递
cout << "b=" << ++b << endl;
cout << "in lambda expr f3,b=";
f3(); //输出457
cout << endl;
b = 456;
//auto f4 = [b] {cout << ++b << endl; }; //由于是const表达式,所以函数体中不能修改捕获的外部变量
auto f4 = [&b]()mutable {cout << ++b << endl; }; //mutable指明可以在函数体中修改外部变量的值
cout << "b=" << ++b << endl;
cout << "in lambda expr f4,b=";
f4(); //输出458
cout << endl;
//隐式值捕获
int c = 123;
auto f5 = [=] {cout << c << endl; };
cout << "in lambda expr f5,c=";
f5(); //输出123
//隐式引用捕获
int d = 456;
auto f6 = [&] {cout << d << endl; };
d++;
cout << "in lambda expr f6,d=";
f6(); //输出457
其他捕获外部变量形式:
- [this],以值的形式捕获this指针
- [x,&y,=],x以值的形式捕获,y以引用的形式捕获,其他变量以值的形式捕获
- [x,&y,&],x以值的形式捕获,y以引用的形式捕获,其他变量以引用的形式捕获
3.函数参数
int a = 5, b = 3;
cout << a << "+" << b << "=" << [](int x, int y) {return x + y; }(a, b) << endl; //这里给了参数,所以返回的是值
cout << a << "+" << 12 << "=" << [](int x, int y = 12) {return x + y; }(a) << endl; //参数列表有默认参数
cout << [](int x) {return [](int y) {return y * 3; }(x)+8; }(a) << endl; //嵌套lambda表达式
auto f1 = [](int x)->function<int(int)> {return [=](int y) {return x + y; }; }; //返回lambda表达式
auto f2 = f1(4);
cout << f2(5) << endl;
auto f3 = [](const function<int(int)>& f, int z) {return f(z) + 3; }; //lambda表达式做参数
cout << f3(f1(7), 8) << endl;