function object

function object

function object是一個函式對象,形式上是經一個類實例化的對象,本質上是為了實現某種與函式等價的功能。函式對象的思想是:用類來封裝一個函式功能,然後用這個類實例化不同的函式對象。

基本介紹

  • 外文名:function object
  • 類型:函式對象
  • 作用:為了實現某種與函式等價的功能
  • 領域:程式設計
實例詳解
函式對象的使用場合在STL中比較常見。不知你用STL用得多不多,STL裡面用到非常多的函式對象。比如:std::map,它是一個模板類,實際使用時需要三個數據類型去替代其中的三個模板,從而使std::map<arg0,arg1,arg2>成為一個真正的類。其中第三個參數arg2就是一個函式對象,STL默認的是std::less(一個STL已經定義好的能夠實現比較功能的函式對象)。std::less本身也是一個模板形式的函式對象,它能對全部基本數據類型以及STL中定義的類型的值進行比較,從而通過arg0(關鍵字)決定std::map中元素的排序。
實際使用時,多數人為圖方便,一般這樣用std::map,即:
class AnyClass;std::map<int,AnyClass> mapOfAnyClass;
這個mapOfAnyClass能實現動態數組功能,不過這個數組存儲的元素是:始終按mapOfAnyClass.first(int類型)排好序的mapOfAnyClass.second(AnyClass的對象)集合。
其實arg0(排序關鍵字)不一定非得是一般類型(int之類的),也可以是自己定義的struct MyStruct,或者
class MyClass{public:    int key1;    float key2;};
因為std::map需要對關鍵字排序,而它默認用函式對象std::less去實現,假如用新的類型myClass做關鍵字,std::map無法對其中的元素進行排序。怎么辦?
另外自定義一個函式對象,替代std::less,定義如下:
class CompairMyClass{public:    bool operator()(MyClasspar1,MyClasspar2){        if(par1.key1<par2.key1&&par1.key2<par2.key2){            return true;        }else{            return false;        }    }};//classCompairMyClass
接著就可以用這么一種新map了:
std::map<MyClass,AnyClass,CompairMyClass> mapOfMyOwn;
這種map有什麼神奇之處呢?它能實現對雙關鍵字(一個整數關鍵字,一個小數關鍵字)的排序數組,而原先的std::map是無法實現該功能的,這就相當於升級了STL。而其中的大功臣就是函式對象CompairMyClass。
函式對象主要是為了使STL支持一些自定義的類,其它場合很少用到函式對象,據我所知。這對熱衷STL的編程人員來說,已經算是一件盛事!

相關詞條

熱門詞條

聯絡我們