优先队列和堆的操作基本相同。优先队列只不过比堆多了一个接口,就是获得优先级最高的值。位于堆顶的元素一般是优先级别最高的,而且插入数据需要重新排列的复杂度为O(lgn)。
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#include <cstdio>
#include <cstring>
struct cmp
{
int operator ()(char a,char b)
{
return a>b;
}
};
struct node
{
//char a[10];
string a;
string c;
int b;
friend bool operator < (node x,node y)
//注意到:结构体中重载的运算符只可以是 <, 因为标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系,如果重载 > ,那么会编译错误。
{
//return x.b<y.b;//大值优先
if(x.a==y.a)
{
if(x.c==y.c)
return x.b>y.b;
return x.c>y.c;
}
return x.a>y.a;
}
};
int main()
{
//priority_queue<int> p;
/*priority_queue<char,vector<char>,cmp> p;
p.push('s'); //push
p.push('w');
p.push('a');
p.push('e');
p.push('d');
if(p.empty()) //empty
printf("空\n");
else
printf("不空\n");
for(;p.size();) //size
{
cout<<p.top()<<endl; //top
p.pop(); //pop,应该删的是优先级最高的
}
if(p.empty())
printf("空\n");
else
printf("不空\n");*/
node n1={"wdd","sa",77};
node n2={"dwad","as",4};
node n3={"dwadw","fwf",6};
node n4={"wdd","sa",3};
node n5={"asd","ad",2};
//cout<<n1.a<<endl;
//cout<<n1.b<<endl;
priority_queue<node> p;
p.push(n1);
p.push(n2);
p.push(n3);
p.push(n4);
p.push(n5);
cout<<p.size()<<endl;
if(p.empty())
printf("空\n");
else
printf("不空\n");
for(;p.size();) //size
{
cout<<p.top().a<<" "<<p.top().c<<" "<<p.top().b<<endl; //top
p.pop(); //pop,应该删的是优先级最高的
}
cout<<p.size()<<endl;
if(p.empty())
printf("空\n");
else
printf("不空\n");
return 0;
}
C++ Priority Queues(优先队列)
C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序。
empty() | 如果优先队列为空,则返回真 |
pop() | 删除第一个元素 |
push() | 加入一个元素 |
size() | 返回优先队列中拥有的元素的个数 |
top() | 返回优先队列中有最高优先级的元素 |