目录

为什么需要 Lambda?

什么是 Lambda? 

Lambda 的本质

 Lambda 的标准语法结构

Lambda 的本质是什么? 

 Lambda 的核心能力:捕获外部变量(闭包)

 什么时候使用Lambda?

 一句话总结:

为什么需要 Lambda?

在 C++ 中,如果你需要写一个很小的函数来传入另一个函数,比如排序时的比较器:

bool compare(int a, int b) {
    return a > b;
}

std::sort(arr.begin(), arr.end(), compare);

看起来很正常对吧?

但这时你可能会想:

  • 这个 compare 函数只在排序用一次;

  • 它很短,写成一个函数有点浪费;

  • 我要是能直接在参数位置写一小段逻辑,该多好?

于是你就有了一个第一性问题:

 能不能像变量一样,把一段代码当作“值”传来传去?

 答案是 ✅ 可以!这就是——Lambda 表达式(匿名函数)

什么是 Lambda? 

Lambda 就是 可以定义在表达式中的“匿名函数”,你可以像变量一样定义、传递、调用它! 

它允许你“像写变量一样写函数”。 

Lambda 的本质

  • 没有名字(匿名)

  • 可以立即定义 + 使用

  • 可以捕获外部变量(这点非常强大!)

  • 类型可以自动推导(或用 auto)

 Lambda 的标准语法结构

[capture](params) -> return_type {
    // function body
}
部分含义
[capture]捕获外部变量(闭包)
(params)参数列表(可以省略)
-> type返回值类型(可省略)
{...}函数体

 ✅ 示例 1:最简单的 Lambda

auto f = []() {
    std::cout << "Hello from lambda\n";
};

f();  // 调用 lambda

✅ 示例 2:有参数、有返回值

auto add = [](int a, int b) -> int {
    return a + b;
};

std::cout << add(3, 4);  // 输出 7

 ✅ 示例 3:省略返回类型(自动推导)

auto mul = [](int x, int y) {
    return x * y;
};

Lambda 的本质是什么? 

Lambda 是编译器生成的匿名类对象(函数对象)

比如:

auto f = [](int a, int b) { return a + b; };

等价于: 

struct __Lambda_123 {
    int operator()(int a, int b) const {
        return a + b;
    }
};

__Lambda_123 f;

 也就是说:

Lambda 是一个自动生成的“带 operator() 的匿名类对象”!

 

 Lambda 的核心能力:捕获外部变量(闭包)

这是 Lambda 的最大亮点 —— 像函数对象一样“带着数据跑” 

int x = 10;
auto f = [x]() {
    std::cout << x << std::endl;
};

 x 被值拷贝进 lambda,之后 lambda 使用的是副本

捕获方式总览

写法含义
[ ]不捕获任何变量
[x]按值捕获 x
[&x]按引用捕获 x
[=]所有用到的外部变量按值捕获
[&]所有用到的外部变量按引用捕获
[=, &y]默认按值捕获,但 y 按引用捕获
[&, x]默认按引用捕获,但 x 按值捕获

 什么时候使用Lambda?

✅ 1. 配合标准算法(排序、查找) 

std::vector<int> nums = {5, 2, 8, 1};

std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return a > b;  // 降序
});

 ✅ 2. 作为回调函数使用

void run(int a, int b, std::function<int(int, int)> op) {
    std::cout << op(a, b) << std::endl;
}

run(3, 4, [](int x, int y) { return x * y; });  // 输出 12

 ✅ 3. 写一次性逻辑(不污染全局命名空间)

[]() {
    std::cout << "Just run once" << std::endl;
}();

 ✅ 4. 实现局部函数/延迟执行

auto later = []() {
    std::cout << "I’ll run later.\n";
};
// 之后某个地方调用
later();

 一句话总结:

Lambda 是现代 C++ 的匿名函数利器,它让你可以像操作变量一样操作函数,让函数更短、更灵活、更局部、更智能。 

更多推荐