C++ Lambda表达式 在竞赛中提高你的代码连贯性

本文中的lambda表达式使用方式应该在目前的所有比赛中(C++11及以上)都是可以使用的,因为比较落后的蓝桥杯都更新到了C++14。

当题目做的越来越多,难度越来越大,相应的代码就会越来越长,通常在100行左右。

在行数这么多的基础上,如果要使用递归函数,或者是sort的cmp函数,就会需要在int main上面定义函数(代码写着写着往上翻,再去写),会使思维方向和代码方向并不一致。

本文提到的Lambda表达式用法仅对竞赛和做题方面相性较高(用不到捕获列表[],出现它只是为了满足Lambda表达式的格式),如果要详细了解Lambda表达式请看:C++Lambda表达式,超详细的讲解,保证一遍懂_c++ lambda-CSDN博客

sort-cmp 正常写法

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int a[10];

bool cmp(int a,int b){
    return a<b;
}

int main(){
    sort(a+1,a+10,cmp);
    return 0;
}

sort-cmp Lambda函数

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int a[10];

int main(){
    auto cmp=[](int a,int b){//在代码量大的时候,不需要跑到前面去自定义函数
        return a<b;          //思维和代码的连贯性提高很多
    };
    sort(a+1,a+10,cmp);
    return 0;
}

sort-cmp Lambda匿名函数

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int a[10];

int main(){
    sort(a+1,a+10,[](int a,int b){return a<b;});// <- 当lambda作为匿名函数使用的时候就不需要最后的封号了
    return 0;
}

三种写法都可以,任取其一。


但是Lambda函数无法写成递归。

递归 Lambda函数 错误写法

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int a[10];

int main(){
    a[1]=2;
    a[2]=3;
    a[3]=4;
    a[4]=4;
    auto dfs=[](int i){
        cout<<i<<" ";
        if(i==a[i])return;
        dfs(a[i]);
    };//<- 这个封号千万别忘了,和结构体一样,是格式。
    return 0;
}

他会显示编译不通过,我们只需要稍作修改,把Lambda函数自己作为参数传进去使用即可。

递归 Lambda函数 正确写法

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int a[10];

int main(){
    a[1]=2;
    a[2]=3;
    a[3]=4;
    a[4]=4;
    auto dfs=[](int i,auto dfs){
        cout<<i<<" ";
        if(i==a[i])return;
        dfs(a[i],dfs);
    };dfs(1,dfs);// <- 函数定义了记得使用
    return 0;
}

输出

很明显可以看到lambda来写递归和原本的递归,就是多了一个把自己当参数传进去的步骤。

可以先写好原来的dfs,然后加上这么一个参数就好了。

如果使用的是CLion这种智慧编译器,如果你的Lambda函数还没有写好return就已经使用dfs(a[i],dfs)来递归调用自己,那就会不停的报错,是正常的,因为Lambda函数的返回值是auto,自动选取。

如果你已经使用了dfs(a[i],dfs),但是没有return,编译器不知道是否存在返回值,提示你写return部分。


tip:Lambda表达式写在哪里都可以,并不局限在main函数里面,也可以是多组数据处理的solve函数里面。

相关推荐
码小猿的CPP工坊几秒前
C++弱引用智能指针std::weak_ptr使用介绍
开发语言·c++
Σίσυφος19002 分钟前
线性与非线性 、齐次非齐次
算法
暮色_年华8 分钟前
随想3:关于语音采集线程 使用 CFS 调度或者 SCHED_FIFO 的思考
c++
Flash.kkl10 分钟前
Linux——线程的同步和互斥
linux·开发语言·c++
(❁´◡`❁)Jimmy(❁´◡`❁)14 分钟前
4815. 【NOIP2016提高A组五校联考4】ksum
算法
无限码力42 分钟前
科大讯飞秋招笔试真题 - 字符拼接 & 字典序最小的字符串拼接 & 圆心覆盖
算法·秋招·科大讯飞·科大讯飞笔试真题
Lips61144 分钟前
第四章 决策树
算法·决策树·机器学习
CoderCodingNo1 小时前
【GESP】C++六级考试大纲知识点梳理, (3) 哈夫曼编码与格雷码
开发语言·数据结构·c++
YuTaoShao1 小时前
【LeetCode 每日一题】2053. 数组中第 K 个独一无二的字符串
算法·leetcode·职场和发展
纵有疾風起1 小时前
【Linux 系统开发】基础开发工具详解:自动化构建、版本控制与调试器开发实战
linux·服务器·开发语言·c++·经验分享·开源·bash