STL之priority_queue

2023-11-14

      priority_queue是一个拥有价值观的queue,它允许加入新元素,移除旧元素,审视新元素值等功能。由于这是一个queue,所以只允许在底部加入元素,并从顶端取出元素,除此之外另无其他存取元素的途径。

        priority_queue带有价值观念,其内的元素并非按照被推入的次序排序,而是按照自动依照元素的权值排序。权值最高者,排在最前面。

       缺省情况下priority_queue是利用一个max-heap完成,后者是一个以vector表现的complete binary tree。max-heap可以满足priority_queue所需要的“依权值高低自动递减排序”的特性。

       由于priority_queue完全以底部容器为根据,再加上heap处理规则,所以其实现非常简单。缺省情况下是以vector为底部容器,源码很简单,此处完整列出。

      queue以底部容器完成其所以工作。具有这种“修改某物接口,形成另一种风貌”之性质者,称为适配器,因此,STL priority_queue往往不被归为容器,而被归类为container adapter。      

class priority_queue{
public:
 typedef typename Sequence::value_type value_type;
 typedef typename Sequence::size_type size_type;
 typedef typename Sequence::reference reference;
 typedef typename Sequence::const_reference const_reference;
protected:
 Sequence c;  // 底层容器
 Compare comp;    // 元素大小比较标准
public:
 priority_queue(): c() {}
 explicit priority_queue(constCompare& x) :  c(), comp(x) {}
 
// 以下用到的make_heap(), push_heap(),pop_heap()都是泛型算法
// 注意,任何一个构造函数都立刻于底层容器内产生一个implicitrepresentation heap。
#ifdef __STL_MEMBER_TEMPLATES
 template <class InputIterator>
 priority_queue(InputIteratorfirst, InputIterator last, const Compare& x)
   : c(first, last), comp(x) { make_heap(c.begin(),c.end(), comp); }
 template <class InputIterator>
 priority_queue(InputIteratorfirst, InputIterator last)
   : c(first, last) { make_heap(c.begin(),c.end(), comp); }
#else /* __STL_MEMBER_TEMPLATES */
 priority_queue(constvalue_type* first, const value_type* last,
                 const Compare& x) :c(first, last), comp(x) {
   make_heap(c.begin(), c.end(), comp);
 }
 priority_queue(constvalue_type* first, const value_type* last)
   : c(first, last) { make_heap(c.begin(),c.end(), comp); }
#endif /* __STL_MEMBER_TEMPLATES */
 
 bool empty()const { return c.empty(); }
 size_type size()const { return c.size(); }
 const_reference top()const { return c.front(); }
 void push(constvalue_type& x) {
   __STL_TRY {
     // push_heap 是泛型算法,先利用底层容器的push_back()将新元素
      // 推入末端,再重排heap
     c.push_back(x);
     push_heap(c.begin(), c.end(), comp);// push_heap 是泛型演算法
   }
   __STL_UNWIND(c.clear());
 }
 void pop(){
   __STL_TRY {
     // pop_heap 是泛型演算法,從 heap 內取出一個元素。它並不是真正將元素
      // 彈出,而是重排heap,然後再以底層容器的pop_back() 取得被彈出
      // 的元素。見C++ Primerp.1195。
     pop_heap(c.begin(), c.end(), comp);  
     c.pop_back();
   }
   __STL_UNWIND(c.clear());
 }
};
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL之priority_queue 的相关文章

  • 如何在 Ubuntu 20.04 上安装 Gitea

    Gitea 是一个用 Go 编写的快速且易于使用的自托管 git 服务器 它包括存储库文件编辑器 项目问题跟踪 用户管理 通知 内置 wiki 等等 Gitea是一个轻量级应用程序 可以安装在低功耗系统上 如果您正在寻找内存占用小得多的 G
  • 如何在 CentOS 8 上安装 MariaDB

    MariaDB 是一个开源关系数据库管理系统 向后兼容 是 MySQL 的二进制直接替代品 它是由 MySQL 的一些原始开发人员和社区中的许多人开发的 在本教程中 我们将解释如何在 CentOS 8 上安装和保护 MariaDB 10 3
  • 如何在 Debian 9 上安装 Memcached

    Memcached 是一个免费开源的高性能内存键值数据存储 它主要用于通过缓存数据库调用结果中的各种对象来加速应用程序 在本教程中 我们将引导您完成在 Debian 9 上安装和配置 Memcached 先决条件 您需要以以下身份登录具有
  • 如何在 Ubuntu 20.04 上安装和配置 Squid 代理

    Squid 是一个功能齐全的缓存代理 支持流行的网络协议 如 HTTP HTTPS FTP 等 它可用于通过缓存重复请求 过滤 Web 流量和访问地理限制内容来提高 Web 服务器的性能 本教程介绍如何在 Ubuntu 20 04 上设置
  • Linux 中的最后一个命令

    如果您正在管理多用户系统 您通常需要知道谁 何时 从何处登录到计算机 last是一个命令行实用程序 显示有关系统用户上次登录会话的信息 当您需要跟踪用户活动或调查可能的安全漏洞时 它非常有用 本文介绍了如何使用以下方式审核登录系统的人员 l
  • 在 CentOS 8 上安装 Odoo 13

    Odoo 是世界上最受欢迎的一体化商业软件 它提供一系列业务应用程序 包括 CRM 网站 电子商务 计费 会计 制造 仓库 项目管理 库存等等 全部无缝集成 本教程介绍了如何安装Odoo13 来自 CentOS 8 计算机上的 Python
  • 如何在 Ubuntu 18.04 上安装 Tomcat 8.5

    Apache Tomcat 是 Java Servlet JavaServer Pages Java 表达式语言和 Java WebSocket 技术的开源实现 它是当今世界上采用最广泛的应用程序和 Web 服务器之一 Tomcat 使用简
  • Java中的抽象工厂设计模式

    欢迎使用 java 示例中的抽象工厂设计模式 抽象工厂设计模式是创建模式之一 抽象工厂模式几乎类似于工厂模式但事实上它更像是工厂中的工厂 抽象工厂 If you are familiar with factory design patter
  • 如何使用 Rsync 同步本地和远程目录

    介绍 Rsync 这代表远程同步 是一款远程与本地文件同步工具 它使用一种算法 通过仅移动已更改的文件部分来最大程度地减少复制的数据量 在本教程中 我们将定义 Rsync 回顾一下使用时的语法rsync 解释如何使用 Rsync 与远程系统
  • 弹簧@Component

    Spring Component 注解用于将一个类表示为 Component 代表着Spring框架将自动检测这些类依赖注入当使用基于注释的配置和类路径扫描时 弹簧组件 通俗地说 组件负责一些操作 Spring 框架提供了另外三个在将类标记

随机推荐

  • 使用 Graphite、StatsD 和 CollectD 跟踪统计数据简介

    介绍 有很多理由可以解释为什么收集有关服务器 应用程序和流量的统计数据是个好主意 收集和组织数据可以让您对有关扩展 故障排除和跟踪配置中的痛点的决策充满信心 有多种工具可用于跟踪我们机器上的指标 并且它们通常被委托给流程的某一小部分 我们可
  • 如何在 Ubuntu 12.04 上设置 ProFTPD

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 如何在 Ubuntu 14.04 上安装和配置 Syncthing 来同步目录

    介绍 有许多程序能够使不同计算机之间的文件保持同步 同步事物是一个引人注目的新选项 它是跨平台的 完全开源的 非常灵活且易于使用 在本指南中 我们将向您展示如何开始使用 Syncthing 在两个 Ubuntu 14 04 服务器实例之间同
  • 如何使用 Ansible Vault 保护敏感的 Playbook 数据

    介绍 Ansible Vault 是一项允许用户加密 Ansible 项目中的值和数据结构的功能 这提供了保护成功运行 Ansible play 所需但不应公开可见的任何敏感数据的能力 例如密码或私钥 当提供密钥时 Ansible 在运行时
  • 如何在 Ubuntu 18.04 中为 Nginx 创建自签名 SSL 证书

    介绍 TLS 或传输层安全 及其前身SSL代表安全套接字层 是用于将正常流量包装在受保护的加密包装器中的 Web 协议 使用此技术 服务器可以在服务器和客户端之间安全地发送流量 而不会出现消息被外部各方拦截的可能性 证书系统还帮助用户验证他
  • 如何在 Ubuntu 14.04 上设置具有 Keepalived 和保留 IP 的高可用 HAProxy 服务器

    介绍 高可用性是系统设计的一项功能 允许应用程序在发生故障时自动重新启动或将工作重新路由到另一个有能力的系统 就服务器而言 建立高可用系统需要几种不同的技术 必须有一个可以重定向工作的组件 并且必须有一种机制来监视故障并在检测到中断时转换系
  • 如何在 Ubuntu 14.04 上使用 HAProxy 作为 WordPress 应用程序服务器的第 4 层负载均衡器

    介绍 在本教程中 我们将教您如何使用 HAProxy 作为 WordPress 服务器 特别是 Web 应用程序层 的第 4 层负载均衡器 负载平衡应用程序服务器为您的设置添加了冗余 从而提高了服务器故障或网络问题时的可靠性 并将负载分散到
  • Node JS 架构 - 单线程事件循环

    今天我们将研究 Node JS 架构和单线程事件循环模型 在我们之前的帖子中 我们讨论过Node js 基础知识 节点 JS 组件 and 节点 JS 安装 Node js 架构 在开始一些 Node JS 编程示例之前 了解 Node J
  • 如何在 Ubuntu 16.04 上为用户目录设置 vsftpd

    介绍 FTP 是文件传输协议的缩写 是一种网络协议 曾经广泛用于在客户端和服务器之间移动文件 此后 它已被更快 更安全 更方便的文件传输方式所取代 许多临时互联网用户希望直接从网络浏览器下载https 并且命令行用户更有可能使用安全协议 例
  • Scala 面试问题

    在阅读这篇文章之前 请浏览我之前的文章 Scala 基本面试问题及解答 获取一些有关 Scala 语言的基础知识 在这篇文章中 我们将讨论更多 Scala 面试问题 这些问题对一些经验丰富的 Scala 开发人员很有用 Note 由于这个列
  • Java 中的扫描器类

    Java Scanner 类是 java util 包的一部分 它是在 Java 1 5 版本中引入的 Scanner 主要用于接收用户输入并将其解析为原始数据类型 例如 int double 或默认 String 它是一个实用程序类 通过
  • Java equals() 和 hashCode()

    Java equals 和 hashCode 方法存在于 Object 类中 所以每个java类都有equals 和hashCode 的默认实现 在这篇文章中 我们将详细研究 java equals 和 hashCode 方法 Java 等
  • 如何在 Ubuntu 18.04 上设置时间同步

    介绍 准确的计时已成为现代软件部署的关键组成部分 无论是确保以正确的顺序记录日志还是正确应用数据库更新 时间不同步都可能导致错误 数据损坏和其他难以调试的问题 Ubuntu 18 04 内置了时间同步 并且默认使用 systemd 的 ti
  • Linux/UNIX 中的 ls 命令

    ls 命令是日常 Linux UNIX 操作中最常用的命令之一 该命令用于列出目录内的内容 是初学者从一开始就学习的少数命令之一 在本指南中 我们将讨论 Linux 中的常见 ls 命令以及可与该命令一起使用的其他参数 使用不带任何参数的
  • 使用 Kotlin 在活动之间进行 Android Intent 处理

    在本教程中 我们将讨论 Android Intents 并在我们的应用程序中使用 Kotlin 实现它们 你会学到什么 什么是意图 意图的类型 在活动之间使用意图 使用 Android Intent 发送数据 使用 Parcelable 和
  • 如何在 Rocky Linux 9 上为专用连接设置 Squid 代理

    介绍 代理服务器是缓存或混淆网络流量的有用方法 这意味着 通过将连接卸载到中介 可以从与表面不同的入站或出站地址提供 Web 请求服务 对于普通最终用户来说 这通常意味着允许您从与您自己的 IP 地址不同的 IP 地址发出 Web 请求 这
  • 如何在 MySQL 中导入和导出数据库以及重置 root 密码

    如何导入和导出数据库 Export 要导出数据库 请打开终端 确保您没有登录 MySQL 并输入 mysqldump u username p database name gt database name sql 您在命令中选择的数据库现在
  • 如何在 Python 中向列表添加元素

    介绍 在本教程中 我们将学习在 Python 中向列表添加元素的不同方法 在 Python 中 有四种方法可以将元素添加到列表中 append 将元素追加到列表末尾 insert 在给定索引之前插入元素 extend 通过附加可迭代对象中的
  • 如何使用 Celery 和 RabbitMQ 在 Ubuntu VPS 上对任务进行排队

    介绍 异步或非阻塞处理是一种将某些任务的执行与程序的主流程分开的方法 这为您提供了多种优势 包括允许面向用户的代码不间断地运行 消息传递是程序组件用来通信和交换信息的一种方法 它可以同步或异步实现 并且可以允许离散进程毫无问题地进行通信 对
  • STL之priority_queue

    priority queue是一个拥有价值观的queue 它允许加入新元素 移除旧元素 审视新元素值等功能 由于这是一个queue 所以只允许在底部加入元素 并从顶端取出元素 除此之外另无其他存取元素的途径 priority queue带有