c++的lamda表达式

作用:

弥补了main函数里面不可以定义函数的缺陷,减少了全局变量的声明

可以在main里面搭建小的构件,如下:

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long
#define loop(n) for(int i=0;i<n;i++)
#define rloop(n) for(int i=n-1;i>=0;i--)
#define print(c) cout<<"this "#c" is "<<c<<endl;
#define MAX INT_MAX
#define MIN INT_MIN
const int N = 1010;

using namespace std;
void solve() {
    int n = 10;
    int a[10] = { 1,2,3,4,5,6,7,7,8,9 };
    auto check = [&](int j, int i) {//用来查重
        map<int, int> m;
        for (; j <= i; j++)
            if (m[a[j]] == 1)return 0;
            else m[a[j]]++;
        return 1;
        };
    auto f1 = [&]() {//用于返回最大的不重复子序列
        int count = 0;//窗口长度
        for (int i = 0,j=0; i < n; i++) {
            if (!check(j,i)){//如果不满足,计算窗口,并定位j
                count=max(count,i - j+1-1);//减去那个多余的a[i]
                j = i;
            }
            else if (i == n - 1) {//如果到了n-1没有满足上面的if的话,会使得count少计算最后一个count
                count = max(count, i - j + 1);
            }
        }
        return count;
    };
    cout << f1();
}
signed main() {
    ios;
    int n = 1;
    while (n--)solve();
}

语法:

auto f=[捕获部分]->返回类型(参数表){函数体};

解释:

1.auto

用auto是为了接收函数体的返回参数,就可以省略(->返回类型)这一步,让返回根据我的return自匹配

2.捕获部分

有&,=两种,介绍如下

#include<bits/stdc++.h>
#define int long long
#define loop(n) for(int i=0;i<n;i++)

using namespace std;
int* res;
int check(int l, int r, map<int, int> M, int k) {
    for (int i = l; i < r; i++) {
        if (k == 0)return 1;
        if (M[res[i]] > 0)M[res[i]]--, k--;
    }
    if (k > 0)return 0;
    else return 1;
}
void solve() {
    map<int, int> m;
    m[0] = 1;
    int k = 1,b=1;
//声明为&,自动捕获使用过的变量,作为传址
    auto f=[&](){
        b=1,m[0]=1;
    }
//声明为=,自动捕获使用过的变量,作为传值,附加const,不可作为左值
    auto F=[=](){
        int s=k;//这里的k不可以作为左值
        return s;
    }
//混合声明,如下,b为传值,m为传址
    auto i = [ b,&m ]() {
       m[0] = b;
        };
    i();
    cout << b << ' ' << k;
}
signed main() {
    int n = 1;
    //cin >> n;
    while (n--)solve();
}

3.递归

不推荐用lambda写递归,如需了解,一下给出链接

C++lambda递归的三种写法_c++ lamda 递归-CSDN博客

4.补充

这里有个缺点:如果捕获的是类或者容器等有成员方法的对象后,无法调用其方法

因为这里的传值是附加const,调用不了对象里面的方法,下图m[0]应该是调用了at()

如果想实现对象的传值,建议直接使用,作为参数

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值