竞赛/技巧
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("");// 带捕获列表的Lambdaint 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]
混合捕获
-