最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的Lambda函數(shù)詳解

 更新時間:2022年01月23日 16:43:20   作者:求知者先  
大家好,本篇文章主要講的是C++中的Lambda函數(shù)詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

一 函數(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ù)傳引用,可修改值。當(dāng)默認(rèn)捕獲符是 & 時,后繼的簡單捕獲符必須不以 & 開始。而當(dāng)默認(rèn)捕獲符是 = 時,后繼的簡單捕獲符必須以 & 開始。
[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ù)應(yīng)用

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

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

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

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

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

下面才是函數(shù)的使用、運(yùn)行?。。?/strong>
如何運(yùn)行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è)務(wù)代碼更加集中。
基本使用

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

綁定信號槽的時候定義lambda函數(shù),當(dāng)收到信號的時候才執(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ù)中的使用

在標(biāo)準(zhǔn)庫的排序函數(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ù)進(jìn)行排序,該參數(shù)就可以寫成lambda函數(shù),這樣比較方法寫在排序函數(shù)這里,可以使得代碼更加直白、簡便、集中。參考代碼如下:

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

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

三 總結(jié)

lambda函數(shù)定義后返回的是函數(shù)指針類型,即如:std::function<int(int,int)>,所以一般很少使用,我們在很多代碼中也很少看到。
正常情況下,lambda函數(shù)相對普通函數(shù)的定義和使用其實(shí)沒什么優(yōu)勢。但是某些使用到函數(shù)指針的場合下,我們就可以酌情考慮使用,特別是函數(shù)指針作為函數(shù)參數(shù)的時候,比如qt的信號槽、回調(diào)函數(shù)等,使用起來即方便,又顯得代碼高大上,簡直就完美O(∩_∩)O。

到此這篇關(guān)于C++中的Lambda函數(shù)詳解的文章就介紹到這了,更多相關(guān)C++ Lambda函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析

    C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析

    在C++中,又引出了一個新玩法:new 和 delete,在C++中,new是用來動態(tài)開辟內(nèi)存的,delete是用來釋放我們所動態(tài)開辟的內(nèi)存C++中的new和delete運(yùn)算符及new和malloc的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Objective-C 消息傳遞機(jī)制詳解

    Objective-C 消息傳遞機(jī)制詳解

    Objective-C語言中方法的傳遞有二種:①Selector ② Blocks,本文主要說一下Selector,本文以O(shè)bjective-C 消息傳遞機(jī)制進(jìn)行詳細(xì)介紹,關(guān)于Blocks會在后續(xù)總結(jié)一下
    2012-11-11
  • C++函數(shù)參數(shù)匹配規(guī)則示例小結(jié)

    C++函數(shù)參數(shù)匹配規(guī)則示例小結(jié)

    這篇文章主要介紹了C++函數(shù)參數(shù)匹配規(guī)則,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • C++開發(fā)之PugiXML庫基礎(chǔ)用法示例詳解

    C++開發(fā)之PugiXML庫基礎(chǔ)用法示例詳解

    PugiXML庫是一個功能強(qiáng)大、簡單易用的C++ XML解析庫,它提供了一組方便的函數(shù)來解析、創(chuàng)建和修改XML文檔,本文介紹了如何使用PugiXML庫來解析、創(chuàng)建和修改XML文檔,以及如何處理錯誤和異常,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • C++移動操作,RVO和NRVO詳細(xì)

    C++移動操作,RVO和NRVO詳細(xì)

    本文將討論了何時C++會自動進(jìn)行移動操作,并且說明了復(fù)制消除,RVO和NRVO優(yōu)的化等香瓜吧資料,需要的小伙伴可以參考一下
    2021-09-09
  • C++常用的#include頭文件總結(jié)

    C++常用的#include頭文件總結(jié)

    這篇文章主要介紹了C++常用的#include頭文件,對初學(xué)者理解C++程序設(shè)計大有好處的相關(guān)資料
    2014-07-07
  • C語言安全之?dāng)?shù)組長度與指針實(shí)例解析

    C語言安全之?dāng)?shù)組長度與指針實(shí)例解析

    這篇文章主要介紹了C語言安全之?dāng)?shù)組長度與指針,需要的朋友可以參考下
    2014-07-07
  • C語言進(jìn)階之內(nèi)存操作函數(shù)詳解

    C語言進(jìn)階之內(nèi)存操作函數(shù)詳解

    這篇文章主要為大家學(xué)習(xí)介紹了C語言中內(nèi)存操作函數(shù)(memcpy、memmove和memcmp)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • C語言實(shí)現(xiàn)飛機(jī)游戲(進(jìn)階版)的示例代碼

    C語言實(shí)現(xiàn)飛機(jī)游戲(進(jìn)階版)的示例代碼

    在前文中,已經(jīng)帶大家利用C語言實(shí)現(xiàn)了簡單的飛機(jī)游戲,但它還存在一些缺陷。因此,本文將給大家?guī)磉M(jìn)階版的飛機(jī)游戲,需要的可以參考一下
    2022-10-10
  • C++繼承介紹

    C++繼承介紹

    C++繼承可以是單一繼承或多重繼承,每一個繼承連接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01

最新評論

文山县| 瑞丽市| 天津市| 曲靖市| 喀什市| 高安市| 越西县| 苏尼特左旗| 姜堰市| 西昌市| 滕州市| 文昌市| 武隆县| 丹棱县| 嵊泗县| 松滋市| 嘉义市| 新巴尔虎右旗| 芷江| 宝山区| 清镇市| 湖北省| 紫阳县| 普定县| 陕西省| 临沂市| 宁强县| 新河县| 永仁县| 南城县| 昭苏县| 临漳县| 安塞县| 金堂县| 乐昌市| 满洲里市| 出国| 奉节县| 大连市| 江都市| 丹寨县|