热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:STL——priority_queue的用法及实例

篇首语:本文由编程笔记#小编为大家整理,主要介绍了STL——priority_queue的用法及实例相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了STL —— priority_queue的用法及实例相关的知识,希望对你有一定的参考价值。








文章目录


    • Priority Queue的概念及性质
    • STL——priority_queue的用法
    • 实例




Priority Queue的概念及性质

 队列结构可以用来解决很多日常的问题,像是先来先服务的银行柜台等。但是很多场景下,队列这种“先进先出”的简单规则并不能很好的满足问题的需求,例如,在医院就诊时,如果新来的病患病情特别严重,随时都由生命危险,那么此时应该先安排该患者就诊,而不是等待前面先来的患者就诊完再接受治疗,这样可能会耽误治疗的最佳时机。
 对于病情严重情况、到医院时间早晚这些信息,都可以将它们进行量化和比较,因此可以将它们的大小视为优先级(Priority),而这种能够将数据按照事先规定的优先级次序进行动态组织的数据结构称为优先队列(Priority Queue)

 优先队列与队列基本相似,从一端插入(队尾),从另一端删除(队首),并且每次只能访问位于队首的元素,即队首的元素先出队。

 优先队列中,每个元素都被赋予了优先级,访问元素时,只能访问当前队列中优先级最高的元素。
 因此,priority_queue容器适配器中元素的插入和删除操作,遵循的并不是简单的先入先出(First-In-First-Out,FIFO)原则,而是最高级先出(First-In Greatest-Out)原则,即最先进队列的元素不一定先出队列,优先级最大的元素最先出队列




STL——priority_queue的用法

在C++的标准库中提供了优先队列模板,优先队列底层是用二叉堆实现的,但读者无需关心其内部的实现细节,只需要掌握如何使用即可。

基本操作包括:


  • 判空 empty()
  • 元素个数 size()
  • 添加 push()、emmplace() (c++11)
  • 删除 pop()
  • 优先级最高元素 top()
  • 交换 swap() (c++11)



  • 首先,要使用标准库中的priority_queue模板,应该在头文件中添加头文件:

#include

  • 定义一个优先队列priority_queue

//priority_queue name;
//typename 是队列元素的类型,name是所定义优先队列的名字,例如
priority_queue<int> myPriorityQueue;

  • 判断当前优先队列是否为空

myPriorityQueue.empty(); //若为空返回true

  • 返回当前优先队列元素的个数

myPriorityQueue.size();

  • 添加新元素

myPriorityQueue.push(x);

myPriorityQueue.emplace(x);

 对于这两个操作&#xff0c;push的操作可以直接用于emplace&#xff0c;唯一需要注意的是&#xff0c;emplace可以直接传入构造对象需要的元素&#xff0c;然后自己调用其构造函数&#xff1b;而push只能让其构造函数构造好对象之后&#xff0c;再使用复制构造函数。也就是说push多了复制这一步&#xff0c;所以emplace更节省内存。


  • 删除元素

myPriorityQueue.pop();

  • 访问元素
    由于优先队列对访问元素的限制&#xff0c;优先队列只能通过top()访问当前队列中优先级最高的元素。

myPriorityQueue.top();

  • 将两个priority_queue中的元素进行互换&#xff0c;注意元素类型必须相同

//C&#43;&#43;11
priority_queue<int> foo;
priority_queue<int> bar;
foo.push(10); foo.push(20); foo.push(30);
bar.push(100); bar.push(200);
foo.swap(bar); //交换元素
//swap(foo, bar); //也可以

  经过这样的操作&#xff0c;bar和foo中的元素进行了交换&#xff0c;现在&#xff0c;bar中的元素为30&#xff0c;20&#xff0c;10&#xff1b;foo中的元素为200&#xff0c;100。


实例

  下面我给出一个简单的实例对priority_queue的用法做个总结。

#include<iostream>
#include
using namespace std;
int main(){
//1.定义
priority_queue<int> myPriorityQueue;

//2.获得队列长度&#xff0c;目前还没有任何元素进队&#xff0c;所以应该为0
cout<<"the size of myPriorityQueue: "<<myPriorityQueue.size()<<endl;

//3.入队&#xff0c;数字1-9入队
for(int i&#61;1; i<10; i&#43;&#43;){
myPriorityQueue.push(i);
}

//4.访问队列长度、优先级最高元素
cout<<"the size of myPriorityQueue: "<<myPriorityQueue.size()<<endl;;
cout<<"the top of myPriorityQueue: "<<myPriorityQueue.top()<<endl;

//5.访问整个队列并计算总和
int sum &#61; 0;
while(!myPriorityQueue.empty()){
int tmp &#61; myPriorityQueue.top(); //记录优先级最高元素
sum &#43;&#61; tmp;
cout<<tmp<<" ";
myPriorityQueue.pop();
}
cout<<endl;
cout<<"sum: "<<sum<<endl;

//6.判断优先队列是否为空&#xff0c;由于上个操作删除了队列中的所有元素&#xff0c;故现在队列为空
if(myPriorityQueue.empty()){
cout<<"myPriorityQueue is empty."<<endl;
}

//7.1交换两个队列元素
priority_queue<int> foo;
priority_queue<int> bar;
foo.push(10); foo.push(20); foo.push(30);
bar.push(100); bar.push(200);
// foo.swap(bar);
swap(foo,bar);
//7.2输出交换后的各个队列的元素
cout<<"foo: ";
while(!foo.empty()){
int tmp1 &#61; foo.top();
cout<<tmp1<<" ";
foo.pop();
}
cout<<endl;
cout<<"bar: ";
while(!bar.empty()){
int tmp2 &#61; bar.top();
cout<<tmp2<<" ";
bar.pop();
}
return 0;
}

  执行结果为&#xff1a;
在这里插入图片描述






推荐阅读
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 本文详细解析了2019年西安邀请赛中的一道树形动态规划题目——J题《And And And》。题目要求计算树中所有子路径异或值为0的集合数量,通过深入分析和算法优化,提供了高效的解决方案。 ... [详细]
  • BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • 本文介绍了一道来自《紫书》的编程题目——UVa11212 编辑书稿。该问题通过迭代加深搜索(IDA*)算法解决,旨在找到将给定排列转换为升序排列所需的最少步骤。文章提供了详细的解题思路和代码实现。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文介绍了一个项目中如何在Windows平台上实现多声道音频数据的采集,特别是针对DANTE音频接口的8路立体声音频通道。文章详细描述了使用Windows底层音频API进行音频采集的方法,并提供了一个具体的实现示例。 ... [详细]
  • MainActivityimportandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;im ... [详细]
author-avatar
放肆情人800
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有