zoukankan      html  css  js  c++  java
  • STL 优先队列 用法

    今天做题用到了优先队列 对它的用法还不是很熟悉 现在整理一下。

    需要的库

    #include<queue>
    using namespace std;

     不过我都用bits/stdc++.h...

    定义

    priority_queue<Type, Container, Functional>

    Type是数据的类型 比如int啊char啊之类的

    Container是容器类型默认是vector

    Functional是比较的方式  比如greater<int>   less<int>   或者自己定义的比较函数

    具体用法

    基本用法1

    priority_queue <int> q;

    这是最基本的用法 不需要像定义一样传三个参数进去 只需要声明一个数据类型即可

    需要注意的是 优先队列是默认从大到小排的!

    基本用法2

    //升序队列
    priority_queue <int,vector<int>,greater<int> > q;
    //降序队列
    priority_queue <int,vector<int>,less<int> >q;

    因为声明了比较的方式,这次必须要传三个参数进去了

    需要注意的是:

    • greater<int>  和 > 之间必须要有一个空格,不然是右移运算符!
    • greater是升序排列,也就是从小到大排,不是我们想当然的greater就是从大到小!(所以这里只需要记住 greater是升序 up up~ less是降序down down~ 这样比较符合正常人的认知,也好记~)

    进阶用法1(运算符重载)

    方法1 使用 friend bool operator

    typedef struct node
    {
        int num;
        friend bool operator < (const node & a,const node & b)
        {
            return a.num < b.num ;
        }    
    }point;

     priority_queue<point>q;
     

    这个方法是将运算符的重载在结构体的定义中完成,优先队列的的定义中就不需要传三个参数了 在这个小例子里看起来没什么用 不过解决复杂问题时,就需要采用结构体来设计数据结构 也就必须要告诉计算机,比较的方式。

    需要注意的是:

    • 只能对小于号进行重载
    • 若想从小到大排 只需要将return语句的小于号改成大于号即可 和sort是正好反过来的!

    方法2 使用 bool operator

    typedef struct node
    {
            int num;
            bool operator<(const node&b)const        
            {
                return    num<b.num;
            }
    }point;    

    priority_queue<point>q;

    和采用friend bool operator的方法1一样,只是写法略有不同 我不喜欢用 感觉乱乱的....

    进阶用法2(重写仿函数)

    struct node1 
    {
        int x;
    };
    
    struct node2 
    {
        bool operator() (node1 a, node1 b) 
        {
            return a.x < b.x; 
        }
    };
    
    priority_queue<node1, vector<node1>, node2> p;

    重写仿函数这个用起来真麻烦呀....需要声明两个结构体 不喜欢用....

    支持的操作

    • top 访问队头元素
    • empty 队列是否为空
    • size 返回队列内元素个数
    • push 插入元素到队尾 (并排序)
    • emplace 原地构造一个元素并插入队列
    • pop 弹出队头元素
    • swap 交换内容
  • 相关阅读:
    声明属性Hibernate的Annotation注解
    索引查询MySQL前缀索引导致的慢查询
    定义最小POJ 1384 PigBank
    执行调用bat文件启用dos命令
    控制器框架Struts与策略模式那点事
    路径位置JDK+tomcat 环境变量配置
    目录设置PHP和Apache环境搭建小记
    驱动源码看门狗用户空间程序(可用来检测服务器死机)
    安装文件MyEclipse6.5安装与卸载SVN插件方法
    问题文件Android Studio 安装完成不能打开等问题解决记录
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/11247820.html
Copyright © 2011-2022 走看看