Lambda 表达式在 C++中是一个非常强大且灵活的特性,它在以下场景中会特别有用:

1. 算法

Lambda 表达式可以用来简化代码,特别是在需要定义短小的匿名函数时。例如,在 STL 算法(如std::sort)中传递自定义比较函数时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
std::vector<int> vec = {1, 5, 3, 4, 2};
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a < b;
});
for (int n : vec) {
std::cout << n << " ";
}
return 0;
}
1
2
3
4
auto it = std::find_if(m_servers.begin(), m_servers.end(),
[&](const VxiServerInfo& server) {
return server.session_name == session_name;
});

2. 捕获局部变量

Lambda 表达式可以捕获所在作用域内的变量,这样可以在回调或处理函数中使用这些变量,而不需要传递额外的参数:

1
2
3
4
5
int x = 10;
auto add_x = [x](int y) {
return x + y;
};
std::cout << add_x(5) << std::endl; // 输出 15

3. 并行和异步编程

在并行和异步编程中,lambda 表达式经常用于定义线程函数或异步任务的工作内容。例如,使用std::async

1
2
3
4
5
6
7
8
9
10
11
12
#include <future>
#include <iostream>

int main() {
auto future = std::async([]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
});
std::cout << "等待结果..." << std::endl;
std::cout << "结果是: " << future.get() << std::endl;
return 0;
}

4. 事件处理

在 GUI 编程或事件驱动的编程模型中,lambda 表达式可用于定义事件处理器:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <functional>
#include <iostream>

void button_click(std::function<void()> callback) {
callback();
}

int main() {
button_click([]() {
std::cout << "按钮被点击了!" << std::endl;
});
return 0;
}

5. 通用编程

在模板编程中,lambda 表达式可以用作函数对象,特别是在需要高效、内联的函数对象时:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

template <typename Func>
void apply(Func func) {
std::cout << func(5) << std::endl;
}

int main() {
apply([](int x) { return x * x; }); // 输出25
return 0;
}

通过使用 lambda 表达式,你可以写出更简洁、高效和易于维护的代码。