c++ (优先)队列要点

本文详细介绍了C++中队列和优先队列的使用,包括头文件、基本操作和注意事项。队列的基本操作有入队、出队、访问队首和队尾元素以及判断队列是否为空。对于优先队列,文章讲解了默认的降序排序规则,以及如何通过less和greater实现升序和降序排序。同时,通过实例展示了自定义结构体在优先队列中的应用。
摘要由CSDN通过智能技术生成

前言:在今天写下了我的第一篇blog记一下知识要点(主要是买的书还没有到),回过神来才发现tm身边的小伙伴已经超我一大截了woc。


        所以用队列queque时要做 or 注意些什么呢?

一、函数的头文件与申明

        首先我们需要这个


#include<queue>
using namespace std;//可以说变身前要做的动作了hhh

        具体点

using namespace std; /*这句话,代表,使用一个叫做“std”的namespace,namespace里面封存了一系列东西,比方说奇异的数据结构和奇异的函数。当打开了namespace以后,就跟打开了头文件的本质是一样的,都是可以直接用它里面封存的函数。
不同之处在什么地方?就是不开namespace的使用,在你想用的(以std为例)函数面前加上“std::”即可。
例如,std::sort(a+1,a+1+N); 之类的。*/

       

       有时我们可能会用到优先队列

       基本格式是:priority_queue<结构类型>队列名  

       比如:

priority_queue <int> i;
priority_queue <double> d;

        不过最为常见的为这几种

priority_queue <node> q;
//node是一个结构体
//结构体里重载了‘<’小于符号
priority_queue <int,vector<int>,greater<int> > q;
//不需要#include<vector>头文件
//注意后面两个“>”不要写在一起,“>>”是右移运算符
priority_queue <int,vector<int>,less<int> >q;

二、队列基本操

        入队,如例:q.push(x); 将x 接到队列的末端。
        出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
        访问队首元素,如例:q.front(),即最早被压入队列的元素。
        访问队尾元素,如例:q.back(),即最后被压入队列的元素。
        判断队列空,如例:q.empty(),当队列空时,返回true。                                                                                   访问队列中的元素个数,如例:q.size()。

        而优先队列的特性为自动排序

        默认的优先对列(非结构体结构)

priority_queue <int> q;

        嘶,那排序是按怎样的顺序排的呢。

#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int> q;
int main()
{
    q.push(101),q.push(7),q.push(5),q.push(41),q.push(99);
    while(!q.empty()){
        printf("%d ",q.top()),q.pop();
    return 0;
}

        让我们在这个优先队列里依次插入101、7、5、41、99,再输出。
        结果 :       101 99 41 7 5 
        也就是说,它是按降序排列的!

        来看看下面这个结构体(重载小于)

struct node
{
    int x,y;
    bool operator < (const node & a) const{
        return x<a.x;
    }
};

        这个node结构体有两个成员,x和y,它的小于规则是x小者小。
        再来看看验证程序:

#include<cstdio>
#include<queue>
using namespace std;
struct node
{
    int x,y;
    bool operator < (const node & a) const{
        return x<a.x;
    }
}k;
priority_queue <node> q;
int main()
{
    t.x=9,t.y=40; q.push(t);
    t.x=5,t.y=20; q.push(t);
    t.x=9,t.y=26; q.push(k);
    t.x=6,t.y=37; q.push(k);
    t.x=8,t.y=16; q.push(k);
    while(!q.empty())
    {
        node m=q.top(); q.pop();
        printf("(%d,%d) ",m.x,m.y);
    }
    return 0;
}

        

        大意就是插入(9,40),(5,20),(9,26),(6,37),(8,16)这五个node。

        再来看看输出: (9,40) (9,26) (8,16) (6,37) (5,20)

        它也是按照重载后的小于规则,从大到小排序的。

        这时候就不得不搬出它们了  less和greater优先队列

        还是以int为例,先来声明:

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

        来

#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
int a[5]={5,4,1,3,2};
int main()
{
    for(int i=0;i<5;i++) p.push(a[i]),q.push(a[i]);
    printf("less<int>:");
    while(!p.empty()) printf("%d ",p.top()),p.pop();
    printf("\ngreater<int>:");
    while(!q.empty()) printf("%d ",q.top()),q.pop();
}

        结果:
     less<int>:5 4 3 2 1 greater<int>:1 2 3 4 5

        所以,我们可以知道,less是从大到小,greater是从小到大

           附上大佬链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值