[capture-list] (parameters) mutable -> return-type { statement }
int main()
{
// 最简单的lambda表达式, 该lambda表达式没有任何意义
[] {};
// 省略参数列表和返回值类型,返回值类型由编译器推导为int
int a = 3, b = 4;
[=] {return a + 3; };
// 省略了返回值类型,无返回值类型
auto fun1 = [&](int c) {b = a + c; };
fun1(10);
cout << a << " " << b << endl;
// 各部分都很完善的lambda函数
auto fun2 = [=, &b](int c)->int {return b += a + c; };
cout << fun2(10) << endl;
// 复制捕捉x
int x = 10;
auto add_x = [x](int a) mutable { x *= 2; return a + x; };
cout << add_x(10) << endl;
cout << x << endl;
return 0;
}
通过上述例子可以看出,lambda表达式实际上可以理解为无名函数,该函数无法直接调
用,如果想要直接调用,可借助auto将其赋值给一个变量
捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。
int a = 10;
auto lmd = [a] () mutable {
cout << a << endl; // 10
a += 2; // 合法操作,并且不影响 lambda 表达式外面的变量a的值
cout << a << endl; // 12
};
cout << a << endl; // 10
#include <iostream>
using namespace std;
int main()
{
int a = 10, b = 4;
auto lamb = [&a, &b](int&& x, int&& y) -> void {
cout << a << " " << b << " " << x << " " << y << endl;
};
lamb(1, 2);
return 0;
}
struct S
{
int x;
int y;
}s[2];
struct CmpFun //仿函数进行排序
{
bool operator()(const S& ls, const S& rs)
{
if (ls.x == rs.x)return ls.y > rs.y;
return ls.x > rs.x;
}
};
int main()
{
s[0].x = 0, s[0].y = 2;
s[1].x = 0, s[1].y = 3;
sort(s, s + sizeof(s) / sizeof(s[0]), [](S& a, S& b) { //左闭右开区间
if (a.x == b.x)
return a.y > b.y;
return a.x > b.x;
});
//sort(s, s + sizeof(s) / sizeof(s[0]), CmpFun());
for (auto e : s)
cout << e.x << " " << e.y << endl;
return 0;
}