C++函數(shù)對象Functor與匿名函數(shù)對象Lambda表達(dá)式詳解
1函數(shù)對象Functor(仿函數(shù))
1.1概念
函數(shù)對象就是類對象,生成這個類對象的類中,擁有一個小括號運算符重載函數(shù)。
重載了小括號運算符的類的類對象,就叫函數(shù)對象。
1.2代碼實例
#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ù),也是不行的,因為我們使用的是函數(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ù)對象就可以解決這個問題,因為使用函數(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ù)對象的小括號運算符的函數(shù)體。
2.2代碼實例
第一個當(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)[]里面有東西時:(實現(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; }
注意點:
當(dāng)時候=號的時候,底層實現(xiàn)用的是const,這樣就不能進(jìn)行賦值等一系列操作,如下代碼,我們可以加上一個mutable,C++11所提供的新的關(guān)鍵字mutale,是一種易變是的修飾符。當(dāng)然下面這個代碼肯定不能實現(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++實現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++11新特性之智能指針(shared_ptr/unique_ptr/weak_ptr)
這篇文章主要介紹了C++11新特性之智能指針,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感興趣的小伙伴們可以參考一下2016-08-08C++集體數(shù)據(jù)交換實現(xiàn)示例講解
這篇文章主要介紹了C++集體數(shù)據(jù)交換實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-11-11C數(shù)據(jù)結(jié)構(gòu)中串簡單實例
這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)中串簡單實例的相關(guān)資料,需要的朋友可以參考下2017-06-06詳解基于C++實現(xiàn)約瑟夫環(huán)問題的三種解法
約瑟夫環(huán)問題是算法中相當(dāng)經(jīng)典的一個問題,其問題理解是相當(dāng)容易的,并且問題描述有非常多的版本,并且約瑟夫環(huán)問題還有很多變形,通過這篇約瑟夫問題的講解,一定可以帶你理解透徹2021-06-06