lambda函数C++
时间: 2025-01-08 14:00:05 浏览: 4
### C++ Lambda 函数概述
C++11 引入了 Lambda 表达式,这是一种简洁的匿名函数定义方式[^3]。通过这种机制,可以在需要的地方快速定义小型函数对象,而不需要显式的命名和声明。
#### 基本结构
Lambda 表达式的一般形式如下:
```cpp
[capture](parameters) -> return_type {
// function body
}
```
- `capture`:用于指定如何捕捉外部作用域中的变量。
- `parameters`:参数列表,类似于常规函数。
- `return_type`:可选部分,默认情况下编译器可以根据返回语句推断返回类型。
- `{}`:函数体,包含要执行的具体逻辑。
#### 捕捉列表
捕捉列表决定了哪些局部变量可以从包围它的范围传递给 lambda 表达式内部使用。常见的几种情况有:
- **按值捕获** (`[=]`):复制所有使用的局部变量到 lambda 中;
- **按引用捕获** (`[&]`):让 lambda 访问并修改原始变量;
- **混合模式**:可以选择特定变量按值或按引用来捕获,例如 `[a, &b]` 将 a 按值捕获,b 则按引用。
#### 实际应用场景
##### 工厂方法与闭包
可以通过 lambda 返回一个带有状态的对象,即所谓的“闭包”。下面是一个创建加法运算符的例子[^1]:
```cpp
#include <iostream>
using namespace std;
// 定义一个函数,返回一个 Lambda表达式,实现两个数的加法
auto make_adder(int x) {
return [x](int y) -> int {
return x + y;
};
}
int main() {
// 调用函数,得到一个 Lambda表达式
auto add5 = make_adder(5);
// 调用 Lambda表达式
cout << add5(10) << endl; // 输出 15
return 0;
}
```
这段代码展示了如何利用 lambda 创建动态行为——这里构建了一个能够根据不同输入调整自身功能的小型计算器。
##### 多线程编程
另一个典型的应用场景是在并发环境中简化回调处理。考虑一个多线程程序,在主线程之外启动多个子线程来异步运行某些任务[^5]:
```cpp
#include <iostream>
#include <vector>
#include <thread>
void run_threads() {
vector<thread> threads;
for (int i = 0; i < 5; ++i) {
threads.emplace_back([i]() {
cout << "Hello from thread " << i << endl;
});
}
// Wait for all threads to complete.
for (auto& t : threads) {
if(t.joinable()) t.join();
}
}
```
此片段说明了如何轻松地将工作分配给不同的线程,并且每个线程都携带了自己的唯一标识符 `i` 来打印消息。
---
阅读全文