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

C++函數(shù)對象Functor與匿名函數(shù)對象Lambda表達(dá)式詳解

 更新時(shí)間:2022年08月16日 10:01:50   作者:lhb2998658795  
這篇文章主要介紹了C++函數(shù)對象Functor(仿函數(shù))與匿名函數(shù)對象(Lambda表達(dá)式)詳細(xì)介紹以及底層實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1函數(shù)對象Functor(仿函數(shù))

1.1概念

函數(shù)對象就是類對象,生成這個類對象的類中,擁有一個小括號運(yùn)算符重載函數(shù)。

重載了小括號運(yùn)算符的類的類對象,就叫函數(shù)對象。

1.2代碼實(shí)例

#include <iostream>
using namespace std;
template <class T1>
class A
{
    T1 name;
public:
    A(T1 name)
    {
        this->name=name;
    }
    void operator()()
    {
        cout<<this->name<<endl;
    }
};
int main()
{
    A<string> a("da jia hao");
    a();
    return 0;
}

1.3調(diào)用效率

函數(shù)對象相較于普通函數(shù)與函數(shù)指針的調(diào)用效率要高很多

當(dāng)我們用普通函數(shù)的時(shí)候:像下面這種情況,每次都需要回調(diào),特別的繁瑣。

注意:在這個代碼里面,即使我們在函數(shù)前面都加上inline變成內(nèi)聯(lián)函數(shù),也是不行的,因?yàn)槲覀兪褂玫氖呛瘮?shù)指針,即使變成了內(nèi)聯(lián)函數(shù),我們還是需要回調(diào)。

#include <iostream>
using namespace std;
template <class T>
T my_bigger(T a,T b)
{
    return a>b?a:b;
}
template <class T>
T my_less(T a,T b)
{
    return a>b?b:a;
}
template <class T,class Compare>
T my_compare(T a, T b,Compare f)
{
    return f(a,b);
}
int main()
{
    cout<< my_compare<int>(10,20,my_less<int>)<<endl;
    cout<<my_compare<int>(10,20,my_bigger<int>)<<endl;
    return 0;
}

使用函數(shù)對象就可以解決這個問題,因?yàn)槭褂煤瘮?shù)對象就相當(dāng)于在函數(shù)面前加上一個inline,效率會提升,代碼如下:

#include <iostream>
using namespace std;
template <class T,class Compare>
T my_compare(T a, T b,Compare f)
{
    return f(a,b);
}
template <class T>
class A
{
public:
    T operator()(T a,T b)
    {
        return a>b?a:b;
    }
};
template <class T>
class B
{
public:
    T operator()(T a,T b)
    {
        return a>b?b:a;
    }
};
int main()
{
    cout<<my_compare(10,20,A<int>())<<endl;
    cout<<my_compare(10,20,B<int>())<<endl;
    return 0;
}

2.匿名函數(shù)對象Lambda表達(dá)式

2.1使用形式

auto + 名字 =[]()->返回值{};

具體介紹:

1.[] 中括號表示函數(shù)對象的構(gòu)造函數(shù)中是否接收外部變量。 [&] ,表示使用引用的方式獲取外部變量 [=],表示使用值的拷貝的方式獲取外部變量。

2.() 這個小括號是就函數(shù)對象中的小括號符后面的參數(shù)列表。

3.->返回值,需要就放,不需要就不放。根據(jù)自己需要,任君選擇。

4.{...} 就是函數(shù)對象的小括號運(yùn)算符的函數(shù)體。

2.2代碼實(shí)例

第一個當(dāng)[]里面沒用東西時(shí):

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
    }
    void operator()()
    {
    }
};
int main()
{
    auto f=[]()->void{cout<<"我是大哥"<<endl;};
    f();
    return 0;
}

第二個當(dāng)[]里面有東西時(shí):(實(shí)現(xiàn)交換)

#include <iostream>
using namespace std;
class A
{
    int a;
public:
    A(int &a)
    {
        this->a=a;
    }
    void operator()()
    {
    }
};
int main()
{
    int a=10;
    int b=20;
    auto f=[&]()->void
    {
        int temp=a;
        a=b;
        b=temp;
    };
    f();
    cout<<a<<endl;
    cout<<b<<endl;
    return 0;
}

注意點(diǎn):

當(dāng)時(shí)候=號的時(shí)候,底層實(shí)現(xiàn)用的是const,這樣就不能進(jìn)行賦值等一系列操作,如下代碼,我們可以加上一個mutable,C++11所提供的新的關(guān)鍵字mutale,是一種易變是的修飾符。當(dāng)然下面這個代碼肯定不能實(shí)現(xiàn)交換,我只是用來做一個說明。

#include <iostream>
using namespace std;
class A
{
    int a;
public:
    A(int &a)
    {
        this->a=a;
    }
    void operator()()
    {
    }
};
int main()
{
    int a=10;
    int b=20;
    auto f=[=]()mutable
    {
        int temp=a;
        a=b;
        b=temp;
    };
    f();
    return 0;
}

3總結(jié)

在C++中Funtor也被稱為函數(shù)符:

函數(shù)符就有四種表現(xiàn)形式:

1.全局函數(shù)指針

2.成員函數(shù)指針

3.函數(shù)對象

4.Lambda匿名函數(shù)對象(Lambda表達(dá)式)

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

相關(guān)文章

  • 使用C++實(shí)現(xiàn)插件模式時(shí)的避坑要點(diǎn)(推薦)

    使用C++實(shí)現(xiàn)插件模式時(shí)的避坑要點(diǎn)(推薦)

    這篇文章主要介紹了使用C++實(shí)現(xiàn)插件模式時(shí)的避坑要點(diǎn),本文主要分析實(shí)踐中常見的、因?yàn)閷υ聿磺宄愠鰜淼漠a(chǎn)品里的坑,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • QT使用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通訊

    QT使用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通訊

    這篇文章主要為大家詳細(xì)介紹了QT如何使用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通訊,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • C++中給二維指針分配內(nèi)存(實(shí)現(xiàn)代碼)

    C++中給二維指針分配內(nèi)存(實(shí)現(xiàn)代碼)

    我們都知道在 C++ 中分配動態(tài)數(shù)組用的是 new , 撤銷動態(tài)數(shù)組用的是 delete[ ] ,現(xiàn)在讓我們來看看怎么利用這兩個關(guān)鍵字給二維指針分配內(nèi)存
    2013-10-10
  • C++三色球問題描述與算法分析

    C++三色球問題描述與算法分析

    這篇文章主要介紹了C++三色球問題描述與算法分析,結(jié)合注釋形式詳細(xì)講述了三色球問題的描述與相應(yīng)的算法設(shè)計(jì)思路,并給出了相關(guān)的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-05-05
  • C語言變量和全局變量能否重名問題

    C語言變量和全局變量能否重名問題

    這篇文章主要介紹了C語言變量和全局變量能否重名問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • C語言中進(jìn)程間通訊的方式詳解

    C語言中進(jìn)程間通訊的方式詳解

    這篇文章主要為大家詳細(xì)介紹了C語言中幾種進(jìn)程間通訊的方式,文中的示例代碼講解詳細(xì),?對我們學(xué)習(xí)或工作有一定的借鑒價(jià)值,需要的可以參考一下
    2022-08-08
  • C語言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法

    C語言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法

    這篇文章主要介紹了C語言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++面試八股文之如何避免死鎖詳解

    C++面試八股文之如何避免死鎖詳解

    在C++中,鎖(Lock)是一種同步工具,用于保護(hù)共享資源,防止多個線程同時(shí)訪問,那么如何避免死鎖的情況出現(xiàn)呢,下面就為大家簡單講講
    2023-07-07
  • C語言中g(shù)etchar(?)?函數(shù)使用詳解

    C語言中g(shù)etchar(?)?函數(shù)使用詳解

    getchar()?字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個字,需要注意一次只能讀取一個字符,這篇文章主要介紹了C語言中g(shù)etchar函數(shù)使用詳解,需要的朋友可以參考下
    2022-12-12
  • 嵌入式C語言二級指針在鏈表中的應(yīng)用

    嵌入式C語言二級指針在鏈表中的應(yīng)用

    這篇文章主要為大家介紹了嵌入式C語言二級指針在鏈表中的應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評論

光泽县| 阳泉市| 富宁县| 浦县| 彭泽县| 大连市| 突泉县| 华池县| 兴山县| 定结县| 郎溪县| 红河县| 三原县| 舒城县| 丹巴县| 赞皇县| 花垣县| 宁蒗| 嵊州市| 青海省| 凤台县| 小金县| 孟连| 洞头县| 抚顺市| 永胜县| 普安县| 太白县| 磐安县| 南木林县| 平谷区| 临夏市| 凤阳县| 柏乡县| 库车县| 宁陕县| 镇康县| 大田县| 祁连县| 香港| 安岳县|