C++探索:一句话说清楚什么是Lambda表达式
一、 什么是Lambda表达式
Lambda表达式,也称为匿名函数,它的作用,它允许你在需要函数的地方内联地定义函数,而 无需单独命名函数,即可以充当普通函数使用。
什么叫做“内联”:简单解释,就是可以减少函数调用开销,适用于小型函数。
而什么是内联函数?可以看我的另一篇文章:
先简单地了解Lambda表达式的基本形式以及其各部分的含义
[capture clause](parameters) -> return_type { // 函数体 // 可以使用捕获列表中的变量 return expression; // 可选的返回语句 }1.捕获列表 【capture clause】
用于捕获Lambda外部的变量,可以在表达式内部访问这些被捕获的变量;捕获列表可以为空,也可以包含变量列表【value1,value2,value3】
2.参数列表(parameters)
与普通函数的参数列表类似,可以为空或包含参数列表 (param1,
param2, ...) 。
3.返回类型(return_type)
用于指定Lambda表达式可以显式地指定其返回类型,同时,也可以通过“auto”关键字,来自动推断返回类型。如果表达式只有一条返回语句,可以省略返回类型。
4.函数体(body)
:包含需要执行的代码。
二、应用范围
在C++ 中,Lambda表达式主要有如下运用
1.直接替代函数的作用
Lambda 表达式最简单的案例是在需要一个小型函数或临时函数时直接使用它。以下以计算两数之和的案例来解释: 常规函数:
#include <iostream> using namespace std; int get_sum(int a, int b) { return a+b;//构建函数,实现两数之和相加 } int main() { //初始化变量 int a = 0; int b = 0; int sum = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; sum = get_sum(a,b);//调用函数 cout<<"两个数之和是:"<< sum << endl; return 0; } 使用Lambda表达式:
#include <iostream> using namespace std; int main() { //初始化变量 int a = 0; int b = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; auto add =[](int c,int d){ return c+d;//Lambda表达式 }; int sum = add(a , b); cout<<"两个数之和是:"<< sum << endl; return 0; } 2.在回调函数中使用
常规使用:
#include <iostream> using namespace std; bool compare(int a ,int b){ return a > b;//返回a是否大于b的bool类型 } int get_max(int a, int b, bool(*point)(int ,int)){ if (point(a,b)){ return a; } else{ return b; } } int main() { //初始化变量 int a = 0; int b = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; int max = get_max(a,b,compare);//变量1,变量2, 函数指针 cout<<"两个数中较大的一个数是:"<< max << endl; return 0; } 使用Lambda表达式
#include <iostream> using namespace std; int get_max(int a, int b, bool(*point)(int ,int)){ if (point(a,b)){ return a; } else{ return b; } } int main() { //初始化变量 int a = 0; int b = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; int max = get_max(a,b,[](int a ,int b)->bool{ return a > b;});//变量1,变量2,Lambda表达式,直接传入执行数值比较的函数,而非函数指针 cout<<"两个数中较大的一个数是:"<< max << endl; return 0; } 3.带参数捕获的Lambda表达式
(1)按值部分参数捕获
捕获到表达式中的变量,不需要手动传入参数,类似于复制粘贴,但是并不可以修改值,可读不可写。
#include <iostream> using namespace std; int main() { //初始化变量 int a = 10; int b = 20; int c = 30; auto add =[a,b]()->int{ return a+b; }; int sum = add(); cout<<"两数字之和:"<< sum << endl; return 0; } (2)按值全局捕获
括号中的“=”代表从表达式外获取全部变量值,传入表达式中;同样不可以修改值的大小,可读不可写。
#include <iostream> using namespace std; int main() { //初始化变量 int a = 10; int b = 20; int c = 30; auto add =[=]()->int{ return a+b+c; }; int sum = add(); cout<<"数字之和:"<< sum << endl; return 0; } (3)引用全局捕获
括号中通过 “&”来引用的捕获外部变量的地址,类似于指针传入参数,因此可以修改参数的值,可读可写
#include <iostream> using namespace std; int main() { //初始化变量 int a = 10; int b = 20; int c = 30; auto add =[&]()->int{ a = 20; return a+b+c; }; int sum = add(); cout<<"数字之和:"<< sum << endl; return 0; }