priority_queue

优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键字是priority_queue(太伤了)。在一些定义了权重的地方这个数据结构是很有用的。

先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部。priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级。这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。标准库默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载 < 操作符。

优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。

1) 优先队列的定义

包含头文件:"queue.h", "functional.h"

可以使用具有默认优先级的已有数据结构;也可以再定义优先队列的时候传入自定义的优先级比较对象;或者使用自定义对象(数据结构),但是必须重载好< 操作符。

2) 优先队列的常用操作

优先级队列支持的操作

q.empty()         如果队列为空,则返回true,否则返回false

q.size()            返回队列中元素的个数

q.pop()             删除队首元素,但不返回其值

q.top()             返回具有最高优先级的元素值,但不删除该元素

q.push(item)     在基于优先级的适当位置插入新元素

其中q.top()为查找操作,在最小优先队列中搜索优先权最小的元素,在最大优先队列中搜索优先权最大的元素。q.pop()为删除该元素。优先队列插入和删除元素的复杂度都是O(lgn),所以很快

另外,在优先队列中,元素可以具有相同的优先权。

下面这个C例子,包含了几乎所有常见的优先队列用法。

在优先队列中,优先级高的元素先出队列。
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
优先队列的第一种用法,也是最常用的用法:

priority_queue<int> qi;

通过<操作符可知在整数中元素大的优先级高。
故示例1中输出结果为:9 6 5 3 2

第二种方法:
在示例1中,如果我们要把元素从小到大输出怎么办呢?
这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。

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

其中
第二个参数为容器类型。
第二个参数为比较函数。
故示例2中输出结果为:2 3 5 6 9

第三种方法:
自定义优先级。

struct node
{friend bool operator< (node n1, node n2){return n1.priority < n2.priority;}int priority;int value;
};

在该结构中,value为值,priority为优先级。
通过自定义operator<操作符来比较元素中的优先级。
在示例3中输出结果为:
优先级  值
9          5
8          2
6          1
2          3
1          4

#include<iostream>
#include<functional>
#include<queue>
using namespace std;
struct node
{friend bool operator< (node n1, node n2){return n1.priority < n2.priority;}int priority;int value;
};
int main()
{const int len = 5;int i;int a[len] = {3,5,9,6,2};//示例1priority_queue<int> qi;for(i = 0; i < len; i++)qi.push(a[i]);for(i = 0; i < len; i++){cout<<qi.top()<<" ";qi.pop();}cout<<endl;//示例2priority_queue<int, vector<int>, greater<int> >qi2;for(i = 0; i < len; i++)qi2.push(a[i]);for(i = 0; i < len; i++){cout<<qi2.top()<<" ";qi2.pop();}cout<<endl;//示例3priority_queue<node> qn;node b[len];b[0].priority = 6; b[0].value = 1; b[1].priority = 9; b[1].value = 5; b[2].priority = 2; b[2].value = 3; b[3].priority = 8; b[3].value = 2; b[4].priority = 1; b[4].value = 4; for(i = 0; i < len; i++)qn.push(b[i]);cout<<"优先级"<<'\t'<<"值"<<endl;for(i = 0; i < len; i++){cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;qn.pop();}return 0;
}
#include<iostream>
#include<functional>
#include<queue>
#include<vector>
using namespace std;//定义比较结构
struct cmp1{bool operator ()(int &a,int &b){return a>b;//最小值优先}
};struct cmp2{bool operator ()(int &a,int &b){return a<b;//最大值优先}
};//自定义数据结构
struct number1{int x;bool operator < (const number1 &a) const {return x>a.x;//最小值优先}
};
struct number2{int x;bool operator < (const number2 &a) const {return x<a.x;//最大值优先}
};
int a[]={14,10,56,7,83,22,36,91,3,47,72,0};
number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};
number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};int main()
{    priority_queue<int>que;//采用默认优先级构造队列priority_queue<int,vector<int>,cmp1>que1;//最小值优先priority_queue<int,vector<int>,cmp2>que2;//最大值优先priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,priority_queue<int,vector<int>,less<int> >que4;最大值优先priority_queue<number1>que5; //最小优先级队列priority_queue<number2>que6;  //最大优先级队列int i;for(i=0;a[i];i++){que.push(a[i]);que1.push(a[i]);que2.push(a[i]);que3.push(a[i]);que4.push(a[i]);}for(i=0;num1[i].x;i++)que5.push(num1[i]);for(i=0;num2[i].x;i++)que6.push(num2[i]);printf("采用默认优先关系:/n(priority_queue<int>que;)/n");printf("Queue 0:/n");while(!que.empty()){printf("%3d",que.top());que.pop();}puts("");puts("");printf("采用结构体自定义优先级方式一:/n(priority_queue<int,vector<int>,cmp>que;)/n");printf("Queue 1:/n");while(!que1.empty()){printf("%3d",que1.top());que1.pop();}puts("");printf("Queue 2:/n");while(!que2.empty()){printf("%3d",que2.top());que2.pop();}puts("");puts("");printf("采用头文件/"functional/"内定义优先级:/n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)/n");printf("Queue 3:/n");while(!que3.empty()){printf("%3d",que3.top());que3.pop();}puts("");printf("Queue 4:/n");while(!que4.empty()){printf("%3d",que4.top());que4.pop();}puts("");puts("");printf("采用结构体自定义优先级方式二:/n(priority_queue<number>que)/n");printf("Queue 5:/n");while(!que5.empty()){printf("%3d",que5.top());que5.pop();}puts("");printf("Queue 6:/n");while(!que6.empty()){printf("%3d",que6.top());que6.pop();}puts("");return 0;
}
/*
运行结果 :
采用默认优先关系:
(priority_queue<int>que;)
Queue 0:
91 83 72 56 47 36 22 14 10  7  3采用结构体自定义优先级方式一:
(priority_queue<int,vector<int>,cmp>que;)
Queue 1:
3  7 10 14 22 36 47 56 72 83 91
Queue 2:
91 83 72 56 47 36 22 14 10  7  3采用头文件"functional"内定义优先级:
(priority_queue<int,vector<int>,greater<int>/less<int> >que;)
Queue 3:
3  7 10 14 22 36 47 56 72 83 91
Queue 4:
91 83 72 56 47 36 22 14 10  7  3采用结构体自定义优先级方式二:
(priority_queue<number>que)
Queue 5:
3  7 10 14 22 36 47 56 72 83 91
Queue 6:
91 83 72 56 47 36 22 14 10  7  3
*/



stl-优先队列priority_queue相关推荐

  1. C++STL 优先队列priority_queue使用

    头文件:#include <queue> 一.申明方式 std::priority_queue<T> q; std::priority_queue<T, std::vec ...

  2. C++ STL中的优先队列(priority_queue)使用

    原文:https://www.cnblogs.com/cielosun/p/5654595.html 今天讲一讲优先队列(priority_queue),实际上,它的本质就是一个heap,我从STL中 ...

  3. 浅谈C++ STL中的优先队列(priority_queue)

    2019独角兽企业重金招聘Python工程师标准>>> 从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维 ...

  4. C++ STL实现的优先队列( priority_queue )

    本文参考的源码版本:gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project). priority_queue 本质是容 ...

  5. C++ STL 优先队列

    //优先队列 //Priority_queue //STL #include<iostream> #include<cstdio> #include<cstdlib> ...

  6. stl优先队列定义可以吗_C ++ STL | 用户定义的优先级队列比较器

    stl优先队列定义>可以吗 In this article, we are going to see how to write your comparator function for prio ...

  7. [转载]STL之priority_queue

    原文地址:STL之priority_queue作者:李大宝 STL之优先队列 原本以为priority_queue很简单,才知道原来懂的只是最简单的形式. 头文件:#include<queue& ...

  8. STL优先队列实现堆(模板 附力扣题目)

    讲解视频:https://www.bilibili.com/video/BV12i4y1f7ky/ 堆的本质 堆是一种特殊的完全二叉树.每一个节点的值都大于等于或者小于等于其孩子节点的值. 堆的操作时 ...

  9. 优先队列priority_queue 用法详解

    优先队列priority_queue 用法详解 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达 ...

  10. STL(七)——队列queue优先队列priority_queue

    一.queue 1.特点:先进先出(FIFO-first in first out) 只允许在表的前端(front,称为队头)进行删除操作,在表的后端(rear,称为队尾)进行插入操作 2.基本操作 ...

最新文章

  1. @query 注解的定义_SpringDataJpa(5)---定义查询方法
  2. Android系统Recovery工作原理之使用update.zip升级过程分析(五)
  3. LDA入门级学习笔记
  4. 7 Java NIO Selector-翻译
  5. MySQL数据库基本的“增删改查”操作 -《狗嗨默示录》-
  6. VTK:相互作用之UserEvent
  7. 微软发布 SQL Server 2019 新版本
  8. 阿里可观测性数据引擎的技术实践
  9. FFmpeg在Ubuntu的安装以及教程~~~
  10. 每日签到html特效,前端这种连续签到的效果要怎么写
  11. 新手小白该怎么学习前端?附学习路线和资料
  12. 《Java高级程序设计》第一周作业
  13. java.io.InvalidClassException
  14. 使用函数式编程优化代码
  15. 各大主流浏览器的内核
  16. HTML学生个人网站作业设计:电影网站设计——橙色国外电影(13页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  17. Android数据库更新并保留原来数据的实现
  18. Automated Installations of Multiple RHEL/CentOS 7 Distributions using PXE Server and Kickstart Files
  19. android系统GUI设计师必会资源图制作工具
  20. C# 获取汉字的对应的全拼音和拼音首字母(含源码)

热门文章

  1. Python__random库基本介绍
  2. POJ:3579-Median(二分+尺取寻找中位数)
  3. Windows cmd命令反斜杠问题
  4. Web项目MySQL配置文件运维
  5. Spring+Quartz 集群
  6. 单向链表操作之删除倒数第n个结点
  7. Python学习笔记:电子邮件,POP3收取邮件
  8. nova7修屏逛校园2021-07-07
  9. PIC单片机入门_PICC的指向RAM的指针
  10. Developer FAQ: Building | 开发人员常遇到的问题:构建