📜  C++中的Lambda表达式(1)

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

C++中的Lambda表达式

Lambda表达式是C++11中新增的一项特性,它可以让我们更方便地定义匿名函数,并且可以捕获外部变量。本文将介绍Lambda表达式的基本语法和用法。

Lambda表达式的基本语法

Lambda表达式的语法形式如下:

[capture list] (parameter list) -> return type {
    // lambda function body
};

其中,capture list(可选部分)用于指定Lambda表达式所能访问的外部变量;parameter list(可选部分)用于指定参数列表;return type(可选部分)用于指定返回值类型;lambda function body(必选部分)用于定义函数体。

举个例子:

int main() {
    [] () {
        cout << "Hello, world!" << endl;
    }();
    
    return 0;
}

输出结果为:

Hello, world!

在这个例子中,我们定义了一个不带参数的Lambda函数,直接在调用后加上一对括号就可以立即执行。

再来一个稍微复杂一些的Lambda函数定义:

int main() {
    auto add = [] (int x, int y) -> int {
        return x + y;
    };
    
    cout << add(1, 2) << endl;
    
    return 0;
}

输出结果为:

3

在这个例子中,我们定义了一个带参数的Lambda函数,并且指定了返回值类型为int,我们把它赋值给了一个auto类型的变量add,然后我们可以像调用普通函数一样调用这个Lambda函数。

Lambda表达式的变量捕获

Lambda表达式可以捕获外部变量。有3种方式可以指定Lambda表达式所能访问的外部变量:

  1. 捕获局部变量
  2. 捕获传递进来的参数
  3. 捕获所有的外部变量
捕获局部变量

捕获局部变量可以像下面这样:

int main() {
    int x = 10;
    
    auto f = [&x] () {
        cout << x << endl;
    };
    
    x = 20;
    
    f();
    
    return 0;
}

输出结果为:

20

在Lambda表达式的方括号中,我们使用&x的方式捕获了变量x。这意味着Lambda表达式可以访问和修改变量x的值。

捕获传递进来的参数

我们也可以捕获传递进来的参数,例如:

int main() {
    auto f = [] (int x) {
        cout << x << endl;
    };
    
    f(10);
    
    return 0;
}

输出结果为:

10

在这个例子中,我们定义了一个带参数的Lambda函数,然后我们把参数10传递给这个函数。

捕获所有的外部变量

我们也可以在方括号中使用&的方式捕获所有的外部变量,例如:

int main() {
    int x = 10;
    int y = 20;
    
    auto f = [&] () {
        cout << x << " " << y << endl;
    };
    
    x = 30;
    y = 40;
    
    f();
    
    return 0;
}

输出结果为:

30 40

在这个例子中,我们使用了&的方式来捕获所有的外部变量,这意味着Lambda表达式可以访问和修改所有的外部变量。

Lambda表达式的应用场景

Lambda表达式可以解决很多问题,例如:

  1. STL算法中的用法,例如for_each函数;
  2. 做延迟计算,例如std::function
  3. 实现回调函数;
  4. 简化代码。

举个简单的例子,我们可以使用Lambda表达式来排序一个vector:

int main() {
    vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
    
    sort(v.begin(), v.end(), [] (int x, int y) {
        return x < y;
    });
    
    for (int i : v) {
        cout << i << " ";
    }
    cout << endl;
    
    return 0;
}

输出结果为:

1 1 2 3 4 5 6 9

在这个例子中,我们使用Lambda表达式作为排序函数的第三个参数,它指定了如何比较两个元素的大小。这样,我们就不需要再定义一个比较函数,从而简化了代码。