本文参考:C++ primer Plus。
Lambda函数又称Lambda表达式。
1. lambda函数的基本形式。
lambda函数与普通的函数类似,在普通函数上进行了匿名和省略。其基本形式:[](){}
[](){};
// [] : 代替函数名
// () : 代替函数传入的参数
// {} : 函数的实现
//例如:
[](int x) {return x % 3 == 0}; // lambda表达式
bool function(int x) {return x % 3 == 0}; //与上面的lambda表达式的效果相同
2. lambda函数的返回值
lambda函数没有声明返回类型,返回类型相当于使用decltyp根据返回值推断得到。如下所示:
[](int x) {return x % 3 == 0}; // lambda表达式
注意:仅当lambda表达式完全由一条返回语句组成,自动推断才管用。否则采用新增的返回类型后置法实现。
[](double x)->double{int y = x; return x - y}; // return type is double
3. lambda参数的获取
lambda可以访问作用域内的任何动态变量,可将要捕获使用的变量,放到中括号内,根据需要有如下几种方式。
[z] // 按值访问变量z
[&z] // 按引用访问变量z
[&] // 按引用访问所有的动态变量
[=] // 按值访问所有的动态变量
[&,z] // 按值访问z,按引用访问其他动态变量
//例如:
[&count][int x] {count += x; return count;};
4. lambda指定名称
可以给lambda表达式指定名称,在程序中多次调用。如下所示:
auto mods = [](int x) {return x % 3 == 0}; // 指定lambda表达式的名称
count1 = std::count_if(n1.begin(), n1.end(), mods); // 按名称调用表达式
count2 = std::count_if(n2.begin(), n2.end(), mods); // 再次按名称访问lambda表达式
5. lambda表达式的用途
lambda与函数有很多相似的地方,但是也有一些区别。
-
简洁
lambda表达式,形式简单。而且定义和使用的位置离得比较近,代码阅读更加简单直观。
-
定义在函数内部
lambda可以定义在函数内部,函数不能定义在其他函数内部。
-
根据类型,自动识别返回值类型
可以根据返回语句,自动识别返回值类型(仅当lambda表达式完全由一条返回语句组成)
-
访问作用域内的任何动态变量。