Lambda 表达式是 C++11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而 无需单独命名函数
Lambda 表达式的基本语法如下:
[ capture clause](parameters)->return_type{
// 函数体
// 可以使用捕获列表中的变量
return expression; // 可选的返回语句
};
捕获列表(Capture clause):用于捕获外部变量,在 Lambda 表达式中可以访问这些变量。捕 获列表可以为空,也可以包含变量列表 [var1, var2, ...] 。
参数列表(Parameters):与普通函数的参数列表类似,可以为空或包含参数列表 (param1, param2, ...) 。
返回类型(Return type):Lambda 表达式可以自动推断返回类型auto,也可以显式指定返回类 型 -> return_type 。如果函数体只有一条返回语句,可以省略返回类型。
函数体(Body):Lambda 表达式的函数体,包含需要执行的代码。
Lambda 表达式的基本用法:作为一种简洁而快速的方式来定义小型函数。
auto
是 C++11 引入的关键字,用于简化变量的类型声明。它让编译器根据变量的初始值自动推断出变量的类型。这有助于减少代码中的冗长类型声明,提高代码的可读性和可维护性。auto x = 5; // x 的类型是 int auto y = 3.14; // y 的类型是 double
#include <iostream>
using namespace std;
int main()
{
int x = 20;
int y = 10;
//定义一个简单的lambda
auto add = [](int a,int b)->int {
return a+b;
};
int ret = add(x,y);
cout<<ret<<endl;
return 0;
}
回调函数:
指一种将函数作为参数传递给另一个函数的编程技术,函数作为参数传递
#include <iostream>
using namespace std;
bool myCompare(int a,int b){
return a>b;
}
int getMax(int a,int b,bool (*compare)(int ,int )){
if(compare(a,b)){
return a;
}else {
return b;
}
}
int main()
{
int x = 20;
int y = 10;
int ret = getMax(x,y,&myCompare);
cout<<ret<<endl;
return 0;
}
使用匿名 Lambda 函数来返回两个数中的较大数
#include <iostream>
using namespace std;
int getMax(int a,int b,bool (*compare)(int ,int )){
if(compare(a,b)){
return a;
}else {
return b;
}
}
int main()
{
int x = 20;
int y = 70;
int ret = getMax(x,y,[](int a,int b)->bool{
return a>b;
});
cout<< "the large num is:" <<ret<<endl;
return 0;
}
捕获列表(3种)
#include <iostream>
using namespace std;
int main()
{
int x = 10;
int y = 20;
int z = 5;
auto add = [x,y]()->int{ //捕获x,y变量,无法修改,只能读
return x+y;
};
int ret = add();
cout<<ret<<endl;
auto mul= [=]()->int{ //捕获所有变量,无法修改,只能读
return x*y*z;
};
ret = mul();
cout<<ret<<endl;
//引用的方式来捕获,
auto modfyandMUL = [&]()->int{ //捕获的变量可以修改
x = 15;
return x*y*z;
};
ret = modfyandMUL();
cout<<ret<<endl;
return 0;
}
第一个 Lambda 表达式 ret按值捕获了 x 和 y (即它们的副本)。这意味着 ret内的 x 和 y 是在 Lambda 定义时的值的拷贝。
第二个 Lambda 表达式 multiply 使用 [=] 捕获列表,这表示它按值捕获所有外部变量。
第三个 Lambda 表达式 modifyAndSum 使用 [&] 捕获列表,这表示它按引用捕获所有外部变量。 因此,它可以修改 x 和 y 的原始值。
概述了 Lambda 函数和内联函数在 C++ 中的相似之处和区别: