C++ 中的 Lambda 表达式是一种简洁的语法结构,容许在代码中间接定义和应用匿名函数。Lambda 表达式加强了代码的灵活性和可读性,特地是在解决算法、函数对象、事件处理、回调函数等场景下尤为有用。其个别格局如下:

[capture_list](parameter_list) -> return_type { function_body }

各局部具体阐明:

  1. 捕捉列表(Capture List)

    • [] 是捕捉列表开始的标记,能够为空或者蕴含以下几种捕捉形式:

      • = (值捕捉):捕捉内部作用域中的变量正本,对这些变量的批改不会影响原变量。

        int x = 10;auto l = [=]() { return x * 2; }; // 捕捉x的值,即便之后x扭转,l仍返回20
      • & (援用捕捉):捕捉内部作用域中变量的援用,对这些变量的批改会影响原变量。

        int y = 20;auto m = [&y]() { ++y; return y; }; // 捕捉y的援用,调用m会减少y的值
      • this 关键字:捕捉以后对象的指针,用于在成员函数外部拜访类的成员。
      • 不指定任何符号时,默认状况下是非动态局部变量的援用捕捉,同时也会捕捉所有通过值捕捉的内部变量。

      复合捕捉也是可能的,例如 [=,&z] 意味着除了 z 通过援用捕捉外,其余变量都通过值捕捉。

  2. 参数列表(Parameter List)

    • 这部分和惯例函数参数列表相似,用于定义Lambda承受的输出参数。

      auto add = [](int a, int b) { return a + b; };
  3. 返回类型(Return Type)

    • 应用 -> 后跟返回类型示意Lambda的返回值类型,不过在某些状况下能够省略,编译器能够依据函数体内的返回语句主动推断返回类型。

      // 显式指定返回类型auto multiply = [](int x, int y) -> int { return x * y; };// 主动推断返回类型auto divide = [](double x, double y) { return x / y; }; // 返回double
  4. 函数体(Function Body)

    • 蕴含Lambda所执行的操作,即理论的函数逻辑。

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

综合示例:

#include <iostream>#include <algorithm>int main() {    int numbers[]{1, 2, 3, 4, 5};    // 应用lambda表达式作为std::count_if的谓词    int count_divisible_by_3 = std::count_if(numbers, numbers+5, [](int n) { return n % 3 == 0; });    std::cout << "Numbers divisible by 3: " << count_divisible_by_3 << std::endl;    // 援用捕捉的例子    int total = 0;    auto accumulate_values = [&](int value) -> void {         total += value;     };    for (int i : numbers) {        accumulate_values(i);    }    std::cout << "Total of the numbers: " << total << std::endl;    return 0;}

在这个示例中:

  • 第一个lambda用于计算数组中能被3整除的元素个数,它没有捕捉任何内部变量,只有一个参数列表,并隐式推断出返回类型为bool。
  • 第二个lambda是一个无返回值的函数对象,捕捉了内部变量total并通过援用,使得每次调用时都能更新total的值。