Lambda背景
- Lambda来自lambda calculus(λ演算,如果有兴趣,可以看这篇文章http://cgnail.github.io/academic/lambda-1/)——一种定义和应用函数的数学系统。
- Lambda 表达式之所以是 C++ 11 新增特性中最激动人心的一个,究其原因是其在距离、简洁、效率和功能上都让人耳目一新。引入的主要目的是让你能够将类似于函数的表达式用作接受函数指针或函数符的函数的参数。大部分人可能会被这句话绕晕,简单的说就是把运算过程尽量写成一系列嵌套的函数调用。
- 标准 C++库中有一个常用算法的库,其中提供了很多算法函数,比如 sort() 、find()、count_if()等。这些函数通常需要提供一个“谓词函数 predicate function”。所谓谓词函数,就是进行一个操作用的临时函数。比如 find() 需要一个谓词,用于查找元素满足的条件;能够满足谓词函数的元素才会被查找出来。这样的谓词函数,使用临时的匿名函数,既可以减少函数数量,又会让代码变得清晰易读。
Lambda简介
重点来啦!!
lambda表达式的语法归纳如下:
[ caputrue ] ( params ) opt -> ret { body; };
1. capture是捕获列表;
2. params是参数表;(选填)
3. opt是函数选项;可以填mutable,exception,attribute(选填)
(a)mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。
(b)exception说明lambda表达式是否抛出异常以及何种异常
(c)attribute用来声明属性。
4. ret是返回值类型。(选填)
5. body是函数体。
捕获列表:lambda表达式的捕获列表精细控制了lambda表达式能够访问的外部变量,以及如何访问这些变量。
符号 | 含义 |
---|---|
[] | 不捕获任何变量 |
[&] | 捕获外部作用域中所有变量,并作为引用在函数体中使用(引用传递) |
[=] | 捕获外部作用域中所有变量,并作为副本在函数体中使用(值传递)。 |
[=,&foo] | 按值捕获外部作用域中所有变量,并按引用捕获foo变量。 |
[bar] | 按值捕获bar变量,同时不捕获其他变量。 |
[this] | 捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。 |
Lambda的程序示例
#include <vector>
#include "iostream"
#include <algorithm>
#include <functional>
//由浅到深,循序渐进的感受lambda的神奇之处,相信会为你的程序增加亮点,同时也希望各位批评指正。
void lambda_one() {
std::cout << std::endl << "----------没有函数参数的lambda---------" << std::endl;
auto fun = []() {};
auto fun1 = []() { std::cout << "fun1" << std::endl; };
fun1();
std::cout << std::endl << "--------for_each中使用简单的lambda------" << std::endl;
std::vector<int> v(3, 5);
for_each(v.begin(), v.end(), [](int num) { std::cout << num << "\t"; });
std::cout << std::endl << "---------设置lambda的返回值类型--------" << std::endl;
std::cout << [](double a, double b) { return a + b; }(1.4, 2.5) << std::endl;