目录
1.仿函数是什么?
仿函数的本质是一个重载了()的类,用法与函数相似
优先级队列的类模板中 这个less就是一个仿函数,控制优先级队列升序排列成为大堆
反之greater控制优先级队列降序排列成为小堆
模拟仿函数的应用:
class Less { public: bool operator()(int x,int y) { return x < y; } }; int main() { Less function; cout << function(4,6) << endl; retur 0; }
可见仿函数的使用可以很方便地更改库中某些函数升降序
1.实例化大堆:
priority_queue<int> q1; priority_queue<int,vector<int>,lsee<int>> q1;
2.实例化小堆:
priority_queue<int,vector<int>,greater<int>> q;
2.非类型模板参数
3.模板特化
模板通常可以实现多种类型的相同代码,但部分特殊类型代码所得结果与我们预想中不符合
比如:
template<class T> bool Less(T x,T y) { return x < y; };
一般情况下正常比较
特殊情况我传指针,想比较的是指针内容,但比较的是指针地址
这时就需要模板特化:
template<class T> bool Less(T x,T y) { return x < y; }; //多写一个特殊化的模板 template<> bool Less<int*>(int* x,int* y) { return *x < *y; };
当传递指针时,会调用第二个特化后的模板,从而比较指针内容的大小
3.1模板全特化
将所有模板参数全部确定
template<class T1,class T2> class date { public: date() { cout << "date<T1,T2>" <<endl }; private: T1 a; T2 b; }; //全特化模板 template<> class date<int,char> { public: date() { cout << "date<int,char>" <<endl }; private: int a; char b; }; date<int,int> d1;//初始化时打印:date<T1,T2> date<int,char> d2;//初始化时打印:date<int,char>
3.2 模板偏特化
1.部分特化:当第二个参数是int时就会调用此偏特化
template<class T1> class date<T1,int> { public: date() { cout << "date<T1,int>" <<endl }; private: T1 a; int b; };
2.对参数进行限制
template<class T1,class T2> class date<T1&,T2&> { public: date() { cout << "date<T1&,T2&>" <<endl }; private: const T1& a; const T2& b; };