1、简介
Lambda 表达式通常用于短小的函数实现,比如在算法中使用回调函数,或者在某些地方临时定义小的函数对象。
语言:捕获列表] (参数列表) -> 返回类型 {函数体},其中,捕获列表 指定哪些外部变量被捕获(可以按值捕获、按引用捕获等)。参数列表 与普通函数一样,指定参数。返回类型(可选) 如果省略,编译器会根据函数体推断返回类型。函数体 Lambda 表达式的实际内容。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
// Lambda 表达式:输出数组中的元素
std::vector<int> vec = {1, 2, 3, 4};
std::for_each(vec.begin(), vec.end(), [](int val) {
std::cout << val << " ";
});
std::cout << std::endl;
// Lambda 表达式:计算两个数的和
auto sum = [](int a, int b) -> int {
return a + b;
};
std::cout << "Sum: " << sum(5, 3) << std::endl;
return 0;
}
2、简单的 Lambda 表达式
没有捕获任何外部变量的 Lambda,接收一个 int
类型的参数,并输出它的值。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 定义一个 Lambda 表达式,输出整数
auto print = [](int val) { std::cout << val << " "; };
// 使用 Lambda 打印一个整数
print(10); // 输出: 10
cout << endl;
// 使用 Lambda 打印一个整数列表
vector<int> numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
print(num); // 输出: 1 2 3 4 5
}
return 0;
}
3、带有返回类型的 Lambda 表达式
Lambda 表达式接受两个 int
类型的参数并返回它们的和。通过 -> int
指定了返回类型。
#include <iostream>
int main() {
// Lambda expression for summing two integers
auto sum = [](int a, int b) -> int { return a + b; };
// Calling the lambda expression
int result = sum(5, 7);
// Output the result
std::cout << "The sum of 5 and 7 is: " << result << std::endl;
return 0;
}
4、返回类型推导
C++14 Lambda 表达式可以根据函数体自动推导返回类型,因此可以省略 ->
返回类型 部分。
#include <iostream>
int main() {
// Lambda expression for multiplying two integers
auto multiply = [](int a, int b) {
return a * b; // Automatically deduced return type
};
// Calling the lambda expression
std::cout << multiply(3, 4) << std::endl; // Output: 12
return 0;
}
5、使用场景
1)作为函数参数传递
Lambda 表达式最常见的使用场景之一是作为函数参数传递,尤其是用于自定义的算法或者处理函数。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 2, 8, 1, 3};
// 使用 Lambda 表达式自定义排序规则
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a < b; // 按升序排序
});
// 输出排序后的结果
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
2)延迟计算或事件处理
Lambda 表达式也可以用于延迟执行的场景,如在异步编程、回调函数中使用。
#include <iostream>
#include <thread>
#include <chrono>
int main() {
// Lambda 表达式作为回调函数
std::thread t([]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Task completed!" << std::endl;
});
// 等待线程完成
t.join();
return 0;
}
3)自定义算法
在自定义算法中使用 Lambda 表达式,可以减少冗长的代码,并提供更灵活的功能实现。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7};
// 使用 Lambda 表达式计算大于 4 的元素数量
int count = std::count_if(vec.begin(), vec.end(), [](int x) {
return x > 4;
});
std::cout << "Count of elements greater than 4: " << count << std::endl;
return 0;
}