lambda 体
发布于: 2025-10-26 更新于: 2025-10-26 分类于: OI 阅读次数: 

什么是 lambda

lambda 表达式(体) 是 C++11 引入的一种匿名函数(既没有名字的函数),可以在函数内部快速定义一个小型函数,并在当前作用域中使用。

它的一般形式如下:

1
2
3
[捕获列表] (参数列表) -> 返回类型 {
函数体;
}

各部分的含义

捕获列表

表示这个 lambda 按引用捕获 的外部变量。

也就是说,lambda 内部可以访问的作用域里面的变量。

  • [&]:按引用捕获所有外部变量(可修改变量值并直接应用到外部);
  • [=]:按值捕获所有外部变量(不能修改外部变量本身);
  • [&x,y]:按引用捕获 x,按值捕获 y`;
  • [this]:捕获当前类对象的 this 指针。

示例:

1
auto f=[&](int num) -> int { ... };

参数列表

就跟普通的函数一样,上面这个例子就接受一个 int 类型的 num 变量。

返回类型

可以不写,编译器会自动推断,但是为了清晰,这里建议显示写成返回值类型。

函数体

就是 lambda 的内容。

示例:

1
2
3
auto f=[&](int a,int b) -> int {
return a+b;
}

为什么使用 lambda

如果我们现在要求一个数组的一段的和,那么我们可以通过 sum(r)-sum(l-1) 求出,如果要封装函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int sum(vector<int> a,int x) {
int ans=0;
for (int i=1;i<=x;i++) ans+=a[i];
return ans;
}
void solve() {
int n; cin >> n;
vector<int> a(n+1,0);
for (int i=1;i<=n;i++) cin >> a[i];
int q; cin >> q;
for (int i=1;i<=q;i++) {
int l,r; cin >> l >> r;
cout << sum(a,r)-sum(a,l) << endl;
}
}

由于每次都要引入 a,不仅程序变慢,并且代码很冗长,还要反复传参。

而 lambda 允许我们:

  • 在函数内部直接定义;

  • 直接访问外层的变量;

  • 更加局部化(不污染全局命名空间)。

所以我们可以直接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void solve() {
int n; cin >> n;
vector<int> a(n+1,0);
for (int i=1;i<=n;i++) cin >> a[i];
int q; cin >> q;
auto sum=[&](int x)->int {
int ans=0;
for (int i=1;i<=x;i++) ans+=a[i];
return ans;
};
for (int i=1;i<=q;i++) {
int l,r; cin >> l >> r;
cout << sum(a,r)-sum(a,l) << endl;
}
}

比之前方便多了qwq。


你学会了吗qwq

--- 本文结束 The End ---