【c++】stl_priority_queue优先级队列

news2024/9/20 16:55:40

目录

一、priority_queue的介绍

二、 priority_queue的本质

三、priority_queue的使用

四、priority_queue的模拟实现

总结


一、priority_queue的介绍

首先让我们通过阅读优先级队列的官方文档

简单翻译一下

1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素 ( 优先队列中位于顶部的元素)
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类 queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“ 尾部 弹出,其称为优先队列的顶部。
4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:
empty() :检测容器是否为空
size() :返回容器中有效元素个数
front() :返回容器中第一个元素的引用
push_back() :在容器尾部插入元素
5. 标准容器类 vector deque 满足这些需求。默认情况下,如果没有为特定的 priority_queue 类实例化指定容器类,则使用vector
6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、 push_heap pop_heap 来自动完成此操作。

二、 priority_queue的本质

通过阅读优先级队列的模板,我们可以看到priority_queue默认使用vector作为底层的存储数据的容器,然后在vector之上又使用了堆算法将vector中的元素构成堆的结构,因此我们可以认为优先级队列就是堆,所有需要的堆的位置都可以使用 priority_queue(比如:top_k问题)。对于堆来说,大堆还是小堆是十分关键的,让我们将目光看向第三个类模板参数,
Compare = less<typename Container::value_type>

 这里的less是类中仿函数的使用,其本质其实就是判断是否小于:

 此时我们已经彻底了解了优先级队列的本质,接下来我们开始学习使用该容器:

三、priority_queue的使用

 下面我们简单的使用一下上面提到的函数

#include <queue>
#include <iostream>

int main() {
    std::priority_queue<int, std::vector<int>, std::less<int>> pq;

    pq.push(3);
    pq.push(1);
    pq.push(4);
    pq.push(1);

    while (!pq.empty()) {
        std::cout << pq.top() << " ";
        pq.pop();
    }

    return 0;
}

输出结果为:4 3 1 1

在上面的代码中,我们创建了一个存储整数的优先队列pq,并依次插入了4个元素。然后,我们使用top()函数和pop()函数访问和移除元素,最后使用empty()函数检查队列是否为空。

其实我们对于优先级队列的使用就是对于堆的使用。

四、priority_queue的模拟实现

最基础的就是建堆

template <class InputIterator>
priority_queue(InputIterator first, InputIterator last)
{
    while (first != last)
    {
        c.push_back(*first);
        first++;
    }
	for (int i = (c.size() - 2) / 2; i >= 0; i++)//-1是数组下标里面-1,再-1  /2是找    最后一个孩子的爹
	{
        AdjustDown(i);
    }
}

//向下调整
void AdjustDown(int parent)
{
    size_t child = parent * 2 + 1;
    while (child < c.size())
    {
        if (child + 1 < c.size() && comp(c[child], c[child + 1]))child++;//找到最大的左右孩子之一
        if (comp(c[parent], c[child]))
		{
			swap(c[parent], c[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else break;
	}
}
	    Container c;
		Compare comp;

其次就是添加和减少:

	    void push(const T& x)
		{
			c.push_back(x);
			AdjustUp(c.size() - 1);
		}
		void AdjustUp(int child)
		{
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				if(comp(c[parent], c[child]))
				{
					std::swap(c[parent], c[child]);
					child=parent ;
					parent = (child - 1) / 2;
				}
				else break;

			}
		}
		void pop()
		{
			std::swap(c[0], c[c.size() - 1]);
			c.pop_back();
			AdjustDown(0);
		}

最后就是其他比较简单的函数

        bool empty() const
		{
			return c.empty();
		}

		size_t size() const
		{
			return c.size();
		}

		const T& top() const
		{
			return c[0];
		}

总结

优先队列是一种特殊的队列,其中存储的元素按照一定的优先级进行排列。在priority_queue中,优先级最高的元素能够快速被访问和删除。

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

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

相关文章

内存不够用怎么办?整理了几个必备的方法!

内存越大&#xff0c;运行越快&#xff0c;程序之间的切换和响应也会更加流畅。但是随着时间的增加&#xff0c;还是堆积了越来越多的各种文件&#xff0c;导致内存不够用&#xff0c;下面就像大家介绍三种好用的清理内存的方法。 方法一&#xff1a;通过电脑系统自带的性能清理…

关于Android studio新版本和NEW UI显示返回按钮的设置

1.新版Android studio问题 因为在新版本的Android Studio中&#xff0c;默认情况下是没有直接的选项来显示返回上一步按钮在状态栏上的&#xff0c;可以通过以下方法来实现返回上一步的功能&#xff1a; 在Android Studio的顶部菜单栏中&#xff0c;选择"View"。在…

量子纠错率提高100倍!亚马逊云科技开启量子创新时代

由AWS开发和制造的包装组件中的超导量子芯片&#xff08;图片来源&#xff1a;网络&#xff09; 作为一项尖端技术&#xff0c;量子计算能提供前所未有的计算能力。美国亚马逊云科技&#xff08;AWS&#xff09;近期推出了一款量子芯片&#xff0c;展示出该技术取得了重大飞跃…

为什么选择国产WordPress:HelpLook的优势解析

如今网站建设可以说已经是企业必备。而在众多的网站建设工具中&#xff0c;WordPress无疑是其中的佼佼者。作为一款开源的CMS&#xff08;内容管理系统&#xff09;&#xff0c;WordPress拥有丰富的插件和主题&#xff0c;以及强大的功能&#xff0c;使得用户可以轻松地构建出符…

golang 操作Jenkins

1.創建Agent/Node func CreateAgent(username string, password string, nodeName string, nodeDescription string, numExecutors string, remoteFS string, labelString string, host string) {var obj stringobj "{name:" nodeName ",nodeDescription:&q…

洛谷 P8802 [蓝桥杯 2022 国 B] 出差

文章目录 [蓝桥杯 2022 国 B] 出差题目链接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路解析CODE [蓝桥杯 2022 国 B] 出差 题目链接 https://www.luogu.com.cn/problem/P8802 题目描述 A \mathrm{A} A 国有 N N N 个城市&#xff0c;编号为 1 … N …

抖音跑腿小程序开发指南:从零开始到上线

如今&#xff0c;抖音跑腿小程序的开发已经成为一项具有巨大潜力的领域。本文将为您提供一份详尽的开发指南&#xff0c;从零开始引导您完成一个成功的抖音跑腿小程序的开发和上线过程。 第一步&#xff1a;确定目标和需求 了解用户的期望&#xff0c;确定小程序的功能模块&a…

ROS-ROS通信机制-小乌龟

文章目录 1.话题发布2.话题订阅3.服务调用4.参数设置5.通信机制比较 1.话题发布 需求描述: 编码实现乌龟运动控制&#xff0c;让小乌龟做圆周运动。 实现分析: 乌龟运动控制实现&#xff0c;关键节点有两个&#xff0c;一个是乌龟运动显示节点 turtlesim_node&#xff0c;另…

在RHEL8中如何使用 SELinux

本章主要介绍在RHEL8中如何使用 SELinux。 了解什么是 SELinux 了解 SELinux 的上下文 配置端口上下文 了解SELinux的布尔值 了解SELinux的模式 在 Windows系统中安装了一些安全软件后&#xff0c;当执行某个命令时&#xff0c;如果安全软件认为这个 命令对系统是一种危害&a…

【广州华锐互动】3D虚拟还原井下复杂事故:提高安全意识,预防事故再次发生

随着科技的不断发展&#xff0c;3D虚拟现实技术已经逐渐应用于各个领域&#xff0c;为我们的生活带来了诸多便利。在钻井行业&#xff0c;3D虚拟现实技术的应用也日益受到重视。通过3D虚拟还原井下复杂事故&#xff0c;可以帮助我们更直观地了解事故发生的原因和过程&#xff0…

Python3开发环境的搭建

1&#xff0c;电脑操作系统的确认 我的是win10、64位的&#xff0c;你们的操作系统可自寻得。 2&#xff0c;Python安装包的下载 &#xff08;1&#xff09;浏览器种输入网址&#xff1a;https://www.python.org 选择对应的系统&#xff08;我的是win10/64位) &#xf…

如何精准找企业线索?你缺一个法宝

如何找企业数据、找客户&#xff1f;近年来&#xff0c;经常会听到认识的销售朋友抱怨&#xff0c;每天花费大量时间从各种渠道找企业信息、找客户线索&#xff0c;结果总是不如意&#xff0c;投入大量时间&#xff0c;产出却0&#xff1b;创业成功的老板也抱怨优秀人才越来越难…

CSS特效027:超可爱的小狗狗,女孩子都喜欢

为什么当初选择计算机行业&#xff1f; 科技总是迷人的&#xff0c;通过计算机可以造出各种美妙的设计。 后来工作&#xff0c;更加感觉到可视化的魅力&#xff0c;于是乎更加的专注于canvas&#xff0c;CSS&#xff0c;openlayers&#xff0c;leaflet&#xff0c;cesium。。。…

Axure系列(二)之 元件库的介绍以及个人简介案例展示

目录 一. 元件介绍 二. 基本元件的使用 2.1 形状元件 2.2 图片元件 2.3 占位符 2.4 文本 2.5 线段元件 2.6 热区文件 三. 表单元件的使用 3.1 文本框 3.2 文本域 3.3 下拉列表 3.4 列表框 3.5 复选框 3.6 单选按钮 四. 菜单与表格元件的使用 4.1 树 4.2 表格…

大模型元年压轴盛会定档12月28日,第十届WAVE SUMMIT即将启航

回望2023年&#xff0c;大语言模型或许将是科技史上最浓墨重彩的一笔。从技术、产业到生态&#xff0c;大语言模型在突飞猛进中加速重构万物。随着理解、生成、逻辑、记忆四大能力显著提升&#xff0c;大语言模型为通用人工智能带来曙光。 AI开发者们正在用算法和代码书写一个…

连连看游戏

连通块记忆性递归的综合运用 这里x&#xff0c;y的设置反我平常的习惯&#xff0c;搞得我有点晕 实际上可以一输入就交换x&#xff0c;y的数据的 如果设置y1为全局变量的话会warning&#xff1a; warning: built-in function y1 declared as non-function 所以我改成p和q了…

gin投票项目5

对应视频V3版本 1.优化用户注册的功能 增加扩展字段 1.增加一个UUID字段&#xff0c;vachar&#xff08;50&#xff09;。 2.增加一个UUID的唯一索引。 UUID具有全局唯一性&#xff1b; 方法&#xff1a;在数据库中新建一个列&#xff0c;名为uuid并移至主键下方&#xf…

CTF-misc(1)图片隐写

笔记目录 渗透测试工具(1)wireshark渗透测试工具(2)Nmap渗透测试工具(3)BurpsuiteAWD比赛(1)AWD入门攻略大纲CTF-Web(2)SQL注入CTF-Web(3)文件上传漏洞 图片隐写目录 (1)GIf和二维码隐写 二维码补全 二维码绘图 Gif规律分析 (2)文本附加图片隐写 (3)IHDR文件头修复图片宽高 (…

基于单片机智能视力保护台灯控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能视力保护台灯控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机智能视力保护台灯控制系统是一种基于单片机技术的设备&#xff0c;在保证照明效果的同时&#xf…

企业API网关适用业务场景

什么是企业级API网关 企业级API网关是一种用于管理、保护和监控企业内部和外部API&#xff08;Application Programming Interface&#xff09;的解决方案。它提供了一套统一的接入点&#xff0c;帮助企业实现对API的安全性、流量控制、版本管理、监控和分析等方面的管理。企业…