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;
//定义一个简单的lambdaauto 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++ 中的相似之处和区别: