一、解释
Lambda表达式是C++11引入的一种匿名函数的形式,他允许你在需要函数的地方内联的定义函数,而无需单独命名函数。
二、Lambda表达式基本语法如下:
[捕获列表] (参数列表) ->返回类型
[ capture clause ] (parpameters) -> return_tybe
{
函数体;
}
三、Lambda表达式由以下部分构成
(1)捕获列表: Lambda表达式可以自动推断返回类型(auto 关键字),也可以显示指定 返回类型 。
(2)参数列表
(3)返回类型:Lambda表达式可以自动推断返回类型,也可以显示指定返回类型
-> return_tybe(如果Lambda表达式的函数体只有一条return语句,并且 能够根据返回值推断出返回类型,那么也可以省略尾置返回类型,让编译 器自动推断返回类型。)
(4)函数体
附示例程序:
求两数之和。(用Lambda表达式)
/*
使用Lamada表达式求两数之和
Add()函数与Lambda表达式比较
*/
#include <iostream>
using namespace std;
/*
//求两数之和函数
int Add(int num1,int num2)
{
return num1 + num2;
}
*/
int main()
{
int num1;
int num2;
//预测函数的返回值 = [捕获列表](参数列表)->返回类型
//auto Add 给匿名函数起个名字
auto Add = [](int num1,int num2) ->int
{
return num1 + num2;
};
cout << "请分别输入数字a和数字b:" << endl;
cin >> num1 >> num2;
cout << "两数之和为:" <<Add(num1,num2);
return 0;
}
注:这里的 auto Add = [](int num1,int num2) ->int {return num1 + num2;};
为什么最后不加分号会报错,我查到的是不用加分号。要是有大佬浏览到这个
帖子,帮我解惑!!!
求两数最大值。(用Lambda表达式)
Lambda表达式在下文代码中的作用:
Lambda表达式在回调函数中的主要作用是简化代码,使代码更加清晰和易读。通过Lambda表达式,你可以在需要时定义和使用一个匿名的函数,而不必显式地定义一个单独的函数。这对于一次性使用的简单回调函数非常有用,避免了为每个简单的回调函数都创建一个独立的函数的繁琐。
/*
使用Lambda表达式求两数最大值(回调函数)
*/
#include <iostream>
using namespace std;
/*
bool Max(int num1,int num2)
{
return num1 > num2; //如果num1 > num2,则返回真
}
*/
int getMax(int num1,int num2,bool(*Max)(int num1,int num2))
{
if(Max(num1,num2))
{
return num1;
}
else
{
return num2;
}
}
int main()
{
int num1;
int num2;
cout << "请分别输入需要比较的两数:" << endl;
cin >> num1 >> num2;
cout << getMax(num1,num2,[](int num1,int num2)->bool
{return num1>num2;});
return 0;
}
四、参数捕捉 【重点内容】
1、示例代码:
#include <iostream>
using namespace std;
int main()
{
int x = 10;
int y = 20;
auto add = [x,y]()->int
{
return x + y;
};
cout << add();
return 0;
}
2、捕获列表设置方式(三种)
(1)捕获上下文中指定的参数
auto add = [x,y]()->int
{
return x+y
};
捕获是能修改变量值的,只能使用。
(2)捕获外部作用域中的所有变量
auto add = [=]()->int
{
return x+y
};
捕获是能修改变量值的,只能使用。
(3)用引用的方式来捕获,引用类似于C的指针,进行地址访问
auto add = [&]()->int
{
return x+y
};
1)&表示捕获外部作用域中的所有变量
2)使用&之后,可以对捕获内容的值进行修改
x = 15; //修改 x 的数值
补充内容:
1、内联函数:
(1)什么是内联函数
在C++中,内联函数是一种特殊的函数,它在被调用的地方会被直接展开,而不是像普通函数那样进行函数调用。内联函数的目的是减少函数调用的开销,因为在调用内联函数时,不需要进行函数调用的参数传递、栈帧的创建和销毁等操作,直接将函数的代码插入到调用的地方,从而提高程序的执行效率。
(2)内联函数的格式
inline int add()
{
}
(3)内联函数和匿名函数的区别
C++中的内联函数是在函数定义前加上inline关键字的函数,编译器会尝试将函数调用处直接替换为函数体,以减少函数调用的开销。内联函数通常适用于简单的、频繁调用的函数。
而匿名函数是指没有函数名的函数,通常通过lambda表达式来创建。匿名函数可以在需要时直接定义并使用,不需要专门定义函数名。匿名函数通常用于函数对象、回调函数等场景。
因此,内联函数和匿名函数的区别在于内联函数是有函数名的,用于优化函数调用开销;而匿名函数没有函数名,通常用于简单的、临时的函数定义。