对于一个模板类,好比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; }