《STL》queue和priority_queue(C++详细总结)

特点

  1. queue:先进先出
  2. priority_queue:先进先出,不过可以定义排序优先级。

成员函数

队列:

back()返回最后一个元素

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

front()返回第一个元素

pop()删除第一个元素

push()在末尾加入一个元素

size()返回队列中元素的个数

优先队列:

back()返回最后一个元素

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

top()返回第一个元素

pop()删除第一个元素

push()在末尾加入一个元素

size()返回队列中元素的个数

注意

对于优先队列的定义,有两种方式。

 priority_queue<Example> pq1;
 priority_queue<int,vector<int>,less<int>>q2;//神奇的降序
 priority_queue<Example2,vector<Example2>, cmp> pq2;

这里解释以下priority_queueq的形式。
大家可以看到,默认模板有三个参数,第一个是优先队列处理的类。第二个参数比较有特点,是容纳优先队列的容器。实际上,优先队列是由这个容器C++语言中关于heap的相关操作实现的。这个容器默认是vector,也可以是dequeue,因为后者功能更强大,而性能相对于vector较差,考虑到包装在优先队列后,后者功能并不能很好发挥,所以一般选择vector来做这个容器。第三个参数比较重要,支持一个比较结构,默认是less,默认情况下,会选择第一个参数决定的类的<运算符来做这个比较函数。

接下来开始坑爹了,虽然用的是less结构,然而,队列的出队顺序却是greater的先出,即降序!就是说,这里这个参数其实很傲娇,表示的意思是如果!cmp,则先出列,不管这样实现的目的是啥,大家只能接受这个实现。

一般对于单维的数据,我们可以直接用greater<类>(升序),或less<类>(降序)的方式去实现优先队列的优先级定义。对于多维,有类自排序,和定义比较函数cmp的方式来进行操作。很一致的是,对于多维定义的比较函数,优先队列依然处理的方式是!cmp 即你定义的是升序,它会排成降序。

代码展示

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 50

using namespace std;

struct Example{
     
    int x,y;
    bool operator <(const Example & a) const
    {
     
        if(x==a.x)
            return a.y<y;//升序排序
        return x<a.x;//降序排序
    }
};

struct Example2{
     
    int x,y;
};


struct cmp{
     
    bool operator () (const Example2 &a,const Example2 &b)const
    {
     
         if(b.x==a.x)
            return a.y<b.y;//降序排序
        return b.x<a.x;//升序排序
    }
};



void init( queue<int>& q)
{
     
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给queue值:";
    for(int i=0; i<10; ++i)
        {
     
            int value=u(e);
            cout<<value<<" ";
            q.push(value);
        }
    cout<<endl;
}

void output(queue<int> q)
{
     
    cout<<"输出queue:"<<endl;
    while(!q.empty())
    {
     
        cout<<q.front()<<" ";
        q.pop();
    }
    cout<<endl;
}

void init1(priority_queue<int,vector<int>,greater<int> >&q)
{
     
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给priority_queue值:";
    for(int i=0; i<10; ++i)
        {
     
            int value=u(e);
            cout<<value<<" ";
            q.push(value);
        }
    cout<<endl;
}

void output1( priority_queue<int,vector<int>,greater<int> >q)
{
     
    cout<<"输出priority_queue(great):"<<endl;
    while(!q.empty())
    {
     
        cout<<q.top()<<" ";
        q.pop();
    }
    cout<<endl;
}

void init2( priority_queue<Example>& q)
{
     
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给优先队列值:";
    for(int i=0; i<10; ++i)
        {
     
            int valueX=u(e);
            int valueY=u(e);
            cout<<valueX<<","<<valueY<<" ";
            q.push({
     valueX,valueY});
        }
    cout<<endl;
}

void output2(priority_queue<Example> q)
{
     
    cout<<"输出priority_queue (类自带排序):"<<endl;
    while(!q.empty())
    {
     
        cout<<q.top().x<<","<<q.top().y<<" ";
        q.pop();
    }
    cout<<endl;
}

void init3( priority_queue<Example2,vector<Example2>, cmp> & q)
{
     
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给priority_queue值:";
    for(int i=0; i<10; ++i)
        {
     
            int valueX=u(e);
            int valueY=u(e);
            cout<<valueX<<","<<valueY<<" ";
            q.push({
     valueX,valueY});
        }
    cout<<endl;
}

void output3(priority_queue<Example2,vector<Example2>, cmp> q)
{
     
    cout<<"输出优先队列(自定义cmp):"<<endl;
    while(!q.empty())
    {
     
        cout<<q.top().x<<","<<q.top().y<<" ";
        q.pop();
    }
    cout<<endl;
}


int main()
{
     
    queue<int> q1;
    init(q1);
    output(q1);
    cout<<"最后一个元素:"<<q1.back()<<endl;
    cout<<"queue的大小:"<<q1.size()<<endl;

    priority_queue<int,vector<int>,greater<int>>q2;//神奇的升序。 less 神奇的降序
    init1(q2);
    output1(q2);


    priority_queue<Example> pq1;
    init2(pq1);
    output2(pq1);

    priority_queue<Example2,vector<Example2>, cmp> pq2;
    init3(pq2);
    output3(pq2);

    return 0;
}

结果展示:

《STL》queue和priority_queue(C++详细总结)_第1张图片

再提一点:

随机数参考:c++ 11 random库的简单用法
参考:优先队列

你可能感兴趣的:(数据结构,C++)