匿名函数是函数式编程风格(Functional Programming Style)的基石
简单地说,就是可以在需要的地方定义函数,而不是提前定义好才能用
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+5;
struct ts{
int a,b,c;
};
ts tss[maxn];
int n;
void getdata()
{
for(int i=0;i<n;i++){
tss[i].a=rand();
tss[i].b=rand();
tss[i].c=rand();
}
}
int main()
{
scanf("%d",&n);
getdata();
sort(tss,tss+n,[](const ts&t1,const ts&t2){
if(t1.a!=t2.a){
return t1.a<t2.a;
}
if(t1.b!=t2.b){
return t1.b<t2.b;
}
return t1.c<t2.c;
});
for(int i=0;i<n;i++){
cout<<tss[i].a<<" "<<tss[i].b<<" "<<tss[i].c<<endl;
}
return 0;
}
利用C++的lambda函数内部也可以对外围作用域的变量进行捕捉,下面代码中的lambda函数内部要对total变量进行写操作,所以声明的[&toal]部分对total进行按引用捕捉
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int>list{1,2,3};
int total=0;
for_each(list.begin(),list.end(),[&total](int x){
total+=x;
});
cout<<total<<endl;
return 0;
}
还可以像声明变量一样声明一个函数,或者声明的类型部分也可以使用类型推导
#include<bits/stdc++.h>
using namespace std;
int main()
{
int total=0;
vector<int>list{1,2,3};
std:function<void(int)>add=[&total](int x){total+=x;};
for_each(begin(list),end(list),add);
cout<<total<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int total=0;
vector<int>list{1,2,3};
auto add2=[&total](int x){total+=x;};
for_each(begin(list),end(list),add2);
cout<<total<<endl;
return 0;
}