• C++STL之priority_queue优先队列


    一、简介

    优先队列是一种极其特殊的队列,他与标准的队列使用线性结构进行计算不同,优先队列的底层是以散列的状态(非线性)表现的,他与标准的队列有如下的区别,标准的队列遵从严格的先进先出,优先队列并不遵从标准的先进先出,而是对每一个数据赋予一个权值,根据当前队列权值的状态进行排序,使得权值最大(或最小)的永远排在队列的最前面。
    头文件:

    #include
    
    • 1

    初始化:

    priority_queue<T, Container, Compare>
    priority_queue<T>        //直接输入元素则使用默认容器和比较函数
    
    • 1
    • 2

    T就是Type为数据类型
    Container是容器类型,(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
    Compare是比较方法,类似于sort第三个参数那样的比较方式,对于自定义类型,需要我们手动进行比较运算符的重载。与sort直接Bool一个函数来进行比较的简单方法不同,Compare需要使用结构体的运算符重载完成,直接bool cmp(int a,int b){ return a>b; } 这么写是无法通过编译的

    struct cmp
    { //这个比较要用结构体表示
        bool operator()(int &a, int &b) const
        {
            return a > b;//小的优先级高,从小到大排序
        }
    };
      
    priority_queue<int,vector<int>,cmp> q;    //使用自定义比较方法
    priority_queue<int> pq;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    访问队头元素:top()
    与标准队列不同,优先队列只允许访问队头元素,不允许访问其余的数据,由于堆的特殊性质,堆顶元素的优先权最高(或者最低),访问其余元素没有意义,因此,优先队列只允许访问队头元素,这和栈的访问类型类似所以使用栈访问栈顶的命名top。
    其他和标准队列一样

    二、例题 绝对值排序

    题目描述
    输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。

    输入格式
    输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。

    输出格式
    对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行

    3 3 -4 2
    4 0 1 2 -3
    0
    
    -4 3 2
    -3 2 1 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    #include 
    #include
    #include
    #include
    using namespace std;
    
    struct cmp
    {
      bool operator()(int &a,int &b)const
      {
          return abs(a)<abs(b);//绝对值大的优先级高,绝对值由大到小排序
      }
    };
    int main()
    {
        priority_queue<int,vector<int>,cmp> q;
        int n;
        while(scanf("%d",&n)!=EOF)//一直到文件尾
        {
            if(n==0)break;
            int num;
            for(int i=0;i<n;i++)
            {
                scanf("%d",&num);
                q.push(num);
                
            }
            while(!q.empty())
            {
                int t=q.top();
                cout<<t<<" ";
                q.pop();
            }
            cout<<endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    设计模式-代理模式
    使用kubasz快速搭建Kubernetes集群
    内网信息收集
    受电诱骗快充取电芯片XSP08:PD+QC+华为+三星多种协议9V12V15V20V
    02 项目设置
    代理IP与Socks5代理在多领域的卓越应用
    CentOS 7 手动安装OpenStack
    矩阵分析与应用
    基于Orange Pi AIpro的3D性能展示
    教程九 在Go中使用Energy创建跨平台GUI应用 - Go绑定变量JS调用
  • 原文地址:https://blog.csdn.net/qq_57987156/article/details/126251713