C++ priority_queue的自定义比较方式
less对应“<”运算符,
greater对应">"运算符。
最近学习STL,发现STL默认都是使用()比较的,默认比较使用less(即'<'运算符),如sort(a,a+n),默认将数组按照递增的顺序来排序(前面的元素<后面的嘛),但是优先队列的源码比较奇特,虽然按道理使用less比较应该默认是小根堆(即堆顶元素最小),但是priority_queue<int, vector<int>, less<int> >却是大根堆,这是因为优先队列队首指向最后,队尾指向最前面的缘故,所以每次使用top()返回的都是队尾的元素。
对于结构体类型,如果想自定义比较方式,可以写成以下方式,这里要注意的就是priority_queue每次都是从队尾取元素的,所以使用top()返回的是排序后的最后一个元素。
#include <iostream> #include <stdio.h> #include <string.h> #include <queue> #include <functional> using namespace std; struct node { int a,b; int cost; } nod[100]; //自定义比较类 struct cmp { //重载()运算符 bool operator()(const node& n1, const node& n2) { //比较操作,按cost从小到大排序,但是这里构造出来的堆每次使用top()返回的都是cost最大的那个元素,因为堆每次都是从队尾弹出元素 return n1.cost < n2.cost; } }; int main() { priority_queue<node, vector<node>, cmp > q; for(int i = 0; i < 5; ++i) { cin >> nod[i].a >> nod[i].b >> nod[i].cost; q.push(nod[i]); } while(!q.empty()) { node x = q.top(); cout << x.a << ' ' <<x.b << ' ' <<x.cost << endl; q.pop(); } return 0; }
参考:https://blog.csdn.net/aamahone/article/details/82787184