关于c++11:lambda表达式

48次阅读

共计 1467 个字符,预计需要花费 4 分钟才能阅读完成。

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 的值。

正文完
 0