欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL中优先队列(priority_queue)的相关操作

程序员文章站 2024-03-18 08:02:27
...
基本操作:


empty() 如果队列为空返回真


pop() 删除对列首元素


push() 加入一个元素


size() 返回优先队列中拥有的元素个数


top() 返回优先队列首元素


在默认的优先队列中,优先级高的先出队。

(1)优先队列的第一种用法,这是最常用的默认的优先级用法,也就是优先级高的先出队列,例如说一个int优先队列,那么出队的时候就是int大的先出队列。

#include <iostream>
#include <queue>
using namespace std;
int main(void)
{
    priority_queue<int> q;
    for(int i = 1; i <= 5; i++)
        q.push(i);
    cout<<q.size()<<endl;
    for(int i = 0; i < 5; i++)
    {
        cout<<q.top()<<" ";//int默认的是大的优先级高,所以5先出队,依次是4,3,2,1
        q.pop();
    }
    cout<<endl;
    if(q.empty())
        cout<<"YES"<<endl;
    return 0;
}


(2)那么如果想要优先队列中低优先级的元素先出队列,怎么办呢? --- 自定义优先级


①方法一:我们可以传入一个比较函数,使用functional头文件中的greater函数对象作为比较函数


注意:首先要添加头文件:#include <functional>


priority_queue< int,vector<int>,greater<int> > q; // 注意:> > 误写成>> 会报错


这样我们就创建了一个低优先级元素先出对列的优先队列。


修改上面的例子,运行,就会发现,输出的顺序变成了:1 2 3 4 5。


当然,与greater相对的less,如果传入less这个比较函数,那么就是高优先级元素先出队列了。


priority_queue< int,vector<int>,less<int> > q; 


priority_queue<int> q;


以上创建的优先队列是相同的。

#include <iostream>
#include <functional>
#include <queue>
using namespace std;
int main(void)
{
    priority_queue< int,vector<int>,greater<int> > q;//定义小的数优先级高
    for(int i = 1; i <= 5; i++)
        q.push(i);
    cout<<q.size()<<endl;
    for(int i = 0; i < 5; i++)
    {
        cout<<q.top()<<" ";
        q.pop();
    }
    cout<<endl;
    if(q.empty())
        cout<<"YES"<<endl;
    return 0;
}


②方法二:自己实现比较函数

#include <iostream>
#include <functional>
#include <queue>
using namespace std;
struct cmp
{
    bool operator()(int x,int y)
    {
        return x>y; //小值优先
    }
};
struct cmp1
{
    bool operator()(int x,int y)
    {
        return x<y; //大值优先
    }
};
int main(void)
{
    priority_queue< int,vector<int>,cmp> q;//定义小的数优先级高
    for(int i = 1; i <= 5; i++)
        q.push(i);
    cout<<q.size()<<endl;
    for(int i = 0; i < 5; i++)
    {
        cout<<q.top()<<" ";
        q.pop();
    }
    cout<<endl;
    if(q.empty())
        cout<<"YES"<<endl;
    return 0;
}

(3)假如优先队列中的元素是一个结构对象或者是类对象,那么如何重新自定义其优先级比较呢?


例子一:定义一个结构体,这个结构体只有一个元素 x 。


①低优先级元素先出队列,也就是x值小的先出队列。

#include <iostream>
#include <functional>
#include <queue>
using namespace std;
struct number1
{
    int x;
    bool operator < (const number1 &a) const
    {
        return x>a.x;//小值优先
    }
};

int main(void)
{
    number1 num1[5];
    priority_queue<number1>q;
    for(int i = 1; i <= 5; i++)
    {
        num1[i].x = i;
        q.push(num1[i]);
    }
    for(int i = 1; i <= 5; i++)
    {
        cout<<q.top().x<<endl;
        q.pop();
    }
    return 0;
}


②高优先级元素先出队列,也就是x值大的先出队列。

#include <iostream>
#include <functional>
#include <queue>
using namespace std;
struct node
{
    friend bool operator < (node n1, node n2)
    {
        return n1.priority < n2.priority;
    }
    int priority;
    int value;
};
int main(void)
{
    priority_queue<node> qn;
    node b[5];
    b[0].priority = 6;
    b[0].value = 1;
    b[1].priority = 9;
    b[1].value = 5;
    b[2].priority = 2;
    b[2].value = 3;
    b[3].priority = 8;
    b[3].value = 2;
    b[4].priority = 1;
    b[4].value = 4;
    for(int i = 0; i < 5; i++)
        qn.push(b[i]);
    cout<<"优先级"<<'\t'<<"值"<<endl;
    for(int i = 0; i < 5; i++)
    {
        cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;
        qn.pop();
    }
    return 0;
}


注意到:结构体中重载的运算符只可以是 <, 因为标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系,如果重载 > ,那么会编译错误。


相关标签: IT 队列