作用:
弥补了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()
如果想实现对象的传值,建议直接使用,作为参数