标签:形式 优先队列 全局 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