實例詳解
函式對象的使用場合在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的編程人員來說,已經算是一件盛事!