匿名函数

竞赛/技巧

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);
    });
}

注意事项:

  1. C++ Lambda是真正的闭包,可以捕获外部变量

  2. C的嵌套函数只是语法糖,实际还是普通函数

  3. 在工程代码中,C++推荐用Lambda,C语言建议用普通函数

  4. Lambda的捕获列表:

    • [=] 值捕获

    • [&] 引用捕获

    • [a,&b] 混合捕获

posted @ 2025-09-24 17:11  stephen_zuo  阅读(29)  评论(0)    收藏  举报