语言:c++
头文件:queue
首先是 std::less和std::greater两个模板的使用
1 2 3 4 5 6
| template<typename _Iterator, typename _Value> bool operator()(_Iterator __it, _Value& __val) { return bool(_M_comp(*__it, __val)); } };
|
less需要重载结构体的小于 以下内容语言描述很抽象 直接看演示
(友元函数省略 因为跟结构体内重载一个意思)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| struct data1{ int num; int time; std::string name; bool operator <(const data1&a)const{//这里最后const不加会报错的//这里引用 是因为引用更快一点 return num>a.num; } }; signed main() { std::priority_queue<data1,std::vector<data1>,std::less<data1>>q; std::string str="aa"; for(int i=1; i<=10; i++) q.push({i,i+10,str}); while(q.size()){ auto cc=q.top(); q.pop(); std::cout<<cc.num<<"\n"; } }
|
得到的为:1,2,3,4,5,6,7,8,9,10;
如果<是下面方式重载的话 得到的结果为:10,9,8,7,6,5,4,3,2,1
1 2 3 4
| bool operator <(const data1&a)const { return num<a.num; }
|
你想定义的顺序跟优先队列出来的恰恰相反
然后 是greater 模板代码如下 可以看出greater需要重载的是>
1 2 3 4 5 6 7 8
| template<typename _Tp> struct greater : public binary_function<_Tp, _Tp, bool> { _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; } };
|
greater恰好于less相反
1 2 3 4 5 6 7 8
| std::priority_queue<data1,std::vector<data1>,std::greater<data1>>q;
bool operator >(const data1&a)const{ return num<a.num; }// 得到的结果为:10,9,8,7,6,5,4,3,2,1 bool operator >(const data1&a)const{ return num>a.num; }得到的为:1,2,3,4,5,6,7,8,9,10;
|
greater也是想定义的顺序跟优先队列出来的恰恰相反
由上推出:
当为非结构体时(不需要重载的基本类型) less是大根堆,greater是小根堆,而优先队列默认的是大根堆。
自定义比较结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| struct cmp{ bool operator ()(const data1 &a, const data1 &b) { return a.num<b.num;// 按照num从小到大排列 } }; struct cmp{ bool operator ()(const data1 &a, const data1 &b) { return a.num>b.num;// 按照num从大到小排列 } }; std::priority_queue<data1,std::vector<data1>,cmp>q;//
|
敬请斧正。
所以呢就别不快乐。