日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

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

作者:lhb2998658795 ? 更新時間: 2022-10-11 編程語言

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ù)的時候:像下面這種情況,每次都需要回調(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)[]里面沒用東西時:

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

第二個當(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=[&]()->void
    {
        int temp=a;
        a=b;
        b=temp;
    };
    f();
    cout<<a<<endl;
    cout<<b<<endl;
    return 0;
}

注意點(diǎn):

當(dāng)時候=號的時候,底層實(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á)式)

原文鏈接:https://blog.csdn.net/a2998658795/article/details/126068605

欄目分類
最近更新