C++ 中的 Lambda 函数
- C++ 中 Lambda 函数的语法
- 在 C++ 中使用常规函数指针实现 Lambda 函数
-
在 C++ 中使用
std::function
实现 Lambda 函数 -
在 C++ 中使用
auto
实现 Lambda 函数 - 在 C++ 中使用 Lambda 函数
本文将详细讨论 C++ 中 Lambda 函数的语法和实现,以及相关示例。
在 C++ 中,Lambda 函数或匿名函数是在另一个函数中匿名定义的。它在源代码中内联编写,并作为参数传递给另一个接受可调用对象的函数。
这使得 C++ 程序员可以轻松快速地创建函数。这些函数没有名称,也没有被重用。
C++ 中 Lambda 函数的语法
一般语法:
[Capture List](Parameter List) { Function Body; }
Capture List
告诉编译器创建了一个 lambda 函数。
要在函数体内使用任何变量,首先,我们需要在捕获列表中捕获它。如果不这样做,它将超出函数体的范围。
捕获的变量可以作为副本或引用访问。捕获变量不被视为在普通函数中传递参数。
这里,a
是按值捕获的:
auto f = [a]() { return a * 9; };
在这里,a
是通过引用捕获的:
auto f = [&a]() { return a++; };
参数列表
,顾名思义,它像普通函数一样在其中接受参数。如果没有要传递的参数,它是可选的。
使用 ()
:
auto call_foo = [x]() { x.foo(); };
没有 ()
:
auto call_foo2 = [x] { x.foo(); };
上面这两个 lambda 函数具有相同的含义。
Function Body
包含要执行的代码,就像任何其他常规函数一样。
int mul = 5;
auto ans = [mul](int a) { return a * mul; };
std::out << ans(2);
输出:
5
C++ 中的 Lambda 函数示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
auto sum = [](int a, int b) { return a + b; };
cout << "Sum of two integers:" << sum(5, 5) << endl;
return 0;
}
输出:
Sum of two integers: 10
我们使用 auto
关键字来指示参数的数据类型将在运行时确定。这将在以下各节中进一步讨论。
在 C++ 中使用常规函数指针实现 Lambda 函数
我们可以使用函数指针在 C++ 中实现 lambda 函数。
int main() {
double (*addNum1)(double, double){[](double a, double b) { return (a + b); }};
addNum1(1, 2);
}
输出:
3
这里,*addNum1
是一个标准函数指针,仅适用于空捕获子句。之后,声明参数的类型 - double
、double
。
这称为函数原型。你可以观察到一个空的捕获子句,该子句指示为编译器创建了一个 Lambda 函数。
此外,在参数列表中传递了两个变量,double a
和 double b
。并且,在函数体内,返回这些变量的加法。
在 main 函数关闭后,函数 addNum(1,2)
被调用并返回 3 作为输出。
在 C++ 中使用 std::function
实现 Lambda 函数
std::function addNum{[](double a, double b) { return (a + b); }};
addNumbers2(3, 4);
输出:
7
std::function
将 lambda 函数作为参数和返回值传递。它允许你在模板中声明参数列表和返回值的确切类型。
在这里,参数列表中传递了两个变量,double a
和 double b
。并且,在函数体内,返回这些变量的加法。
在 main 函数关闭后,函数 addNum(1,2)
被调用并返回 7 作为输出。
在 C++ 中使用 auto
实现 Lambda 函数
auto addNum{[](double a, double b) { return (a + b); }};
addNum(5, 6);
return 0;
输出:
11
我们不能直接使用 lambda,因为它们没有类型。因此,当我们创建一个 lambda 函数时,编译器会构造一个唯一类型的参数。
虽然我们不知道它是什么类型的 lambda 函数,但是有很多方法可以在定义后保存它以供使用。使用 lambda 真实类型的唯一方法是通过 auto
。
将 Lambda 函数声明为 auto
后,可以在 C++ 程序中的任何位置使用。
在 C++ 中使用 Lambda 函数
Lambda 表达式通常用于封装算法以将它们传递给另一个函数。
lambda 函数可以在定义后立即执行:[ ](double a, double b)
。
{return (a + b)}(); // immediately executed lambda expression
{ return (a + b) } // simple code block
正如我们所见,lambda 表达式是重构复杂函数的有效工具。
然后可以逐步执行显式参数化过程,中间进行中间测试。一旦代码块被适当地参数化,将其重新定位到外部位置并使其成为正常功能。
Lambda 表达式还允许构建命名嵌套函数,这有助于删除不必要的逻辑。当将一个重要的函数作为参数传递给另一个函数时,使用命名的 lambdas 对眼睛来说更容易。
auto algo = [&](double x, double m, double b) -> double { return mx + b; };
int l = algorithm(1, 2, 3), m = algorithm(4, 5, 6);