优先级队列 priority_queue 的使用及示例代码

news2024/11/18 20:21:20

一、简介

priority_queue 即 优先级队列一种特殊的队列,其中的元素按照一定的优先级顺序排列,每次取出时都会取出具有最高优先级的元素,或者说可以获取队列中的最大/最小元素),它是C++标准模板库(Standard Template Library, STL)中的一个容器适配器,它基于堆(heap)的数据结构进行实现。优先级队列在很多算法和数据结构中都有广泛的应用,如:操作系统调度、图算法(如Dijkstra算法)、任务调度、模拟系统等方面。

对于一个包含n个元素的优先级队列(或者堆),其时间复杂度为:

获取队头(堆顶)元素,即 top() 操作 : O(1)

删除堆顶元素,即 pop() 操作 :               O(log n)

插入操作,即 push() 操作 :                    O(log n)

要使用 priority_queue 需要包含以下头文件

#include <queue>

可参阅C++官方手册:

cplusplus.com/reference/queue/priority_queue/

 

 

二、优先级队列的定义

2.1 类模板定义

priority_queue的类模板定义如下:

template<
    // T是存储在队列中的元素类型
    class T, 

    // Container 是底层容器使用的类型,默认是vector
    // 也可以使用 deque
    class Container = std::vector<T>,
    
    // Compare 是一个可选参数
    // 它是一个用于定义元素之间的比较规则的函数对象。
    // 默认情况下,它使用less,使得优先级高的元素排在最前。
    // 也可以使用greater ,使得优先级低(最小值)排在最前。
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

2.2 最大值优先

定义一个优先获取最大元素的 整数优先级队列,可以使用如下几种方式:

priority_queue<int> pq;

priority_queue<int, vector<int>> pq;

priority_queue<int, vector<int>, less<int>> pq;

示例:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main(){
    int nums[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
    priority_queue<int> pq0(nums, nums + 10);
    
    priority_queue<int, vector<int>> pq1(nums, nums + 10);

    priority_queue<int, vector<int>, less<int>> pq2(nums, nums + 10);

    cout << "priority_queue 0: " << endl;
    while(pq0.size() > 0){
        cout << pq0.top() << " ";
        pq0.pop();
    }
    
    cout << "\npriority_queue 1: " << endl;
    while(pq1.size() > 0){
        cout << pq1.top() << " ";
        pq1.pop();
    }
    
    cout << "\npriority_queue 2: " << endl;
    while(pq2.size() > 0){
        cout << pq2.top() << " ";
        pq2.pop();
    }    
    cout << endl;
    
    return 0;
}

执行结果:

 2.3 最小值优先

定义一个优先获取最小元素的 整数优先级队列,可以使用如下几种方式:

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

示例代码:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main(){
    int nums[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
    priority_queue<int, vector<int>, greater<int>> pq(nums, nums + 10);

    cout << "priority_queue : " << endl;
    while(pq.size() > 0){
        cout << pq.top() << " ";
        pq.pop();
    }
    cout << endl;

    return 0;
}

执行结果:

 

 

三、优先级队列的主要操作

priority_queue的主要操作如下:

push(x): 将元素x插入优先级队列中。
pop(): 弹出优先级队列中的顶部元素。
top(): 获取优先级队列中的顶部元素。
size(): 返回优先级队列中的元素个数。
empty(): 判断优先级队列是否为空。

 

 

四、优先级队列的示例代码

4.1 string 优先级队列

string 优先级队列是根据字符串的字典序进行比较的。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main(){
    string str[5] = {"abc", "def", "ghi", "jkl", "mno"};
    priority_queue<string> pq_less(str, str + 5);
    priority_queue<string, vector<string>, greater<string>> pq_greater(str, str + 5);

    pq_less.push("xyz");
    pq_greater.push("xyz");

    cout << "pq_less (最大值优先): " << endl;
    while(pq_less.size() > 0){
        cout << pq_less.top() << "  ";
        pq_less.pop();
    }

    cout << "\n\npq_greater(最小值优先): " << endl;
    while(!pq_greater.empty()){
        cout << pq_greater.top() << "  ";
        pq_greater.pop();
    }
    cout << endl;

    return 0;
}

输出结果:

4.2 pair<int, int> 优先级队列

pair<int, int> 优先级队列是根据第一个元素进行比较,如果第一个元素的值相同,则会根据第二个元素值的大小进行比较。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int, int> PII;

int main(){

    vector<PII> pii = {
        {1, 10}, 
        {1, 1000}, 
        {1, 100}, 
        {100, 20},
        {999, 0},
        {7, 7},
        {8, 2}        
    };

    priority_queue<PII> pq_less(pii.begin(), pii.end());
    priority_queue<PII, vector<PII>, greater<PII>> pq_greater(pii.begin(), pii.end());

    pq_less.push({666, 666});
    pq_greater.push({666, 666});

    cout << "pq_less (最大值优先): " << endl;
    while(pq_less.size() > 0){
        cout << pq_less.top().first << "\t" << pq_less.top().second << endl;
        pq_less.pop();
    }

    cout << "\n\npq_greater(最小值优先): " << endl;
    while(!pq_greater.empty()){
        cout << pq_greater.top().first << "\t" << pq_greater.top().second << endl;
        pq_greater.pop();
    }
    cout << endl;

    return 0;
}

执行结果:

 

如有不当或错误之处,恳请您的指正,谢谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建部署_Jenkins介绍与安装

构建部署_Jenkins介绍与安装 构建部署_Jenkins介绍与安装Jenkins介绍Jenkins安装 构建部署_Jenkins介绍与安装 Jenkins介绍 Jenkins是一个可扩展的持续集成引擎。 持续集成&#xff0c;就是通常所说的CI&#xff08;Continues Integration&#xff09;&#xff0c;可以说是现…

Android的UI渲染机制(二)

安卓系统中有 2 种 vsync 信号&#xff1a; &#xff08;1&#xff09;屏幕产生的硬件 vsync信号&#xff0c;主要用于通知应用程序开始在自己的窗口“画布”中执行一帧画面的绘制和渲染 &#xff08;2&#xff09;由SurfaceFlinger将其转成的软件 vsync 信号&#xff0c;经由…

十六、接口隔离原则、反射、依赖注入

接口隔离原则、反射、特性、依赖注入 接口隔离原则 客户端不应该依赖它不需要的接口&#xff1b;一个类对另一个类的依赖应该建立在最小的接口上。 五种原则当中的i 上一章中的接口&#xff0c;即契约。 契约就是在说两件事&#xff0c;甲方说自己不会多要&#xff0c;乙方会在…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

优雅的记录日志,拒绝打印模糊信息导致bug定位难

想必大家都有过这样的经历&#xff1a;在项目中遇到报错需要紧急修复时&#xff0c;却因为日志信息模糊不清&#xff0c;无法迅速准确地定位到错误源头&#xff0c;这确实让人感到十分苦恼和无奈。 在新入职一家公司并着手修改遗留bug时&#xff0c;经常发现之前的开发者并未记…

用云服务器构建gpt和stable-diffusion大模型

用云服务器构建gpt和stable-diffusion大模型 一、前置知识二、用云端属于自己的聊天chatGLM3step1、项目配置step2、环境配置1、前置知识2、环境配置流程 step3、创建镜像1、前置知识2、创建镜像流程 step4、通过 Gradio 创建ChatGLM交互界面1、前置知识2、创建ChatGLM交互界面…

利用HubSpot出海CRM和人工智能技术提升出海业务的效率和效果

在当今数字化时代&#xff0c;智能化营销已经成为企业获取客户和扩大市场份额的关键策略。特别是对于出海业务而言&#xff0c;利用智能化营销技术来应对不同文化、语言和市场的挑战&#xff0c;已经成为企业竞争的关键优势。今天运营坛将带领大家探讨如何利用HubSpot CRM和人工…

JVM 重要知识梳理

一、java内存区域 程序计数器&#xff1a;线程私有&#xff0c;唯一一个不会出现outOfMemoryError的内存区域虚拟机栈&#xff1a;线程私有&#xff0c;栈由一个个栈帧组成&#xff0c;而每个栈帧中都拥有&#xff1a;局部变量表、操作数栈、动态链接、方法返回地址。本地方法…

Prompt Learning:人工智能的新篇章

开篇&#xff1a;AI的进化之旅 想象一下&#xff0c;你正在和一位智能助手对话&#xff0c;它不仅理解你的问题&#xff0c;还能提出引导性的问题帮助你更深入地思考。这正是prompt learning的魔力所在——它让机器学习模型变得更加智能和互动。在这篇博客中&#xff0c;我们将…

【JavaScript】面试手撕柯里化函数

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引入柯里化定义实现快速使用柯里化的作用提高自由度bind函数 参考资料 引入 上周…

git区域与对象

大纲 工作区(workspace directory):本机的代码项目,是一种沙箱环境 暂存区(stage index):工作区在程序员写程序的过程中会发生无数次改动&#xff0c;git不可能记录每一次的改动&#xff0c;这些改动的过程在暂存区负责记录&#xff0c;暂存区会将最终的状态随着程序员的提交…

springboot与elasticsearch-7.16.2的基础CRUD使用——入门向

highlight: an-old-hope 基于elasticsearch-7.16.2 &#xff0c;使用的是旧版的高级客户端 restHighLevelClient springboot版本2.6.13 项目原代码地址 https://gitee.com/kenwm/es7demo.git 参考博客 1、SpringBoot集成ElasticSearch&#xff0c;实现模糊查询&#xff0c;批…

学python新手如何安装pycharm;python小白如何安装pycharm

首先找到官网&#xff1a; Download PyCharm: The Python IDE for data science and web development by JetBrains 打开后选择下载&#xff0c;下图标红部分 点击exe程序&#xff0c;点击下一步&#xff01; 选择安装路径&#xff0c;下一步 弹出界面全选 选择默认 然后直接…

Spring核心接口:BeanFactory接口

一图胜千言 BeanFactory 属性&方法解析 点击展开注意&#xff1a;以上代码仅供参考&#xff0c;可能存在不完整或不准确的情况。 public interface BeanFactory {// 根据Bean名称返回Bean实例。// 如果Bean不存在&#xff0c;则抛出NoSuchBeanDefinitionException异常。Obj…

华为机考:HJ43 迷宫问题

华为机考&#xff1a;HJ43 迷宫问题 描述 DFS 从迷宫入口开始进行dfs搜索&#xff0c;每次进入一个点&#xff0c;将其加入临时路径数组中&#xff0c;把该位改成0表示不能进入&#xff0c;然后依次搜索该位下、右、上、左四个方向的点&#xff0c;如果搜索的这个点可以进入则…

【机器学习智能硬件开发全解】(二)—— 政安晨:嵌入式系统基本素养【处理器原理】

嵌入式系统的基本素养包括以下几个方面&#xff1a; 硬件知识&#xff1a;嵌入式系统通常由硬件和软件组成&#xff0c;了解和熟悉硬件的基本知识&#xff0c;包括微处理器、存储器、外设等&#xff0c;并了解它们的工作原理和特性。 软件编程&#xff1a;熟悉至少一种编程语言…

STM32模拟I2C控制TM1650数码管显示电压电流

模拟I2C控制TM1650数码管显示电压电流 数码管的逻辑TM1650 原理模拟I2C的实现TM1650驱动电压电流显示 数码管的逻辑 通过数码管来表示字符。 数码管的abcdefg和dp分别对应这发送过去的8位数据位比如0x3F -> 0011 1111 表示0字符。 如果要加上小数点则在最高位加一&#xf…

同步整流芯片 支持12V降5V 24V降5V 24V降12V 降压芯片 H4122

惠海H4122降压恒压芯片的工作原理&#xff1a; 主要是通过内部电路和算法来控制和调节输出电压&#xff0c;使其保持恒定。 输入电压&#xff1a;芯片接收一个较高的输入电压&#xff0c;如12V、24V或36V。 开关电源转换器&#xff1a;芯片内部通常包含一个或多个开关电源转…

【python pyinstaller库】pyinstaller介绍、安装、以及相关重点知识

PyInstaller是一个在Windows、GNU/Linux、macOS等平台下将Python程序冻结&#xff08;打包&#xff09;为独立可执行文件的工具, 用于在未安装Python的平台上执行Python编写的应用程序。 相比类似工具&#xff0c;它的主要优点是 PyInstaller 与 Python 3.7-3.10 一起工作&…

StarRocks实战——云览科技存算分离实践

目录 背景 一、平台现状&痛点 1.1 使用组件多&#xff0c;维护成本高 1.2 链路冗长&#xff0c;数据时效性难以保证 1.3 服务稳定性不足 二、StarRocks 存算分离调研 2.1 性能对比 2.2 易用性 2.3 存储成本 三、StarRocks 存算分离实践 3.1 查询优化 3.1.1 物化…