C++ Lambda表达式

Lambda表达式

Lambda表达式是C++ 11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而无需单独命名函数,常用于简化代码、实现回调函数或配合 STL 算法使用。

基本语法结构

Lambda表达式的基本语法如下:

[捕获列表](参数列表) -> 返回类型{
  // 函数体
  // 可以使用捕获列表中的变量
  return expression; //可选的返回语句 
}
  • 捕获列表(Capture List) :定义Lambda如何访问外部变量。
  • 参数列表(Parameter List):与普通函数的参数列表类似。
  • 返回类型(Return Type):可省略,由编译器自动推导。
  • 函数体(Body):具体的实现逻辑

捕获列表(Capture List)

捕获列表决定了Lambda如何访问外部作用域的变量:

  • []:不捕获任何外部变量。
  • [=]:按值捕获所有外部变量(副本)。
  • [&]:按引用捕获所有外部变量。
  • [var]:按值捕获特定变量var
  • [&var]:按引用捕获特定变量var
  • 混合捕获:例如[=, &x]表示按值捕获所有变量,但x按引用捕获。

示例:

int a = 1, b = 2;
auto lambda = [a, &b]() {
    // a 是值捕获(只读),b 是引用捕获(可修改)
    b = a + b; // 合法
    // a = 3;    // 错误:按值捕获的变量默认不可修改(除非用 mutable)
};

参数列表与返回类型

  • 参数列表:与普通函数已知,支持默认参数(C++14起)。
  • 返回类型:可显式指定(-> type),或由return语句自动推导。

示例:

// 自动推导返回类型(int)
auto add = [](int x, int y) { return x + y; };

// 显式指定返回类型(double)
auto divide = [](int x, int y) -> double {
    if (y == 0) return 0.0;
    return static_cast<double>(x) / y;
};

mutable关键字

默认情况下,按值捕获的变量在Lambda内是只读的。若需修改副本,需使用mutable关键字:

int count = 0;
auto counter = [count]() mutable {
    count++; // 修改的是 Lambda 内部的副本
    return count;
};

Lambda的应用场景

(1)STL排序算法中的谓词

std::vector<int> nums = {3, 1, 4, 1, 5};
// 使用 Lambda 排序(降序)
std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return a > b;
});

(2)异步回调

#include <thread>
std::thread t([&]() {
    // 在后台线程中执行的操作
});
t.join();

(3)简化函数对象

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

注意事项

  • 生命周期问题:按引用捕获的变量可能在Lambda执行时已销毁,导致未定义行为。
  • 性能:Lambda是编译器生成的匿名类对象,小规模使用性能接近普通函数。
  • 泛型Lambda(C++14+):支持auto参数:
auto generic = [](auto x, auto y) { return x + y; };
posted @ 2025-02-10 17:30  风陵南  阅读(110)  评论(0)    收藏  举报