标签:形式 优先队列 全局 highlight push turn 注意 操作 函数
优先队列是建立在队列的基础上来进行求解的;
仍然具有相同的函数操作,但是唯一不同的是增加了一个新的特性:根据自定义可以对队列内输出顺序进行控制;
简单的定义方式:
priority_queue<int>q;
这种是最简单的不定义控制方式的操作,默认将队列内的元素从大到小进行排列,出队先出最大的;
如果项进行大小输出的控制:
priority_queue<int,vector<int>,greater<int> >q;
第一个指明数据类型,第二个可以不用管,当成一个队列维护标志,且不用引入vector头文件;
第三个参数是指队列内的分布类型,有两种可选形式:
1.greater<int>
2.less<int>
可以把这两个看成分布形式,例如greater表明数据元素是递增进行排列的,所以出队肯定是最小的元素;
类似于sort函数中的cmp定义。
总的来说有两种定义方式:
struct cmp { bool operator() (node a, node b) { if (flag == 1) return a.x < b.x; else return a.y < b.y; } };
需要在外部单独的定义要给cmp结构体,重载的是()双目运算符;
值得注意的是,重载运算符和sort()中的cmp一样,可以通过全局变量来进行控制,并且其中一样,都是代表数据的分布形式;
#include<iostream> #include<queue> #include<vector> using namespace std; struct node { int x; int y; }; int flag = 0; struct cmp { bool operator() (node a, node b) { if (flag == 1) return a.x < b.x; else return a.y < b.y; } }; int main() { for (int k = 0; k < 2; k++) { int n = 100; priority_queue<node,vector<node>,cmp>pq; for (int i = 1; i < n; i *= 2) { node no; no.x = i; no.y = 100 - i; pq.push(no); } while (!pq.empty()) { cout << pq.top().x << endl; pq.pop(); } flag++; } }
如上所示;
struct node { int x; int y; bool operator < (const node& a) const{ if (flag == 0) return x < a.x; else return y < a.y; } };
这里注意一下,关于<重载的问题。
首先,<是一个单目运算符,运算的时候实际排列为a,this node;
所以x是自己里面的元素,而对于第一条判定则是要求,a,this node的关系符合a.x>this node的关系,也就是降序关系;
#include<iostream> #include<queue> #include<vector> using namespace std; int flag = 0; struct node { int x; int y; bool operator < (const node& a) const{ if (flag == 0) return x < a.x; else return y < a.y; } }; int main() { for (int k = 0; k < 2; k++) { int n = 100; priority_queue<node>pq; for (int i = 1; i < n; i *= 2) { node no; no.x = i; no.y = 100 - i; pq.push(no); } while (!pq.empty()) { cout << pq.top().x << endl; pq.pop(); } flag++; } }
个人觉得还是重载伪函数()比较好理解,这个还是能不用尽量别用;
标签:形式 优先队列 全局 highlight push turn 注意 操作 函数
原文地址:https://www.cnblogs.com/songlinxuan/p/12471420.html