對於一個模板類,好比A,在咱們要定義一個具體的對象時,A<type, type...> obj, 注意type永遠只能是類型,而不能是某個對象 #include <iostream> #include <set> using namespace std; /** *自定義比較函數 */ bool fcmp(int l,int r) { return l>r; } /** *自定義一個函數對象類,若是flag爲真,那麼按升序,不然按降序,默認是降序 */ template <class T> class clscmp{ private: bool flag; public: clscmp(bool f=false):flag(f){} bool operator()(const T &a,const T &b) { return flag?(a>b):(a<b); } }; //自定義一個set類型,排序規則按照clscmp的規則排序 typedef set<int,clscmp<int> > Initset;//自定義set容器的類型,其中第三個參數類型是clscmp<int>類型 typedef bool (*fcmp_t)(int, int); int main() { int a[5]={1,2,3,4,5}; Initset set1(a, a+5, false);//第三個參數是clscmp<int>類型,false是函數對象類初始化一個對象的參數 Initset::iterator pos; for (pos = set1.begin(); pos != set1.end(); pos++) { cout << *pos << endl; } //bool (*fp)(int ,int )=fcmp; //定義函數指針,將其做爲set的排序規則 //set<int,bool(*)(int,int)> set2(a, a+5, fp); fcmp_t fp = &fcmp; set<int, fcmp_t> set2(a, a+5, fp);//第三個參數是一個函數指針,fcmp_t是第三個參數類型 for (pos = set2.begin(); pos != set2.end(); pos++) { cout << *pos << endl; } return 0; }