• 详解C++ STL priority_queue 容器


    详解C++ STL priority_queue 容器

    本篇随笔简单介绍一下(C++STL)(priority_queue)容器的使用方法和常见的使用技巧。

    priority_queue容器的概念

    (priority_queue)在英文中是优先队列的意思。

    队列是一种基本的数据结构。其实现的基本示意图如下所示:

    (C++STL)中的优先队列就是在这个队列的基础上,把其中的元素加以排序。其内部实现是一个二叉堆。所以优先队列其实就是把堆模板化,将所有入队的元素排成具有单调性的一队,方便我们调用。

    priority_queue容器的声明

    (priority_queue)容器存放在模板库:#include<queue>里,使用前需要先开这个库。

    这里需要注意的是,优先队列的声明与一般(STL)模板的声明方式并不一样。事实上,我认为其是(C++STL)中最难声明的一个容器。

    大根堆声明方式:

    大根堆就是把大的元素放在堆顶的堆。优先队列默认实现的就是大根堆,所以大根堆的声明不需要任何花花肠子,直接按(C++STL)的声明规则声明即可。

    #include<queue>
    priority_queue<int> q;
    priority_queue<string> q;
    priority_queue<pair<int,int> > q;
    

    (C++)中的(int,string)等类型可以直接比较大小,所以不用我们多操心,优先队列自然会帮我们实现。但是如果是我们自己定义的结构体,就需要进行重载运算符了。关于重载运算符的讲解,请参考这篇博客:

    重载运算符语法讲解

    小根堆声明方式

    大根堆是把大的元素放堆顶,小根堆就是把小的元素放到堆顶。

    实现小根堆有两种方式:

    第一种是比较巧妙的,因为优先队列默认实现的是大根堆,所以我们可以把元素取反放进去,因为负数的绝对值越小越大,那么绝对值较小的元素就会被放在前面,我们在取出的时候再取个反,就瞒天过海地用大根堆实现了小根堆。

    第二种:

    小根堆有自己的声明方式,我们记住即可(我也说不明白道理):

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

    注意,当我们声明的时候碰到两个"<"或者">"放在一起的时候,一定要记得在中间加一个空格。这样编译器才不会把两个连在一起的符号判断成位运算的左移/右移。

    priority_queue容器的使用方法

    (priority_queue)容器的使用方法大致如下表所示:

    用法 作用
    q.top() 返回priority_queue的首元素
    q.push() 向priority_queue中加入一个元素
    q.size() 返回priority_queue当前的长度(大小)
    q.pop() 从priority_queue末尾删除一个元素
    q.empty() 返回priority_queue是否为空,1为空、0不为空

    注意:priority_queue取出队首元素是使用(top),而不是(front),这点一定要注意!!

  • 相关阅读:
    一个list<Map>里map其中的一个字段的值相同,如何判断这个字段相同,就把这个map的其他字段存入另一个map中
    ES6---箭头函数()=>{} 与function的区别
    VSCode代码格式化快捷键及保存时自动格式化
    NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException
    响应数据中文乱码
    tomcat将静态资源写入到浏览器乱码问题
    mark一款全局搜索工具,可以搜索文本内容
    mpvue 开发微信小程序搭建项目
    h5返回上一页ios页面不刷新
    微信小程序去除页面滚动条
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11823053.html
Copyright © 2020-2023  润新知