Loading

c++ lambda表达式

C++ 中的 Lambda 表达式是一种匿名函数对象,允许你在需要的地方定义轻量级的临时函数,无需显式命名。它在现代 C++ 中被广泛用于简化代码,特别是作为回调函数或算法的参数。

基本语法

[capture](parameters) -> return_type { body }
  • [capture]:捕获列表,用于访问外部变量。
  • (parameters):参数列表(可选)。
  • -> return_type:返回类型(可选,可自动推导)。
  • { body }:函数体。

捕获列表 [capture]

控制如何从外部作用域获取变量:

  • 值捕获[x](复制变量)。
  • 引用捕获[&x](引用变量)。
  • 隐式捕获[=](值捕获所有变量)、[&](引用捕获所有变量)。
  • 混合捕获[&, x](默认引用,x 值捕获)、[=, &x](默认值,x 引用捕获)。

示例

1. 无参数、无捕获

auto greet = []() { std::cout << "Hello, Lambda!"; };
greet(); // 输出: Hello, Lambda!

2. 带参数和返回值

auto add = [](int a, int b) -> int { return a + b; };
std::cout << add(3, 4); // 输出: 7

3. 捕获外部变量

int x = 10;
auto multiply = [x](int a) { return a * x; };
std::cout << multiply(5); // 输出: 50(捕获了 x=10)

4. 引用捕获

int count = 0;
auto increment = [&count]() { count++; };
increment();
std::cout << count; // 输出: 1(修改了外部变量)

5. 作为算法参数

std::vector<int> nums = {1, 2, 3, 4};
std::for_each(nums.begin(), nums.end(), [](int num) {
    std::cout << num << " "; // 输出: 1 2 3 4
});

6. 复杂示例:排序自定义比较

std::vector<std::string> words = {"apple", "banana", "cherry"};
std::sort(words.begin(), words.end(), 
          [](const std::string& a, const std::string& b) {
              return a.size() < b.size(); // 按字符串长度排序
          });
// words 现在是: {"apple", "cherry", "banana"}

关键点

  1. 返回类型推导:如果省略 -> return_type,编译器会自动推导返回类型。

    auto sum = [](int a, int b) { return a + b; }; // 返回 int
    
  2. 可变 Lambda:使用 mutable 允许修改值捕获的变量(仅在 Lambda 内部有效)。

    int x = 5;
    auto modify = [x]() mutable { x++; }; // 允许修改 x 的副本
    
  3. 泛型 Lambda(C++14+):使用 auto 参数创建模板化函数。

    auto concat = [](auto a, auto b) { return a + b; };
    std::cout << concat(1, 2);      // 输出: 3
    std::cout << concat("a", "b");  // 输出: ab
    

适用场景

  • 简化回调函数(如 std::sortstd::for_each)。
  • 实现简单的闭包逻辑。
  • 避免为一次性函数命名。

注意事项

  • 生命周期问题:引用捕获时需确保被引用的变量在 Lambda 执行时仍然有效。
  • 性能:值捕获会复制变量,大型对象建议使用引用捕获。

Lambda 表达式是 C++ 中强大且灵活的特性,能显著提升代码的可读性和简洁性。

posted @ 2025-05-13 15:47  一只大学生  阅读(220)  评论(0)    收藏  举报