priority_queue

news/2024/9/21 2:35:48/文章来源:https://www.cnblogs.com/sprinining/p/18370574

priority_queue

priority_queue 容器适配器定义了一个元素有序排列的队列。默认队列头部的元素优先级最高。因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理。

priority_queue 模板有 3 个参数,其中两个有默认的参数;第一个参数是存储对象的类型,第二个参数是存储元素的底层容器,第三个参数是函数对象,它定义了一个用来决定元素顺序的断言。因此模板类型是:

template <typename T, typename Container=vector<T>, typename Compare=less<T>> class priority_queue

priority_queue 实例默认有一个 vector 容器。函数对象类型 less<T> 是一个默认的排序断言,定义在头文件 function 中,决定了容器中最大的元素会排在队列前面。fonction 中定义了 greater<T>,用来作为模板的最后一个参数对元素排序,最小元素会排在队列前面。

可以如下所示生成一个空的优先级队列:

priority_queue<string> words; 

可以用适当类型的对象初始化一个优先级队列:

string wrds[] { "one", "two", "three", "four"};
priority_queue<string> words { begin(wrds),end(wrds)}; // "two" "three" "one" "four" 

初始化列表中的序列可以来自于任何容器,并且不需要有序。优先级队列会对它们进行排序。

拷贝构造函数会生成一个和现有对象同类型的 priority_queue 对象,它是现有对象的一个副本。例如:

priority_queue<string> copy_words {words};

也有带右值引用参数的拷贝构造函数,它可以移动一个实参对象。

当对容器内容反向排序时,最小的元素会排在队列前面,这时候需要指定 3 个模板类型参数:

string wrds[] {"one", "two", "three", "four"};
priority_queue<string, vector<string>, greater<string>> words1 {begin (wrds) , end (wrds) }; // "four" "one" "three" "two"

这会通过使用 operator>() 函数对字符串对象进行比较,进而生成一个优先级队列,因此这会和它们在队列中的顺序相反。

优先级队列可以使用任何容器来保存元素,只要容器有成员函数 front()、push_back()、pop_back()、size()、empty()。这显然包含了 deque 容器,因此这里也可以用 deque 来代替:

string wrds [] {"one", "two", "three", "four"};
priority_queue<string, deque<string>> words {begin(wrds), end(wrds)};  // "two" "three" "one" "four" 

这个 words 优先级队列在 deque 容器中保存了一些 wrds 数组中的字符串,这里使用默认的比较断言。priority_queue 构造函数会生成一个和第二个类型参数同类型的容器来保存元素,这也是 priority_queue 对象的底层容器。

可以生成 vector 或 deque 容器,然后用它们来初始化 priority_queue:

vector<int> values{21, 22, 12, 3, 24, 54, 56};
// 第一个参数是一个用来对元素排序的函数对象,第二个参数是一个提供初始元素的容器
priority_queue<int> numbers{less<int>(), values};

在队列中用函数对象对 vector 元素的副本排序。values 中元素的顺序没有变,但是优先级队列中的元素顺序变为:56 54 24 22 21 12 3。优先级队列中用来保存元素的容器是私有的,因此只能通过调用 priority_queue 对象的成员函数来对容器进行操作。

如果想使用不同类型的函数,需要指定全部的模板类型参数。例如:

priority_queue<int, vector<int>,greater<int>> numbersl {greater<int>(), values};

第三个类型参数是一个比较对象类型。如果要指定这个参数,必须指定前两个参数——元素类型和底层容器类型。

priority_queue 操作

对 priority_queue 进行操作有一些限制:

  • push(const T& obj):将 obj 的副本放到容器的适当位置,这通常会包含一个排序操作。
  • push(T&& obj):将 obj 放到容器的适当位置,这通常会包含一个排序操作。
  • emplace(T constructor a rgs...):通过调用传入参数的构造函数,在序列的适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。
  • top():返回优先级队列中第一个元素的引用。
  • pop():移除第一个元素。
  • size():返回队列中元素的个数。
  • empty():如果队列为空的话,返回true。
  • swap(priority_queue<T>& other):和参数的元素进行交换,所包含对象的类型必须相同。

priority_queue 也实现了赋值运算,可以将右操作数的元素赋给左操作数;同时也定义了拷贝和移动版的赋值运算符。需要注意的是,priority_queue 容器并没有定义比较运算符。因为需要保持元素的顺序,所以添加元素通常会很慢。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几个场景下用flink如何解决的思考

车辆GPS流和车辆过地磅重量流union,地磅数据最多晚到5天 使用allowedLateness(5d)可以让窗户等待5天再关闭。 1、第二天flink任务重启了,迟到数据还能处理吗?2、大部分车辆都没有称重数据,如何提前关闭这些窗口,避免过多浪费内存设置allowedLateness(5d) 对于没有称重数据…

Mysql从指定位置截取字符串

在实际的项目开发中有时会有对数据库某字段截取部分的需求,这种场景有时直接通过数据库操作来实现比通过代码实现要更方便快捷些,mysql有很多字符串函数可以用来处理这些需求,如Mysql字符串截取总结:left()、right()、substring()、substring_index()。 一.从左开始截取字符…

数据可视化大屏的安全入口:高效登录与入口界面的关键设计(AxureRP原型)

在数据可视化项目中,登录界面和入口界面起着至关重要的作用。登录界面不仅是用户访问系统的第一个接触点,更是确保系统安全性的重要防线。通过有效的身份验证机制,它能够防止未经授权的用户访问敏感数据,保护数据的完整性和隐私。此外,登录界面还承担着展示品牌形象、提升…

RabbitMQ 基础概念与架构设计及工作机制学习总结

什么是RabbitMQ MQ全称为Message Queue,即消息队列. 它也是一个队列,遵循FIFO原则 。RabbitMQ则是一个开源的消息中间件,由erlang语言开发,基于AMQP协议实现的一个软件产品,提供应用程序之间的通信方法,在分布式系统开发中广泛应用。 AMQP协议 AMQP,即Advanced Message …

拖拽式报表设计器优点好 实现流程化办公就靠它!

您知道拖拽式报表设计器的优点是什么吗?当前,实现流程化办公是很多企业都想要实现的目标。利用低代码技术平台、拖拽式报表设计器的优势特点,可以为企业降低开发成本、提升办公效率、创造更多市场价值。那么,您知道拖拽式报表设计器的优点是什么吗?通过本文一起了解拖拽式…

ESP-WROOM32编译带LVGL的MicroPython | lv_micropython for ESP32

ESP-WROOM32编译带LVGL的MicroPython | lv_micropython for ESP32 有关 LVGL 和 MicroPython 的详细信息,请访问以下链接:lv_micropython GitHub 仓库 ESP32 端口目录说明 lv_micropython已经包含了这些驱动程序:lv_micropython 最大支持到 v4.4 版本,因此需要下载 esp-idf…

queue

queue 只能访问 queue<T> 容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。queue 的生成方式和 stack 相同,下面展示如何创建一个保存字符串对象的 queue: queue<string> words;也可以使用拷贝构造函数: queue<string>…

输出一个三角形

1.用for循环设置5次循环 2.包住循环,输出空白的三角形 3.接着for循环输出三角形建议使用debug来了解具体如何运行,此处不好解释

VMware 虚拟机BIOS增加OEM版SLIC2.1

VMware 虚拟机BIOS增加OEM版SLIC2.1 背景 因安装的VMware Win7虚拟机需激活, 现需修改虚拟机BIOS, 增加SLIC2.1支持, 方便激活Win7 指定你的bios文件路径在你的虚拟机目录下修改 *.vmx配置文件, 添加以下内容, 以使用自定义BIOS路径: # BIOS.440.xxx.ROM 是你的BIOS路径 bios44…

一门多范式的编程语言Scala学习的第一天-简介

Scala 1、Scala简介 1.1Scala的介绍scala是一门多范式的编程语言 Scala是把函数式编程思想和面向对象编程思想结合的一种编程语言 大数据计算引擎spark是由Scala编写的1.2Scala的特性 1.2.1多范式 1.2.1.1面向对象特性Scala 是一种高度表达性的编程语言,它结合了面向对象编程和…

VSCode系列 - 如何用VSCode搭建C++高效开发环境(1)

VSCode是笔者用过的最好用的开发工具,没有之一。笔者14年的码龄生涯中,先后用过Eclipse、 IntelliJ IDEA、 WebStorm、 PyCharm、 Visual Studio(2010/2013/2015)、 NetBeans、 Sublime Text等,但自从用VSCode之后,就再没换过其他工具,一直用到现在有5年多的时间。 1. 本文…

[PHP GD Study]我的世界皮肤转迷你世界

涉及图片旋转、放大、复制 目前仅实现了头部的复制 准备工作:迷你世界皮肤底图(命名为miniw.png):我的世界皮肤:源代码: ⚠AI生成 <?php // 设置上传文件的目标目录 $target_dir = "uploads/"; // 创建目标目录如果不存在 if (!file_exists($target_dir)) …