stl-优先队列priority_queue
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相关推荐
- C++STL 优先队列priority_queue使用
头文件:#include <queue> 一.申明方式 std::priority_queue<T> q; std::priority_queue<T, std::vec ...
- C++ STL中的优先队列(priority_queue)使用
原文:https://www.cnblogs.com/cielosun/p/5654595.html 今天讲一讲优先队列(priority_queue),实际上,它的本质就是一个heap,我从STL中 ...
- 浅谈C++ STL中的优先队列(priority_queue)
2019独角兽企业重金招聘Python工程师标准>>> 从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维 ...
- C++ STL实现的优先队列( priority_queue )
本文参考的源码版本:gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project). priority_queue 本质是容 ...
- C++ STL 优先队列
//优先队列 //Priority_queue //STL #include<iostream> #include<cstdio> #include<cstdlib> ...
- stl优先队列定义可以吗_C ++ STL | 用户定义的优先级队列比较器
stl优先队列定义>可以吗 In this article, we are going to see how to write your comparator function for prio ...
- [转载]STL之priority_queue
原文地址:STL之priority_queue作者:李大宝 STL之优先队列 原本以为priority_queue很简单,才知道原来懂的只是最简单的形式. 头文件:#include<queue& ...
- STL优先队列实现堆(模板 附力扣题目)
讲解视频:https://www.bilibili.com/video/BV12i4y1f7ky/ 堆的本质 堆是一种特殊的完全二叉树.每一个节点的值都大于等于或者小于等于其孩子节点的值. 堆的操作时 ...
- 优先队列priority_queue 用法详解
优先队列priority_queue 用法详解 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达 ...
- STL(七)——队列queue优先队列priority_queue
一.queue 1.特点:先进先出(FIFO-first in first out) 只允许在表的前端(front,称为队头)进行删除操作,在表的后端(rear,称为队尾)进行插入操作 2.基本操作 ...
最新文章
- @query 注解的定义_SpringDataJpa(5)---定义查询方法
- Android系统Recovery工作原理之使用update.zip升级过程分析(五)
- LDA入门级学习笔记
- 7 Java NIO Selector-翻译
- MySQL数据库基本的“增删改查”操作 -《狗嗨默示录》-
- VTK:相互作用之UserEvent
- 微软发布 SQL Server 2019 新版本
- 阿里可观测性数据引擎的技术实践
- FFmpeg在Ubuntu的安装以及教程~~~
- 每日签到html特效,前端这种连续签到的效果要怎么写
- 新手小白该怎么学习前端?附学习路线和资料
- 《Java高级程序设计》第一周作业
- java.io.InvalidClassException
- 使用函数式编程优化代码
- 各大主流浏览器的内核
- HTML学生个人网站作业设计:电影网站设计——橙色国外电影(13页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
- Android数据库更新并保留原来数据的实现
- Automated Installations of Multiple RHEL/CentOS 7 Distributions using PXE Server and Kickstart Files
- android系统GUI设计师必会资源图制作工具
- C# 获取汉字的对应的全拼音和拼音首字母(含源码)