lambda表达式

捕获列表是 lambda 表达式的重要组成,用于指定 lambda 可以访问的外部变量。通过捕获列表,控制 lambda 对外部作用域中变量的访问方式。
函数

式子

捕获列表的语法

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

捕获方式

  1. 按值捕获:

    • 语法: [x][=]
    • 将外部变量的副本传递给 lambda,lambda 内部对该变量的修改不会影响外部变量。
    • 示例:
      int a = 10;
      auto lambda = [a]() { return a + 5; }; // a 被按值捕获
      
  2. 按引用捕获:

    • 语法: [&x][&]
    • 将外部变量的引用传递给 lambda,lambda 内部对该变量的修改会影响外部变量。
    • 示例:
      int a = 10;
      auto lambda = [&a]() { a += 5; }; // a 被按引用捕获
      lambda(); // a 现在是 15
      
  3. 混合捕获:

    • 可以同时按值和按引用捕获不同的变量。
    • 示例:
      int a = 10, b = 20;
      auto lambda = [a, &b]() { return a + b; }; // a 按值捕获,b 按引用捕获
      

捕获列表的特性

  • 空捕获列表: [] 表示 lambda 不捕获任何外部变量。
  • 捕获所有变量: [=] 表示按值捕获所有外部变量,[&] 表示按引用捕获所有外部变量。
  • 作用域: 捕获列表中的变量必须在 lambda 定义时可用。

使用场景

  • 算法和 STL 函数: 在使用 STL 函数(如 std::sortstd::for_each 等)时,常常需要传递自定义的比较或处理逻辑,这时可以使用 lambda 表达式和捕获列表。
  • 简化代码: 使用 lambda 表达式可以让代码更简洁,避免了定义单独的函数。

示例

以下是一个简单的示例,展示了捕获列表的用法:

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

int main() {
    int threshold = 5;
    std::vector<int> numbers = {1, 2, 3, 6, 7, 8};

    // 使用 lambda 表达式和捕获列表
    auto count = std::count_if(numbers.begin(), numbers.end(), [threshold](int n) {
        return n > threshold; // 使用捕获的外部变量 threshold
    });

    std::cout << "Numbers greater than " << threshold << ": " << count << std::endl;
    return 0;
}

在这个例子中,threshold 被按值捕获,lambda 表达式可以使用它来判断数组中的元素。

posted @ 2024-11-06 17:36  cat_sleep  阅读(59)  评论(0)    收藏  举报