C++ `Lambda` 函数完整指南
C++ Lambda
函数完整指南
Lambda
函数(匿名函数)是 C++11 引入的一个强大特性,它允许在 函数内部 定义简洁的 匿名函数对象,并且可以 捕获外部变量,用于 回调函数、并发编程、STL 算法 等场景。
1. Lambda
语法
[capture](parameters) -> return_type { body }
部分 | 作用 |
---|---|
[capture] | 捕获外部变量 |
(parameters) | 参数列表(可以为空) |
-> return_type | 返回类型(可省略,自动推导) |
{ body } | 函数体 |
2. 最简单的 Lambda
#include <iostream>
int main() {
auto hello = []() { std::cout << "Hello, Lambda!\n"; };
hello(); // ✅ 调用 Lambda
}
📌 Lambda 赋值给 auto
,可以随时调用!
📌 省略 ()
也可以
[] { std::cout << "Hello, Lambda!\n"; }();
✅ 直接调用 Lambda
!
3. 带参数的 Lambda
auto add = [](int a, int b) { return a + b; };
std::cout << add(3, 5); // 输出:8
📌 参数列表 (int a, int b)
类似普通函数。
4. Lambda
的捕获([capture]
)
(1)按值 [=]
捕获
int x = 10;
auto lambda = [=]() { std::cout << x; };
lambda(); // ✅ 复制 x(不会修改原值)
📌 外部 x
复制到 Lambda
内部,不可修改。
(2)按引用 [&]
捕获
int x = 10;
auto lambda = [&]() { x = 20; };
lambda();
std::cout << x; // ✅ x 被修改为 20
📌 x
传引用,允许 Lambda
修改外部变量。
(3)指定捕获 [x]
or [&x]
int x = 10, y = 20;
auto lambda1 = [x]() { std::cout << x; }; // ✅ 仅捕获 x
auto lambda2 = [&y]() { y = 30; }; // ✅ 仅捕获 y 引用
(4)混合捕获 [=, &y]
int x = 10, y = 20;
auto lambda = [=, &y]() { y = x + 5; };
lambda();
std::cout << y; // ✅ 25
📌 x
复制,y
通过引用传递。
5. Lambda
返回类型
(1)自动推导
auto add = [](int a, int b) { return a + b; }; // 自动推导 int
(2)手动指定返回类型
auto divide = [](double a, double b) -> float { return a / b; };
📌 -> float
强制返回 float
,否则自动推导为 double
。
6. Lambda
作为参数
Lambda
可以作为参数传递给函数,例如 STL 算法:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x * x << " "; });
}
📌 在 for_each()
里传递 Lambda
进行平方计算。
7. Lambda
作为返回值
auto makeLambda() {
return [](int a, int b) { return a + b; };
}
int main() {
auto add = makeLambda();
std::cout << add(3, 4); // ✅ 7
}
📌 Lambda
作为返回值,返回函数对象。
8. Lambda
存储到 std::function
(C++11)
#include <functional>
std::function<int(int, int)> func = [](int a, int b) { return a + b; };
std::cout << func(10, 20); // ✅ 30
📌 std::function
可以存储 Lambda
,用于回调函数。
9. mutable
允许修改值捕获的变量
int x = 10;
auto lambda = [x]() mutable { x += 5; std::cout << x; };
lambda(); // ✅ 输出 15
std::cout << x; // ❌ x 仍然是 10(原 x 没有变)
📌 mutable
允许修改 x
的副本,但不影响原 x
!
10. Lambda
在多线程中的使用
#include <iostream>
#include <thread>
int main() {
std::thread t([] { std::cout << "Hello from thread!\n"; });
t.join();
}
📌 Lambda
直接传递给 std::thread
进行并行执行!
11. Lambda
适用场景
✅ 替代函数指针(std::function
)
✅ STL 算法(for_each, sort, transform
)
✅ 多线程(std::thread, std::async
)
✅ 回调函数(事件处理、网络通信)
✅ 函数式编程(组合函数)
12. Lambda
vs 普通函数
功能 | Lambda | 普通函数 |
---|---|---|
是否匿名 | ✅ 是 | ❌ 需要名字 |
是否支持外部变量 | ✅ 支持 [capture] | ❌ 需要手动传参 |
适用于 STL 算法 | ✅ 适合 | ❌ 需要额外定义 |
类型推导 | ✅ 自动推导 | ❌ 需要显式返回类型 |
性能 | ✅ 无额外开销 | ✅ 一样快 |
🚀 C++ 开发推荐使用 Lambda
,可读性强,避免定义额外的函数! 🚀