STL

戳这里


优先队列:

创建一个优先队列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<类型>(有几个类型大小定义不符合常理,需要详细翻库或者实践,慎用)。

一个优先队列中所有类型保持一致(包括自定义的结构体)

比较函数中返回的值是真,就说明这个判断是成立的,较前面和较后面的元素就要交换。第一种按顺序,而第二种实现中参数只有一个,代表较后面的元素,可以看到,较前面的元素是在当前结构体中定义好的

你可能感兴趣的:(STL)