C++的新特性:Lambda
C++11 引入的 Lambda 函数是一种用于创建匿名函数的特殊语法。Lambda 函数提供了一种更简洁、直观的方式来定义函数对象,它可以在需要时快速定义并使用函数,无需显式地定义一个具名函数。
Lambda 函数的语法如下:
[capture-list](parameter-list) -> return-type { function-body }
下面是 Lambda 函数的各个组成部分的说明:
- capture-list:捕获列表,用于捕获外部变量,可以为空或省略。捕获列表可以按值或按引用捕获外部变量,并指定捕获方式。
- parameter-list:参数列表,用于指定函数参数,可以为空或省略。与普通函数一样,可以指定参数的类型和名称。
- return-type:返回类型,用于指定函数的返回类型,可以为空或省略。当函数体中只有一个返回语句时,返回类型可以自动推导。
- function-body:函数体,用于定义函数的具体逻辑。
Lambda 函数可以直接在函数调用、函数对象、函数模板等地方使用。Lambda 函数被编译器转换为一个函数对象,可以像普通函数对象一样进行调用。
下面是一些 Lambda 函数的示例:
- Lambda 函数作为函数对象使用:
#include <iostream>
int main() {
// Lambda 函数作为函数对象使用
auto sum = [](int a, int b) {
return a + b;
};
int result = sum(3, 4);
std::cout << "Sum: " << result << std::endl;
return 0;
}
在这个示例中,我们定义了一个 Lambda 函数 sum,它接受两个整数参数并返回它们的和。然后,我们通过将 Lambda 函数赋值给 auto 类型的变量 sum,将其作为函数对象使用。我们可以像调用普通函数对象一样调用 sum,并输出结果。
- Lambda 函数作为算法的参数使用:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// Lambda 函数作为算法的参数使用
std::for_each(numbers.begin(), numbers.end(), [](int num) {
std::cout << num << " ";
});
std::cout << std::endl;
return 0;
}
在这个示例中,我们定义了一个 Lambda 函数,它用于输出给定整数的值。然后,我们使用 std::for_each 算法和 Lambda 函数作为参数,遍历一个整数向量并输出每个元素的值。
Lambda 函数的优点是:
- 简洁:Lambda 函数提供了一种紧凑、直观的语法,无需显式定义一个具名函数。
- 灵活:Lambda 函数可以在需要时快速定义并使用,无需在其他地方显式定义函数对象。
- 捕获外部变量:Lambda 函数可以通过捕获列表 [ ] 捕获外部变量,以在函数体内访问它们。
- 可调用对象:Lambda 函数被编译器转换为函数对象,可以像普通函数对象一样进行调用。
- 与算法函数配合:Lambda 函数可以直接作为算法函数的参数,使代码更加简洁和可读。
Lambda 函数在 C++ 中广泛应用于各种场景,如函数式编程、泛型编程、STL 算法、并发编程等。它提供了一种方便、灵活和可读性高的方式来定义和使用函数,使得代码更加简洁和可维护。