匿名函数
竞赛/技巧
C++ 匿名函数 (Lambda 表达式)
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v = {5, 3, 1, 4, 2};
// 基本Lambda格式: [capture\](parameters){bparametersody}
sort(v.begin(), v.end(), [](int a, int b) {
return a > b; // 降序排序
});
for(auto x : v) {
printf("%d ", x); // 输出: 5 4 3 2 1
}
puts("");
// 带捕获列表的Lambda
int base = 100;
auto add = [base](int x) {
return x + base;
};
printf("%d\n", add(5)); // 输出105
}
C 语言匿名函数 (GCC扩展)
#include <stdio.h>
#include <stdlib.h>
// GCC的嵌套函数扩展 (不是标准C)
void c_style() {
int cmp(const void *a, const void *b) {
return *(int*)b - *(int*)a; // 降序排序
}
int arr[] = {5, 3, 1, 4, 2};
qsort(arr, 5, sizeof(int), cmp);
for(int i=0; i<5; i++) {
printf("%d ", arr[i]); // 输出: 5 4 3 2 1
}
puts("");
}
int main() {
c_style();
return 0;
}
主要区别对比表:
| 特性 | C++ Lambda | C 嵌套函数(GCC) |
|---|---|---|
| 标准支持 | C++11及以上标准 | GCC扩展,非标准C |
| 捕获外部变量 | 支持([=]/[&]/[a,&b]等) | 只能访问外层函数的局部变量 |
| 用作回调函数 | 可以直接传递 | 需要转换为函数指针 |
| 生命周期 | 可以返回和存储 | 只能在定义它的函数内使用 |
| 典型应用场景 | STL算法回调、异步编程等 | 仅限于当前函数内部使用 |
你的风格实现建议:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 1. 简单Lambda - 排序
int arr[] = {3,1,4,5,9,2,6};
sort(arr, arr+7, [](int a, int b){
return a > b; // 降序
});
// 2. 带捕获的Lambda - 计算
int k = 10;
auto func = [k](int x) {
printf("%d\n", x + k);
};
func(5); // 输出15
// 3. 在STL算法中使用
vector<int> v = {5,3,1,4,2};
for_each(v.begin(), v.end(), [](int x){
printf("%d ", x);
});
}
注意事项:
-
C++ Lambda是真正的闭包,可以捕获外部变量
-
C的嵌套函数只是语法糖,实际还是普通函数
-
在工程代码中,C++推荐用Lambda,C语言建议用普通函数
-
Lambda的捕获列表:
-
[=]值捕获 -
[&]引用捕获 -
[a,&b]混合捕获
-

浙公网安备 33010602011771号