📜  cpp lambda 函数 - C++ (1)

📅  最后修改于: 2023-12-03 15:14:16.341000             🧑  作者: Mango

C++ Lambda 函数

Lambda 函数是 C++11 中的一种新特性,它允许我们定义一个匿名函数。

Lambda 函数可以被认为是一个临时的、内联的函数对象。使用 Lambda 函数,我们可以写出更加简洁、高效的代码。

Lambda 语法

Lambda 函数的语法比较简单,可以归纳为以下几个部分:

[capture-list] (params) mutable exception-> return-type { body }

其中:

  • capture-list:捕获列表,用于捕获变量;
  • params:函数参数列表;
  • mutable:表示是否可以修改捕获的变量;
  • exception:异常规格;
  • return-type:返回类型;
  • body:函数体。

下面是一个简单的 Lambda 函数示例,将两个数相加:

auto add = [](int a, int b) -> int {
    return a + b;
};

Lambda 函数返回类型可以根据返回语句自动推导,可以省略不写:

auto add = [](int a, int b) {
    return a + b;
};
Lambda 捕获列表

Lambda 函数可以访问其所在范围内的变量,这些变量称为捕获的变量,捕获的方式称为捕获列表。

捕获列表可以分为以下几种情况:

1. 没有捕获任何变量

在这种情况下,Lambda 函数没有访问其所在范围内的任何变量:

[]() {
    // 函数体
}
2. 捕获外部的变量

在这种情况下,Lambda 函数可以访问其所在范围内的变量,但无法修改:

int a = 10;
auto func = [a]() {
    std::cout << "a = " << a << std::endl;
};
3. 按值捕获变量

在这种情况下,Lambda 函数会复制所捕获的变量到其内部:

int a = 10;
auto func = [=]() {
    std::cout << "a = " << a << std::endl;
};
4. 按引用捕获变量

在这种情况下,Lambda 函数会引用所捕获的变量,可以修改它们的值:

int a = 10;
auto func = [&a]() {
    ++a;
};
Lambda 应用

Lambda 函数可以应用于很多场景,比如:

1. STL 算法
// 将 v 中的元素都乘以 2
std::vector<int> v = {1, 2, 3};
std::transform(v.begin(), v.end(), v.begin(), [](int n){ return n * 2; });
2. 函数对象
// 使用 Lambda 函数实现函数对象
class MyFunctor {
public:
    MyFunctor(int n) : m_n(n) {}
    bool operator()(int x) const {
        return x == m_n;
    }
private:
    int m_n;
};
std::vector<int> v = {1, 2, 3};
auto it = std::find_if(v.begin(), v.end(), MyFunctor(2));
auto it2 = std::find_if(v.begin(), v.end(), [](int x){ return x == 2; });
3. 回调函数
// 使用 Lambda 函数实现回调函数
void do_something(int x, std::function<void(int)> callback) {
    callback(x);
}
do_something(42, [](int x){ std::cout << "x = " << x << std::endl; });
总结

Lambda 函数是一种方便、简洁、高效的函数对象,使用它可以让我们写出更加清晰、易读、易维护的代码。在 C++ 中,我们可以使用 Lambda 函数实现很多功能,比如 STL 算法、函数对象、回调函数等等。