C++中 lambda表达式详细介绍

在C++中,Lambda表达式是C++11引入的一项重要特性,它允许您定义匿名函数,以便在函数式编程范式中进行函数传递和高阶函数操作;Lambda表达式通常用于需要传递函数作为参数的场景,或者在代码中需要定义简单的、一次性的函数时非常方便。

Lambda表达式的基本语法如下:

[capture](parameters) -> return_type { body }

其中:

capture:用于捕获外部变量的方式,可以是值捕获([var])、引用捕获([&var])或者混合捕获([=]或[&])。Lambda函数可以通过捕获外部变量来访问它们,捕获方式决定了Lambda函数对外部变量的访问权限和生命周期。
parameters:Lambda函数的参数列表,可以包含零个或多个参数,多个参数之间用逗号分隔。参数列表可以省略类型说明符,由编译器根据上下文推断参数类型。
return_type:Lambda函数的返回类型,可以省略,由编译器根据返回语句推断返回类型。
body:Lambda函数的函数体,包含Lambda函数的执行逻辑。

1.值捕获(Value Capture):
通过值捕获,Lambda 函数可以访问外部变量的拷贝,并在函数体内部使用这些拷贝。捕获的变量在 Lambda 函数被创建时进行拷贝,因此 Lambda 函数可以在后续执行过程中独立于原始变量进行操作。
值捕获通过在 Lambda 表达式的方括号内指定变量名的方式进行,例如 [x, y]。
值捕获的优点是可以避免外部变量发生变化时影响 Lambda
函数的行为,但缺点是可能会导致内存消耗增加,特别是对于大型对象或者拷贝开销较大的对象。

2.引用捕获(Reference Capture):
通过引用捕获,Lambda 函数可以直接引用外部变量,而不是对其进行拷贝。这意味着Lambda 函数内部对变量的修改会影响到外部变量本身。
引用捕获通过在方括号内使用 & 符号指定变量名的方式进行,例如 [&x, &y]。
引用捕获的优点是可以节省内存,并且可以确保 Lambda 函数始终使用外部变量的最新值,但缺点是可能导致潜在的悬垂引用问题,尤其是当Lambda 函数的生命周期超出了外部变量的生命周期时。

3.混合捕获(Mixed Capture):
通过混合捕获,Lambda 函数可以同时捕获外部变量的拷贝和引用。这允许 Lambda函数在函数体内部既可以访问外部变量的当前值,又可以修改其副本。
混合捕获通过在方括号内混合使用值捕获和引用捕获的方式进行,例如 [=,&x] 或 [x, &]。
混合捕获的优点是灵活性较高,可以根据需求选择合适的捕获方式,但同时也增加了代码的复杂性和理解难度。
捕获方式的选择取决于具体的使用场景和需求,需要权衡内存消耗、访问权限和生命周期等因素。

Lambda表达式各种常用示例

1、最简单的C++ Lambda 表达式是没有捕获变量、没有参数、没有返回值的。

[]() { std::cout << "Hello, Lambda!" << std::endl; }

这个 Lambda 表达式不捕获任何外部变量([]),没有参数(()),并且没有返回值。它的函数体简单地打印一条消息。

2、Lambda函数可以根据需要捕获外部变量,可以有参数列表和返回类型,函数体可以包含复杂的计算逻辑。例如:

#include <iostream>

int main() {
    int x = 10;
    int y = 20;
   // 以值的方式进行捕获
    auto add = [x, y]() -> int {
        return x + y;
    };

    std::cout << "Sum: " << add() << std::endl;  // 输出:Sum: 30

    return 0;
}

这个 Lambda 表达式是以 值的方式进行捕获,没有函数参数,返回值是int的,函数体执行 x + y 的结果。

3、Lambda函数可以像普通函数一样调用,通过调用Lambda函数来执行其中的计算逻辑。
Lambda函数通常与标准库的算法一起使用,比如std::for_each()、std::transform()和std::sort()等,以便对容器进行遍历、转换和排序。例如:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    
    // 使用Lambda函数对容器元素进行遍历
    std::for_each(numbers.begin(), numbers.end(), [](int num) {
        std::cout << num << " ";
    });
    std::cout << std::endl;  // 输出:1 2 3 4 5
    
    // 使用Lambda函数对容器元素进行转换
    std::transform(numbers.begin(), numbers.end(), numbers.begin(), [](int num) {
        return num * num;
    });
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;  // 输出:1 4 9 16 25
    
    // 使用Lambda函数对容器元素进行排序
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a > b;  // 降序排序
    });
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;  // 输出:25 16 9 4 1

    return 0;
}

Lambda表达式是C++中的一项强大特性,可以提高代码的可读性和可维护性,尤其是在需要编写简短、一次性函数或者需要传递函数作为参数的场景下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碧 波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值