匿名函数(lambda)

匿名函数是函数式编程风格(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;
}



猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/80711677
今日推荐