Lambda** 表达式 是一个源自阿隆佐·邱奇(Alonzo Church)——艾伦·图灵(Alan Turing)的老师——的术语。邱奇创立了 λ 演算 ,后来被证明和图灵机是等价的。
Lambda 表达式是 C++ 11 中最重要的新特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的。这样的场景其实有很多很多,所以匿名函数几乎是现代编程语言的标配。
个人总结:Lambda 表达式就是为了用于复用率很低的函数。
Lambda 表达式是 C++ 11 中最重要的新特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的(复用率很小的函数)。这样的场景其实有很多很多,所以匿名函数几乎是现代编程语言的标配。
C++新特性10_lambda表达式/匿名函数
1.Lambda 表达式基础
1.1 Lambda 表达式的基本语法
[捕获列表](参数列表) mutable(可选) 异常属性(即异常处理功能) -> 返回类型 {
// 函数体
}
[ caputrue ] ( params ) opt -> ret { body; };
1.2 举例
int foo(int a, int b) {
return a + b;
}
int main() {
//lambda表达式就是匿名函数(没有名字的函数)
//[]捕获列表;()参数列表;->int返回值;{}函数体;后的()代表传参
int c=[](int a, int b)->int {
//函数体
return a + b;
}(1,2);
}
1.3 性质
-
Lambda 表达式以一对中括号开始。
-
跟函数定义一样,我们有参数列表
-
跟正常的函数定义一样,我们会有一个函数体,里面会有 return 语句
-
Lambda 表达式一般不需要说明返回值(相当于 auto);有特殊情况需要说明时,则应使用箭头语法的方式
-
每个 lambda 表达式都有一个全局唯一的类型,要精确捕捉 lambda 表达式到一个变量中,只能通过 auto 声明的方式
2. lambda表达式的调用
前面的匿名函数只能在生成时使用,而想要复用怎么处理呢?
//函数体的整体可以存储起来,auto自动推导函数体类型
auto f = [](int a, int b)->int {
//函数体
return a + b;
};
//lambda的调用
c = f(1, 2);
3. 两个lambda的嵌套写法
//函数式编程:结果只取决于内部的参数,多线程,并发
int c=[](int n) {
return [n](int x) {
//内部表达式捕获外部的n的值
return n + x;
}(1);
}(2);
cout << c << endl;
结果:3
4. 两个lambda的嵌套写法的调用
//两个lambda的嵌套写法的调用
//adder=λn.(λx.(+ x n))
auto f = [](int n) {
return [n](int x) {
//内部表达式捕获外部的n的值
return n + x;
};
};
c = f(1)(2);//1的结果又将2作为参数
5. 学习视频地址:lambda表达式/匿名函数
6. 学习笔记:lambda表达式/匿名函数笔记