C++中的Lambda函数怎么使用

这篇文章主要讲解了“C++中的Lambda函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的Lambda函数怎么使用”吧!

    一 函数语法

    我们平时调用函数的时候,都是需要被调用函数的函数名,但是匿名函数就不需要函数名,而且直接写在需要调用的地方,对于以前没用过的小伙伴来说,第一眼看见了这语法可能很迷惑。

    C++11的基本语法格式为:

    [capture](parameters) -> return_type { /* ... */ }

    (1) [capture] :[]内为外部变量的传递方式,值、引用等,如下

    []        //表示的是在lambda定义之前的域,对外部参数的调用;
    [=]       //表示外部参数直接传值
    [&]       //表示外部参数传引用,可修改值。当默认捕获符是 & 时,后继的简单捕获符必须不以 & 开始。而当默认捕获符是 = 时,后继的简单捕获符必须以 & 开始。
    [x, &y]   //x is captured by value, y is captured by reference
    [&, x]    //x is explicitly captured by value. Other variables will be captured by reference
    [=, &z]   //z is explicitly captured by reference. Other variables will be captured by value

    (2)(parameters) :()内为形参,和普通函数的形参一样。
    (3)-> return_type:->后面为lambda函数的返回类型,如 -> int-> string等。一般情况下,编译器推出lambda函数的返回值,所以这部分可以省略不写。
    (4){ /* … */ }:{}内为函数主体,和普通函数一样。

    二 函数应用

    1、在普通函数中使用

    首先是定义,执行下面这句,不会运行函数 !!!

    std::function<int(int,int)> add = [](int a,int b) ->int {  return a + b;   };

    上面代码,你知道lambda函数返回类型为int类型,但是函数左边不能直接赋值给int变量(编译器会报错),因为此处为lambda函数的定义,所以左边为函数指针类型变量,一般懒得写函数指针类型,就直接赋值给auto类型变量,如下。

    auto add = [](int a,int b) ->int {  return a + b;   };

    下面才是函数的使用、运行!!!
    如何运行lambda函数并获取函数返回值?执行函数需要看下面代码:

    auto add = [](int a,int b) ->int {  return a + b;   };
        int result  = add(1,2);

    又或者如下:

    auto add = [](int a,int b) ->int {  return a + b;   };
    int(*func_ptr)(int,int) = add ;
    int result = func_ptr(1,2);

    2、在qt信号槽中使用

    我觉得labmda函数非常适合在信号槽中使用。
    (1)返回的函数指针可以直接用在connect函数中,刚好契合。
    (2)该槽函数可能比较简单,只有这个地方使用,可以省去槽函数声明,使代码看上去更加简便,且业务代码更加集中。
    基本使用

    connect(sys, &SYSClass::sig_1, this, [=](int index)
        {
            ......
        });

    绑定信号槽的时候定义lambda函数,当收到信号的时候才执行槽函数,即lambda函数。
    使用示范
    在mTime时间后执行动画,动画执行后delete对象,非常适合弹窗关闭时,窗口关闭的动画操作。(widgetPtr为弹窗的指针)

    QTimer::singleShot(mTime,widgetPtr,[=]()
        {
            QPropertyAnimation *pAnimation = new QPropertyAnimation(widgetPtr,"windowOpacity",widgetPtr);
            pAnimation->setDuration(1000);
            pAnimation->setEasingCurve(QEasingCurve::InCirc);
            pAnimation->setStartValue(1.0);
            pAnimation->setEndValue(0.0);
            pAnimation->start();
            connect(pAnimation,&QPropertyAnimation::finished,[=]{
                delete widgetPtr;
            });
        });

    3、在std::sort排序函数中的使用

    在标准库的排序函数使用中,可以使用函数回调的方式自定义排序的比较规则。
    (1)sort函数提供排序算法;(2)floatList为容器变量,提供数据结构和数据;(3)他们两个之间使用迭代器连接。
    而我们sort函数可以使用第三个参数(函数回调方式)作为比较依据进行排序,该参数就可以写成lambda函数,这样比较方法写在排序函数这里,可以使得代码更加直白、简便、集中。参考代码如下:

    std::sort( floatList, floatList + N, [](float a, float b) 
    		{
                return a < b;
            });

    上面lambda函数,是sort函数中的迭代器每次运行做排序比较的时候就调用。
    注意:
    (1)lambda函数参数为( float , float ),类型必须与容器的元素类型一致。
    (2)运行时,迭代器自动帮你把参数传入回调函数。
    (3)回调函数返回值固定为bool,这里可以不写,由编译器自动确定。

    感谢各位的阅读,以上就是“C++中的Lambda函数怎么使用”的内容了,经过本文的学习后,相信大家对C++中的Lambda函数怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!