C++ 中的 Lambda 函数

Anam Javed 2023年1月30日 2022年4月20日
  1. C++ 中 Lambda 函数的语法
  2. 在 C++ 中使用常规函数指针实现 Lambda 函数
  3. 在 C++ 中使用 std::function 实现 Lambda 函数
  4. 在 C++ 中使用 auto 实现 Lambda 函数
  5. 在 C++ 中使用 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 是一个标准函数指针,仅适用于空捕获子句。之后,声明参数的类型 - doubledouble

这称为函数原型。你可以观察到一个空的捕获子句,该子句指示为编译器创建了一个 Lambda 函数。

此外,在参数列表中传递了两个变量,double adouble 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 adouble 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);
注意
Lambda 也可以是通用的并用于所有数据类型。