c++: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++ 的匿名函数利器,它让你可以像操作变量一样操作函数,让函数更短、更灵活、更局部、更智能。
更多推荐


所有评论(0)