戳这里
优先队列:
创建一个优先队列priority_queue<类型,容器,比较函数>名称;
容器可以使用动态数组\((vector)\)或双端队列\((deque)\)。
大根堆的简写方式priority_queue<类型>名称
q.push(x)//加入x这个元素
q.pop()//弹出堆顶元素
q.top()//返回堆顶元素
q.size()//返回堆中的元素个数
q.empty()//返回堆是否为空
关于如何重载运算符,放个实例就明白了(()
是内部实现)。
#include
#include
using namespace std;
#define For(i,x,y)for(i=x;i<=y;i++)
struct international
{
int money,power,uid;
}people[15];
class cmp
{
public:bool operator()(const international&_,const international&__)const
{
return(_.power==__.power?_.money<__.money:_.power<__.power);
}
};
priority_queue,cmp>pri;
int main()
{
int n,i;
cin>>n;
For(i,1,n)
{
cin>>people[i].money>>people[i].power;
people[i].uid=i;
pri.push(people[i]);
}
cout<
太麻烦了?那就重载小于号(也是内部实现),使用上文提到的简写方式。
class international
{
public:int money,power,uid;
bool operator<(const international&_)const
{
return(power==_.power?money<_.money:power<_.power);
}
}people[15];
priority_queuepri;
补充:
自带比较函数greater<类型>
less<类型>
(有几个类型大小定义不符合常理,需要详细翻库或者实践,慎用)。
一个优先队列中所有类型保持一致(包括自定义的结构体)
比较函数中返回的值是真,就说明这个判断是成立的,较前面和较后面的元素就要交换。第一种按顺序,而第二种实现中参数只有一个,代表较后面的元素,可以看到,较前面的元素是在当前结构体中定义好的