c++优先队列(priority_queue)用法详解

c++优先队列(priority_queue)用法详解既然是队列那么先要包含头文件 include lt queue gt 优先队列具有队列的所有特性 包括基本操作 只是在这基础上添加了内部的一个排序 它本质是一个堆实现的定义 priority queue lt Type Container Functional gt Type 就是数据类型 Container 就是容器类型 Container 必须是用数组实现的容器 比如 vector deque 等等 但不能用

既然是队列那么先要包含头文件#include
, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队

优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的

和队列基本操作相同:

  • top 访问队头元素
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace 原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容

定义:priority_queue

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般是:




//升序队列 priority_queue 
  
    ,greater 
   
     > q; //降序队列 priority_queue 
    
      ,less 
     
       >q; //greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了) 
      
     
    
  

  1. 基本类型例子:
#include 
   
     #include 
    
      using namespace std; int main() { //对于基础类型 默认是大顶堆 priority_queue 
     
       a; //等同于 priority_queue 
      
        , less 
       
         > a; priority_queue 
        
          , greater 
         
           > c; //这样就是小顶堆 priority_queue 
          
            b; for (int i = 0; i < 5; i++) { a.push(i); c.push(i); } while (!a.empty()) { cout << a.top() << ' '; a.pop(); } cout << endl; while (!c.empty()) { cout << c.top() << ' '; c.pop(); } cout << endl; b.push("abc"); b.push("abcd"); b.push("cbd"); while (!b.empty()) { cout << b.top() << ' '; b.pop(); } cout << endl; return 0; } 
           
          
         
        
       
      
     
   

输出

4 3 2 1 0 0 1 2 3 4 cbd abcd abc 

2.pari的比较,先比较第一个元素,第一个相等比较第二个

#include 
   
     #include 
    
      #include 
     
       using namespace std; int main() { priority_queue 
      
        > a; pair 
       
         b(1, 2); pair 
        
          c(1, 3); pair 
         
           d(2, 5); a.push(d); a.push(c); a.push(b); while (!a.empty()) { cout << a.top().first << ' ' << a.top().second << '\n'; a.pop(); } } 
          
         
        
       
      
     
   

输出

2 5 1 3 1 2 

3.对于自定义类型

#include 
   
     #include 
    
      using namespace std; //方法1 struct tmp1 //运算符重载< { int x; tmp1(int a) {x = a;} bool operator<(const tmp1& a) const { return x < a.x; //大顶堆 } }; //方法2 struct tmp2 //重写仿函数 { bool operator() (tmp1 a, tmp1 b) { return a.x < b.x; //大顶堆 } }; int main() { tmp1 a(1); tmp1 b(2); tmp1 c(3); priority_queue 
     
       d; d.push(b); d.push(c); d.push(a); while (!d.empty()) { cout << d.top().x << '\n'; d.pop(); } cout << endl; priority_queue 
      
        , tmp2> f; f.push(c); f.push(b); f.push(a); while (!f.empty()) { cout << f.top().x << '\n'; f.pop(); } } 
       
      
     
   

输出

3 2 1 3 2 1 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199256.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午1:30
下一篇 2026年3月26日 下午1:31


相关推荐

  • mysql慢查询优化方法_MySQL查询优化

    mysql慢查询优化方法_MySQL查询优化定位低效SQL执行慢有两种情况:偶尔慢:DB在刷新脏页redolog写满了内存不够用,要从LRU链表中淘汰MySQL认为系统空闲的时候MySQL关闭时一直慢的原因:索引没有设计好、SQL语句没写好、MySQL选错了索引’mysql慢查询优化第一步:开启mysql慢查询日志,通过慢查询日志定位到执行较慢的SQL语句。第二步:利用explain关键字可以模拟优化器执行SQL查询语句,来分析SQL查询语句。第三步:通过查询的结果进行优化。优化方式(1)首先分

    2022年10月10日
    3
  • JS 为对象添加属性的方法

    JS 为对象添加属性的方法常用数组添加的方式是 push 那么动态为对象添加属性该用什么方式呢 varobj obj name aaa obj age 22 console log obj obj name aaa age 22

    2025年7月22日
    5
  • vuex的五大核心_vue实现页面传值的方式

    vuex的五大核心_vue实现页面传值的方式Vuex的核心概念Vuex有5个核心概念,分别是State,Getters,mutations,Actions,Modules。StateVuex使用单一状态树,也就是说,用一个对象包含了所有应

    2022年8月7日
    7
  • PIC单片机入门教程(四)—— 第一个工程

    PIC单片机入门教程(四)—— 第一个工程PIC 单片机入门教程 三 新建工程

    2026年3月19日
    2
  • Android实战开发-Kotlin教程(语法篇 1.1)

    Android实战开发-Kotlin教程(语法篇 1.1)上一篇我们介绍了 Kotlin 项目的配置搭建以及 HelloWorld 项目的编译 本章我们来认识一下 Kotlin 的基础语法快速认识 Kotlin 语言常用的基础语法 1 首先我们在 AndroidStudi 中创建一个 Test kt 并定义入库函数便于我们学习以及编译调试新建入库函数 左边入库函数可快捷编译调试

    2026年3月17日
    1
  • 数据库中having用法[通俗易懂]

    数据库中having用法[通俗易懂]having经常与groupby和聚合函数(COUNT,SUM,AVG,MIN,orMAX)一起使用,用来过滤由GROUPBY语句返回的记录集。聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数的输入值,要么为GROUPBY语句的参数,否则会出错。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。…

    2022年6月18日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号