2024/6/21 11:20:09
Lambda 表达式的主要目的是为了简化函数对象(或称为函数符)的创建和使用。传统的函数对象需要定义一个具名的类或者使用函数指针,而Lambda 表达式可以在需要时直接定义一个匿名函数,从而减少代码量和提高代码的可读性。
Lambda 表达式的语法
在 C++ 中,Lambda 表达式的基本语法如下:
[capture list] (parameters) -> return_type {
// Lambda 表达式的函数体
}
其中各部分的含义解释如下:
捕获列表 (capture list):指定 Lambda 表达式访问的外部变量。可以为空,或者包含捕获的变量以及捕获方式。捕获方式可以是按值捕获([=])或按引用捕获([&]),也可以指定具体的变量进行捕获([x, &y])。
参数列表 (parameters):与普通函数的参数列表类似,可以为空或包含一个或多个参数。
返回类型 (return_type):指定 Lambda 表达式的返回类型。可以显式指定,也可以使用 auto 进行类型推导。
函数体:Lambda 表达式的实际代码部分,与普通函数体的语法相同。
Lambda 表达式的使用规则
捕获外部变量:Lambda 表达式可以在定义时捕获外部作用域的变量,捕获方式包括按值、按引用或混合捕获。
参数列表:Lambda 表达式可以接受参数,参数可以有类型声明,也可以根据上下文使用 auto 进行类型推导。
返回类型:Lambda 表达式可以显式指定返回类型,也可以使用 auto 进行自动推导。
函数体:Lambda 表达式的函数体可以包含多条语句,可以访问捕获的变量和参数。
C++ 中的常用用法示例
作为 STL 算法的谓词:
cpp
std::vector numbers = {1, 2, 3, 4, 5};
// Lambda 表达式作为 std::find_if 的谓词,查找第一个偶数
auto it = std::find_if(numbers.begin(), numbers.end(), [](int n) { return n % 2 == 0; });
自定义排序准则:
cpp
std::vectorstd::string words = {“apple”, “orange”, “banana”, “grape”};
// Lambda 表达式作为 std::sort 的比较准则,按字符串长度排序
std::sort(words.begin(), words.end(), [](const std::string& a, const std::string& b) {
return a.size() < b.size();
});
多线程编程中的使用:
cpp
#include
#include
int main() {
int num = 10;
// Lambda 表达式作为线程函数,捕获外部变量 num
std::thread t(&num {
std::cout << "Thread started, num = " << num << std::endl;
});
t.join();
return 0;
}
Lambda 表达式使得代码更加紧凑、易读,并且可以方便地在需要时定义函数对象,而无需显式地创建一个命名的函数或类。