C++11:Lambda表达式详解和示例代码

2023-12-21 10:03:23

Lambda 表达式

Lambda 表达式是 C++11 引入的一种方便的编写匿名函数对象的方法。Lambda 表达式允许你在需要一个函数对象的地方编写一个内联的、未命名的函数。Lambda 表达式的基本语法如下:

[ capture_clause ] ( parameters ) -> return_type {
    function_body
}

其中各个部分的含义如下:

  • capture_clause:捕获列表,定义了 lambda 表达式可以从封闭作用域中捕获哪些变量以及如何捕获(通过值或引用)。
  • parameters:参数列表,与普通函数的参数列表类似。
  • return_type:返回类型,可以省略,编译器可以自动推导返回类型。
  • function_body:函数体,包含 lambda 表达式的代码块。

下面是一个 lambda 表达式的例子:

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

int main() {
    int factor = 2;
    std::vector<int> nums = {1, 2, 3, 4, 5};

    // 使用 lambda 表达式来修改 vector 中的每个元素
    std::for_each(nums.begin(), nums.end(), [factor](int &n) {
        n *= factor; // 每个元素乘以 factor
    });

    // 使用 lambda 表达式来打印 vector 中的每个元素
    std::for_each(nums.begin(), nums.end(), [](int n) { std::cout << n << ' '; });
    std::cout << std::endl;

    return 0;
}

立即调用 Lambda 函数的例子

你可以创建一个 lambda 表达式,并且立即调用它。下面是一个立即调用 lambda 表达式的例子:

#include <iostream>

int main() {
    // 定义并立即调用 lambda 表达式
    int result = [](int a, int b) -> int {
        return a + b;
    }(5, 3); // 传递参数 5 和 3

    std::cout << "The result is: " << result << std::endl; // 输出结果 8

    return 0;
}

Lambda 表达式的相关特性

  • 捕获列表:Lambda 表达式可以捕获外部作用域中的变量,这可以通过值([=])或引用([&])来实现。你也可以混合使用,或者捕获特定的变量。

  • 可变 Lambda:如果想在 lambda 表达式内修改通过值捕获的变量,需要在参数列表后添加 mutable 关键字。

  • 泛型 Lambda:C++14 引入了泛型 lambda,允许使用 auto 关键字来指定参数类型,使得 lambda 表达式能够接受不同类型的参数。

  • 返回类型推导:在 C++11 中,如果 lambda 表达式的函数体只包含一个返回语句,或者是一个构造函数调用,那么返回类型可以被自动推导。在 C++14 中,返回类型推导得到了改进,可以推导所有类型的返回值。

  • 捕获 this 指针:Lambda 表达式可以捕获类成员函数中的 this 指针,以便访问类的成员变量和成员函数。

  • 指定异常:Lambda 表达式可以指定异常规范,例如 noexcept,来告知编译器该 lambda 表达式是否会抛出异常。

文章来源:https://blog.csdn.net/qq_46348508/article/details/135121920
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。