C++ lambda表达式

172 阅读1分钟

基本语法

C++ lambda 表达式的基本语法如下:

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

其中,capture list 用于捕获外部变量,parameter list 为参数列表,return type 为返回值类型,function body 为函数体。

捕获外部变量

在 capture list 中可以指定要捕获的外部变量,格式为 []、[&]、[=] 或 [var1, var2, ...]:

  • []:不捕获任何外部变量。
  • [&]:按引用捕获所有外部变量。
  • [=]:按值捕获所有外部变量。
  • [var1, var2, ...]:按值捕获指定的外部变量。

例如,下面的代码演示了如何使用 lambda 捕获外部变量:

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    auto f = [x](int i) -> int { return x + i; };
    cout << f(3) << endl;
    return 0;
}

上述代码定义了一个 lambda,它捕获了变量 x,并将其与参数 i 相加后返回结果。

参数列表和返回值

lambda 的参数列表和返回值与普通函数类似,可以省略参数列表和返回值类型。例如:

auto f = [](int i) { cout << "i = " << i << endl; };
f(5);  // 输出 i = 5

在上面的例子中,lambda 定义了一个参数为 int 类型的函数,没有返回值。

函数体

lambda 的函数体可以包含多条语句,也可以是单个表达式。如果函数体只有一条表达式,可以省略花括号和 return 语句。例如:

auto f = [](int i) { return i * i; };
auto g = [](int i) -> int {
    int sum = 0;
    for (int j = 0; j <= i; j++) {
        sum += j;
    }
    return sum;
};

上述代码分别定义了两个 lambda,一个计算平方,一个计算累加和。

示例

以下是一个完整的示例,演示了如何使用 lambda 来对容器进行排序:

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

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

上述代码使用 lambda 定义了一个谓词函数,用于对容器进行升序排列。

总结

C++ lambda 是一种强大的编程工具,它可以简化代码、提高效率,使代码更加易读易懂。学习并掌握 C++ lambda 的基本语法和用法,可以为 C++ 程序员带来很大的收益。