• Lambda 表达式


    在现代 C++ 编程中,Lambda 表达式是一个非常强大且灵活的工具。它可以帮助我们编写更简洁,更清晰,更易于理解的代码。在本文中,我们将详细介绍如何在 C++ 中使用 Lambda 表达式.

    什么是 Lambda 表达式

    Lambda 表达式,也称为匿名函数,是一种在 C++11 中引入的新特性。它允许我们在需要函数的地方直接定义并使用函数,而无需事先声明。以下是一个简单的 Lambda 表达式示例:

    auto lambda = [](int x, int y) { return x + y; };
    int result = lambda(5, 3);  // 结果为8
    
    • 1
    • 2

    上述代码中,我们定义了一个 Lambda 表达式 lambda,它接受两个整数参数 x 和 y,并返回它们的和。然后,我们调用了这个 Lambda 表达式,输入 5 和 3,并将结果存储在 result 中。
    Lambda 表达式的语法
    Lambda 表达式的基本语法如下:
    [捕获列表] (参数列表) mutable (可选) noexcept (可选) -> 返回类型 (可选) { 函数体 }
    捕获列表:定义了外部变量的访问方式。可以是值捕获([=])或引用捕获([&]),也可以是混合模式([=, &x] 或 [&, x])。空捕获列表 [] 表示 Lambda 表达式不能访问任何外部变量。
    参数列表:就像常规函数一样,定义了 Lambda 表达式接受的参数。
    mutable:如果 Lambda 表达式需要修改通过值捕获的外部变量,需要使用 mutable 关键字。
    noexcept:如果 Lambda 表达式保证不会抛出异常,可以使用 noexcept 关键字。
    返回类型:可以显式指定 Lambda 表达式的返回类型。如果省略,编译器会自动推断。
    函数体:定义了 Lambda 表达式的操作。
    Lambda 表达式的应用
    Lambda 表达式可以用于许多情况,例如排序、查找、线程同步等。下面是一些常见的示例。
    例1:排序
    假设我们有一个人员对象列表,每个对象都有姓名和年龄属性。我们希望按年龄对这些对象进行排序。以下是如何使用 Lambda 表达式实现这一点:

    struct Person {
        std::string name;
        int age;
    };
    
    std::vector<Person> people = {{"Tom", 23}, {"Jerry", 20}, {"Spike", 25}};
    
    std::sort(people.begin(), people.end(), [](const Person &a, const Person &b) {
        return a.age < b.age;
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在此代码中,我们使用 Lambda 表达式作为 std::sort 函数的第三个参数。这个 Lambda 表达式接受两个 Person 对象作为参数,并返回一个布尔值,表示 a 是否应该在 b 之前。
    例2:线程同步
    使用 Lambda 表达式,我们可以简洁地在多线程环境中使用互斥量。

    std::mutex m;
    int shared_var = 0;
    
    auto increment = [&]() {
        std::lock_guard<std::mutex> lock(m);
        ++shared_var;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在此代码中,我们使用了 Lambda 表达式来封装对互斥量的锁定和对共享变量的修改。
    结论
    Lambda 表达式是现代 C++ 的一个重要特性。它提供了一种简洁且强大的方式来定义和使用匿名函数,使我们的代码更具可读性和灵活性。通过了解和熟练使用 Lambda 表达式,可以提高我们的编程效率。

  • 相关阅读:
    java计算机毕业设计智能推荐二手车交易网站源码+mysql数据库+系统+部署+lw文档
    人工智能:人工神经网络的应用场景
    7-1 sdut-oop-5 计算长方体和四棱锥的表面积和体积(类的继承) (10分)
    TMS570快速上手指南(1)--环境准备和LED闪烁
    vue3学习——封装菜单栏
    SQLite数据库的增删改查基本操作
    py14_Python 流程控制之简单认识 while/for 循环判断结构
    用jad反编译工具查看java接口相关的默认修饰符
    电动两轮车驶入“年轻化”新赛道,新老品牌谁能率先突围?
    Java 定时任务技术发展历程
  • 原文地址:https://blog.csdn.net/weixin_40933653/article/details/133317188