在STL中,往往会使用到函数对象(仿函数—即对operator()的重载),因此需要编写好多函数对象类,有的函数对象类只需要定义一个对象,并且只使用一次,造成浪费。为了解决这个问题,Lambda表达式横空出世!
1.Lambda 格式
Lambda 表达式的定义形式如下:
[外部变量访问方式说明符] (参数表) -> 返回值类型
{ 语句块 }“外部变量访问方式说明符”可以是=或&,表示{}中用到的、定义在{}外面的变量在{}中是否允许被改变。=表示不允许,&表示允许。当然,在{}中也可以不使用定义在外面的变量。“-> 返回值类型”可以省略。
2.一个合法的 Lambda 表达式
[=](int x, int y) -> bool {
return x%10 < y %10;
}
3.Lambda 表达式的应用
Lambda表达式实际上是一个函数,只是它没有名字,那么如何使用Lambda表达式?
int a[4] = {5, 7, 4, 6};
sort(a, a+4, [=](int x, int y)->bool {return x < y;} );
for_each(a, a+4, [=](int x) {cout << x << "";} );
使用外部变量的Lambda表达式
#include <iosream>
#include <algorithm>
using namespace std;
int main() {
int a[] = { 3, 4, 5, 6 };
int total = 0;
for_each(a, a+4, [&](int &x) {total += x; x *= 2; });
// Lambda表达式的含义是,将a中所有元素累加,并且将每个元素扩大两倍
// [&]表示该Lambda表达式中的变量total是传引用的,可以在表达式执行过程中被改变。如果使用[=],将无法通过编译。
for_each(a, a+4, [=](int x) {cout << x << " ";});
return 0;
}
/*********
更灵活的用法:
[=, &x, &y] 表示外部变量x, y的值可以被修改,而其余外部变量不可以
[&, x, y] 表示外部变量除x, y以外的值都可以被修改,x, y则不可以。
**********/
int x = 10, y = 20;
int m = 5, n = 7;
auto ret = [=, &x, &y](int num) {
// 除x, y外其余变量只读
x = m;
y = n;
return num*num;
}
// 可以将 ret 当做仿函数使用,以10位参数调用Lambda表达式
cout << ret(10); // 打印100
cout << x << y; // x -> 5, y -> 7