关于 C++ lambda 表达式
2026-02-10 13:32:13
发布于:广东
1)lambda 是什么
lambda 就是 “临时的小函数”,不用起名字,写完就能用。
像这样:
auto f = [](int x){ return x + 1; };
cout << f(5) << "\n"; // 6
auto f:把这个小函数存起来,名字叫 f[]:先放一个“捕捉盒子”(下面讲)(int x):参数{ return x + 1; }:函数做什么
2)竞赛里第一重要:sort 自定义排序
想让 sort 按你想要的规则排,就用 lambda:
降序(从大到小)
sort(a.begin(), a.end(), [](int x, int y){
return x > y;
});
记法:比较器要回答“x 应不应该排在 y 前面?”
x > y 就是“大在前”。
3)竞赛里第二重要:用外面的变量(捕获)
有时候排序规则要用到外面一个 k:
int k = 3;
sort(a.begin(), a.end(), [k](int x, int y){
return (x % k) < (y % k);
});
这里的 [k] 意思是:把外面的 k 复制一份带进 lambda。
捕获最常用只记两种就够了
[&]:全都用“引用”(能直接改外面的变量)[x]或[k]:只把某个变量复制带进来
例子:累加和(会改外面的 sum)
long long sum = 0;
for (int x : a) {
auto add = [&](int v){ sum += v; }; // [&] 常写成 [&]
add(x);
}
更常见写法是直接:
long long sum = 0;
for (int x : a) sum += x;
但我用它是为了让你理解 [&]:能改外面的 sum。
竞赛建议:
- 你在
main里写小工具函数,基本都用[&](方便)。 - 但别把这个 lambda “拿到外面去长期用”(会有生命周期坑,竞赛一般不这么写)。
4)竞赛里第三重要:二分里的 check(mid)
经典写法:把 check 写成 lambda,直接用外面的数组、n、k 等。
auto check = [&](int mid) -> bool {
// 用外面的数据判断 mid 行不行
return true;
};
int l = 0, r = 1e9;
while (l < r) {
int mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid + 1;
}
你只要记住:
auto check = [&](int mid)->bool{...};就是一个小函数[&]让它能直接用外面的变量
5)竞赛里第四重要:递归 DFS(C++14 必背)
lambda 没名字,所以它“自己叫自己”会麻烦。C++14 最常用固定模板:
auto dfs = [&](auto&& self, int u) -> void {
// ...处理 u
for (int v : g[u]) {
self(self, v);
}
};
dfs(dfs, 1);
6)你只需要记住的“4 个模板”
- 普通小函数
auto f = [](int x){ return x+1; };
sort比较器
sort(a.begin(), a.end(), [](int x,int y){ return x>y; });
- 用外部变量(最常用)
auto work = [&](int x){ /* 用外面的变量 */ };
- 递归 DFS(C++14)
auto dfs = [&](auto&& self,int u)->void{ self(self,u); };
全部评论 4
ddd
1周前 来自 广东
1
1周前 来自 广东
0长脑子了=
1周前 来自 广东
0666
1周前 来自 广东
0



























有帮助,赞一个