当前位置 博文首页 > nameofcsdn的博客:lambda表达式入门

    nameofcsdn的博客:lambda表达式入门

    作者:[db:作者] 时间:2021-07-11 22:26

    目录

    一,lambda表达式

    二,lambda表达式各部分用法

    1,[]

    2,->


    一,lambda表达式

    lambda表达式相当于就是一个匿名函数。

    使用示例:

    #include<iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    	int x[]={4,6,2,5};
    	sort(x,x+sizeof(x)/sizeof(int),[](int a,int b){return a>b;});
    	for(int i=0;i<sizeof(x)/sizeof(int);i++)cout<<x[i]<<"  ";
    	return 0;
    }

    其中,[](int a,int b){return a>b;}? 就是一个lambda表达式,相当于仿函数 greater<int>()

    ?

    二,lambda表达式各部分用法

    1,[]

    []用来控制lambda表达式中可以使用哪些外部变量。

    (1)&是引用所有变量

    #include<iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    	int x[]={4,6,2,5},s=0;
    	for_each(x,x+sizeof(x)/sizeof(int),[&](int x){s+=x;});
    	cout<<s;
    	return 0;
    }

    (2)=是按值传递所有变量

    #include<iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    	int x[]={4,6,2,5},s=10;
    	for_each(x,x+sizeof(x)/sizeof(int),[=](int x){cout<<s+x;});
    	return 0;
    }

    (3)&和=可以组合使用

    (4)this是引用所在类中的成员变量

    #include<iostream>
    #include <algorithm>
    using namespace std;
    
    class S{
    private:
        int x[4],s;
    public:
        S()
        {
            x[0]=2,x[1]=3,x[2]=5,x[3]=4;
            s=0;
        }
        void out()
        {
            for_each(x,x+sizeof(x)/sizeof(int),[this](int x){cout<<s+x;s+=10;});
        }
    };
    
    int main()
    {
    	S a;
    	a.out();
    	return 0;
    }

    不过,根据我的实测,无论成员变量是共有还是私有,无论[]中是this还是=还是&,效果都是一样的。

    2,->

    ->用来控制lambda表达式的返回值类型,对于可以自动推导的返回值类型,这个可以省略。

    如果没有return语句或者只有一个return语句,是肯定可以推导出来的,如果超过1个return语句,就看各个return的表达式的类型是否一致了。

    #include<iostream>
    using namespace std;
    
    template <typename FUN>
    void f(FUN func)
    {
        cout<<func(1.2)<<" ";
    }
    
    int main()
    {
        f([=](double x){return x;});
        f([=](double x)->int{return x;});
        return 0;
    }

    输出11.2 1

    ?

    cs
    下一篇:没有了