基本语法
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++ 程序员带来很大的收益。