亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

1.1概念

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

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

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ù)對(duì)象相較于普通函數(shù)與函數(shù)指針的調(diào)用效率要高很多

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

注意:在這個(gè)代碼里面,即使我們?cè)诤瘮?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ù)對(duì)象就可以解決這個(gè)問題,因?yàn)槭褂煤瘮?shù)對(duì)象就相當(dāng)于在函數(shù)面前加上一個(gè)inline,效率會(huì)提升,代碼如下:

#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ù)對(duì)象Lambda表達(dá)式

2.1使用形式

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

具體介紹:

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

2.() 這個(gè)小括號(hào)是就函數(shù)對(duì)象中的小括號(hào)符后面的參數(shù)列表。

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

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

2.2代碼實(shí)例

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

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

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

#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ù)對(duì)象

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

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

相關(guān)文章

  • 不要被C++(自動(dòng)生成規(guī)則)所蒙騙

    不要被C++(自動(dòng)生成規(guī)則)所蒙騙

    正如標(biāo)題所說,我們不要被C++語法中所描述的那些條條框框所“蒙騙”了。的確,相信這些生成規(guī)則不會(huì)對(duì)我們的編程帶來多大的影響(不會(huì)產(chǎn)生錯(cuò)誤),但是只有了解它們的背后操作,我們才知道編譯器究竟為我們做了什么,感興趣的朋友可以了解下,希望本文對(duì)你有所幫助
    2013-01-01
  • C++實(shí)現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二)

    C++實(shí)現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 深入遍歷二叉樹的各種操作詳解(非遞歸遍歷)

    深入遍歷二叉樹的各種操作詳解(非遞歸遍歷)

    本篇文章是對(duì)遍歷二叉樹的各種操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++11新特性之智能指針(shared_ptr/unique_ptr/weak_ptr)

    C++11新特性之智能指針(shared_ptr/unique_ptr/weak_ptr)

    這篇文章主要介紹了C++11新特性之智能指針,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感興趣的小伙伴們可以參考一下
    2016-08-08
  • C++集體數(shù)據(jù)交換實(shí)現(xiàn)示例講解

    C++集體數(shù)據(jù)交換實(shí)現(xiàn)示例講解

    這篇文章主要介紹了C++集體數(shù)據(jù)交換實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • C語言實(shí)現(xiàn)階乘的示例詳解

    C語言實(shí)現(xiàn)階乘的示例詳解

    在現(xiàn)實(shí)中,我們做數(shù)學(xué)題總會(huì)遇到階乘問題,這在計(jì)算機(jī)中也不例外。 那我們應(yīng)該怎么實(shí)現(xiàn)呢?下面小編就為大家講解一下C語言中階乘的實(shí)現(xiàn)
    2022-07-07
  • C語言深入講解內(nèi)存操作問題

    C語言深入講解內(nèi)存操作問題

    程序運(yùn)行的目的是為了得到特定的結(jié)果,計(jì)算機(jī)本質(zhì)上是用于計(jì)算的,既然是用于計(jì)算,就需要參與計(jì)算的數(shù)據(jù),那這些數(shù)據(jù)就存儲(chǔ)在內(nèi)存中,計(jì)算之前參與運(yùn)算的數(shù)據(jù)以及運(yùn)算之后得到的數(shù)據(jù),都存儲(chǔ)在內(nèi)存中,所以對(duì)內(nèi)存操作的掌握就尤為重要,下面我們一起來看看
    2022-04-04
  • C數(shù)據(jù)結(jié)構(gòu)中串簡單實(shí)例

    C數(shù)據(jù)結(jié)構(gòu)中串簡單實(shí)例

    這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)中串簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 詳解基于C++實(shí)現(xiàn)約瑟夫環(huán)問題的三種解法

    詳解基于C++實(shí)現(xiàn)約瑟夫環(huán)問題的三種解法

    約瑟夫環(huán)問題是算法中相當(dāng)經(jīng)典的一個(gè)問題,其問題理解是相當(dāng)容易的,并且問題描述有非常多的版本,并且約瑟夫環(huán)問題還有很多變形,通過這篇約瑟夫問題的講解,一定可以帶你理解透徹
    2021-06-06
  • C++中的auto_ptr智能指針的作用及使用方法詳解

    C++中的auto_ptr智能指針的作用及使用方法詳解

    這篇文章主要介紹了C++中的auto_ptr智能指針的作用及使用方法詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07

最新評(píng)論