溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中的Lambda函數(shù)怎么使用

發(fā)布時間:2021-12-24 16:25:06 來源:億速云 閱讀:130 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“C++中的Lambda函數(shù)怎么使用”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++中的Lambda函數(shù)怎么使用”吧!

    一 函數(shù)語法

    我們平時調(diào)用函數(shù)的時候,都是需要被調(diào)用函數(shù)的函數(shù)名,但是匿名函數(shù)就不需要函數(shù)名,而且直接寫在需要調(diào)用的地方,對于以前沒用過的小伙伴來說,第一眼看見了這語法可能很迷惑。

    C++11的基本語法格式為:

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

    (1) [capture] :[]內(nèi)為外部變量的傳遞方式,值、引用等,如下

    []        //表示的是在lambda定義之前的域,對外部參數(shù)的調(diào)用;
    [=]       //表示外部參數(shù)直接傳值
    [&]       //表示外部參數(shù)傳引用,可修改值。當默認捕獲符是 & 時,后繼的簡單捕獲符必須不以 & 開始。而當默認捕獲符是 = 時,后繼的簡單捕獲符必須以 & 開始。
    [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) :()內(nèi)為形參,和普通函數(shù)的形參一樣。
    (3)-> return_type:->后面為lambda函數(shù)的返回類型,如 -> int、-> string等。一般情況下,編譯器推出lambda函數(shù)的返回值,所以這部分可以省略不寫。
    (4){ /* … */ }:{}內(nèi)為函數(shù)主體,和普通函數(shù)一樣。

    二 函數(shù)應用

    1、在普通函數(shù)中使用

    首先是定義,執(zhí)行下面這句,不會運行函數(shù) ?。?!

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

    上面代碼,你知道lambda函數(shù)返回類型為int類型,但是函數(shù)左邊不能直接賦值給int變量(編譯器會報錯),因為此處為lambda函數(shù)的定義,所以左邊為函數(shù)指針類型變量,一般懶得寫函數(shù)指針類型,就直接賦值給auto類型變量,如下。

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

    下面才是函數(shù)的使用、運行?。?!
    如何運行l(wèi)ambda函數(shù)并獲取函數(shù)返回值?執(zhí)行函數(shù)需要看下面代碼:

    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函數(shù)非常適合在信號槽中使用。
    (1)返回的函數(shù)指針可以直接用在connect函數(shù)中,剛好契合。
    (2)該槽函數(shù)可能比較簡單,只有這個地方使用,可以省去槽函數(shù)聲明,使代碼看上去更加簡便,且業(yè)務代碼更加集中。
    基本使用

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

    綁定信號槽的時候定義lambda函數(shù),當收到信號的時候才執(zhí)行槽函數(shù),即lambda函數(shù)。
    使用示范
    在mTime時間后執(zhí)行動畫,動畫執(zhí)行后delete對象,非常適合彈窗關(guān)閉時,窗口關(guān)閉的動畫操作。(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排序函數(shù)中的使用

    在標準庫的排序函數(shù)使用中,可以使用函數(shù)回調(diào)的方式自定義排序的比較規(guī)則。
    (1)sort函數(shù)提供排序算法;(2)floatList為容器變量,提供數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù);(3)他們兩個之間使用迭代器連接。
    而我們sort函數(shù)可以使用第三個參數(shù)(函數(shù)回調(diào)方式)作為比較依據(jù)進行排序,該參數(shù)就可以寫成lambda函數(shù),這樣比較方法寫在排序函數(shù)這里,可以使得代碼更加直白、簡便、集中。參考代碼如下:

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

    上面lambda函數(shù),是sort函數(shù)中的迭代器每次運行做排序比較的時候就調(diào)用。
    注意:
    (1)lambda函數(shù)參數(shù)為( float , float ),類型必須與容器的元素類型一致。
    (2)運行時,迭代器自動幫你把參數(shù)傳入回調(diào)函數(shù)。
    (3)回調(diào)函數(shù)返回值固定為bool,這里可以不寫,由編譯器自動確定。

    感謝各位的閱讀,以上就是“C++中的Lambda函數(shù)怎么使用”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對C++中的Lambda函數(shù)怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI