例说数据结构&STL(七)——priority_queue

2023-11-04

1 白话优先队列(priority_queue)
  前面我们已经相继介绍了双向队列和FIFO特性的队列,这里我们还要接触另一个包含“队列”称呼的数据结构——优先队列。其实这三个数据结构名称看似很像,实则天差万别,通过下面的介绍你就会有很深的体会了。
  那么何为优先队列呢,在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问。即优先队列具有最高级先出的行为特征。所以说队列queue可以看成是优先队列的一个特殊情况,其中的数据优先级别是按数据的插入时间先后排序的,这种插入时间的先后就可以看做是一种优先级。在默认的优先队列中,优先级最高的先出队。默认的int类型的优先队列中先出队的为队列中较大的数。
  介绍到此,你是不是发现它有些像构建堆呢?也就是大顶堆表示优先级最高的先出队,而小顶堆表示优先级别最低的先出队。
2 STL中priority_queue实战
 2.1 包含heap的头文件
  priority_queue和queue一样定义在同一个头文件中的,另外使用一直强调的std命名空间一定要加上,实现如下:

#include<queue>

using namespace std;

 2.2 声明优先队列对象
  优先队列模板类的构造实际上有三个类型需要给出,默认构造如下:

priority_queue<int> que1;       // 普通构造,默认是大顶堆

priority_queue<int> que2(10,3);// 带参构造初始化10个数据3

  此外我们还可以手工构造,这样就可以定义为大顶堆还是小顶堆了,如下:

priority_queue<int, vector<int>, less<int>>    //大顶堆:表示其他都比堆顶小
priority_queue<int, vector<int>, greater<int>> //小顶堆:表示其他都比堆顶大

  所以默认情况下是less构建的大顶堆,表示其中的数越来越小。要记住,如果是要手工确认优先级规则,那么内部使用的容器一定也要手动加上,不可以是priority_queue<int, greater<int>>这样定义。
  另外,上面的less和greater是定义在functional.h头文件中,如果使用这样的系统自带功能函数一定要加上对应的头文件。当然我们也可以自定义优先规则,这个后面再详细说明。
 2.3 基本操作
  基本操作和队列大致相同,除了队列既可以访问队首也可以访问队尾,而优先队列只能访问队首,所以访问接口不同,其他几乎一样。此外优先队列也是适配器类型容器,所以没有对应的迭代器功能定义。基本操作如下:

que1.empty( );  // 判断队列是否为空

que1.pop( );    // 删除队顶元素

que1.push( );   // 加入一个元素

que1.size( );   // 返回优先队列中拥有的元素个数

que1.top( );    // 返回队顶元素,接口和stack名一样。而queue中是front()和back()

 2.4 自定义优先级规则
  优先级的规则定义常用是下面两种方法,主要都是构建一个结构体,一种方法是在结构体中重载运算符(),而另一种是构建一个友元的函数重载运算符<。

// 自定义优先级规则
struct cmp
{
    bool operator()(int a, int b) //重载运算符(),参数是int后面只能声明int类型优先队列
    {
        return a < b; //最大值优先,如果a>b就是最小值优先
    }
};

priority_queue<int,vector<int>,cmp> que; //只能是构建int类型有限队列

  首先结构体中重载运算符类型决定了你构建优先队列模板类类型,如果是重载运算符()中参数类型是string,则构建优先队列只能是string类型。此外比较的大小符号决定构建最大堆还是最小堆。
  另外一种方法如下:

//定义结构,使用成员函数运算符重载<自定义优先级1 
struct node{  
    int x;  
    bool operator < (const node &a) const {  
        return x>a.x;  // 最小值优先,<则为最大值优先  
    }  
}; 

//定义结构,使用友元函数运算符重载<自定义优先级2 
struct node{  
    int x;  
    friend bool operator < (const node &a, const node &b) const {  
        return a.x>b.x;   // 最小值优先,<则为最大值优先  
    }  
}; 

priority_queue<node> que; // 构建node类型的优先队列对象
node num[]={14,10,56,7,83,22,36,91,3,47}; // 创建多个结构体的对象,并且初始化数据x
for(int& i : num)
{
    que.push(i); // 依次读进node,根据参数x优先排列
}

  成员函数和友元函数两种表达方式都行,使用该方法则优先队列的类型需要就是该结构体,并且优先队列的前后顺序由结构体中比较符和对应参数决定。此处需要注意,重载>号会编译出错,因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。而且自定义优先级与重载操作运算符类型并无直接联系,我们按规则行事即可。

3 小结
  上面介绍了优先队列数据结构特点以及STL中包含的接口。由于优先队列是基于堆完成敬意,所以其存取的时间复杂度为O(logn),n为队列中元素的个数。
  以上是个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
  转载请注明出处:http://blog.csdn.net/FX677588/article/details/76359337


  参考文献:
  http://blog.csdn.net/u011240016/article/details/59266961
  http://blog.csdn.net/ac_gibson/article/details/44200411
  http://www.cnblogs.com/heqinghui/archive/2013/07/30/3225407.html

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

例说数据结构&STL(七)——priority_queue 的相关文章

  • 使用连续内存并具有保留功能的映射和集合

    我使用了几张地图和套件 缺乏连续内存以及大量的分配 解除 是性能瓶颈 我需要一个主要与 STL 兼容的映射和集合类 它可以将连续的内存块用于内部对象 或多个块 它还需要有一个reserve函数 以便我可以预先分配预期的大小 在我自己编写之前
  • 如何从priority_queue中删除不在顶部的元素?

    在我的程序中 我需要从优先级队列中删除不在顶部的元素 可以吗 如果没有 请建议一种除了创建自己的堆之外的方法 标准priority queue
  • 从 std::heap 中间删除一个元素

    我使用优先级队列作为调度程序 但有一个额外的要求 我需要能够取消预定的项目 这相当于从优先级队列中间删除一个项目 我不能使用std priority queue因为对除顶部之外的任何元素的访问都受到保护 我正在尝试使用algorithm的堆
  • STL:为向量编写“where”运算符

    我需要根据几个布尔谓词找到向量中的索引 ex vector
  • end()在STL容器中是如何实现的?

    因此 当我们需要从头到尾遍历容器时 我们会写类似的内容 for i v gt begin i v gt end i 假设i是容器的迭代器v 我的问题是 什么保证 end 将始终指向容器中最后一个元素之后的一个 STL 如何确保这种行为 这种
  • C++ 中有标准的日期/时间类吗?

    C stl 有标准时间类吗 或者我是否必须在写入流之前转换为 c 字符串 例如 我想将当前日期 时间输出到字符串流 time t tm ostringstream sout sout lt lt tm lt lt ends 在本例中 我将当
  • 迭代还是使用计数器,这就是问题

    每当有人开始使用 STL 并且他们有一个向量时 您通常会看到 vector
  • C++ STL 下一个排列与组合

    我知道我可以使用std next permutation在包含元素的某些容器上 1 2 3 这将生成该序列的 6 种排列 我想做的是给定一些设置 1 2 3 4 5 6 生成大小为 3 的所有可能的排列 因此对于这个例子 4 3 2 将是由
  • 专门化 STL 算法,以便它们在可用时自动调用高效的容器成员函数

    STL 具有全局算法 可以在任意容器上运行 只要它们支持该算法的基本要求 例如 某些算法可能要求容器具有随机访问迭代器 例如向量而不是列表 当容器具有比通用算法更快的执行方式时 它会提供具有相同名称的成员函数来实现相同的目标 就像提供自己的
  • 如何在 C++ 中将值从向量转换为映射?

    我想做这样的事情 有没有一个stl算法可以轻松做到这一点 for each auto aValue in aVector aMap aValue 1 如果您有一个对向量 其中对中的第一项将是映射的键 第二项将是与该键关联的值 您可以使用插入
  • 在 C++ 中将惰性生成器实现为forward_iterator

    MyGenerator 表示 可能 有限的整数序列 计算成本很高 所以我不想预先生成它们并将它们放入容器中 struct MyGenerator bool HasNext int Next 要打印全部 MyGenerator generat
  • Windows Unicode C++ 流输出失败

    我目前正在编写一个应用程序 它要求我在任意窗口上调用 GetWindowText 并将该数据存储到文件中以供以后处理 长话短说 我注意到我的工具在 战地 3 上失败了 我将问题范围缩小到窗口标题中的以下字符 http www filefor
  • 引用计数指针的STL类?

    这应该是微不足道的 但我似乎找不到它 除非不存在这样的类 智能指针的 STL 类 或类集 是什么 UPDATE 感谢您的回复 我必须说我很惊讶没有标准实施 我最终使用了这个 http archive gamedev net referenc
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • 了解 std::swap()。 tr1::_Remove_reference 的目的是什么?

    在 VS10 的 STL 实现中 有以下 std swap 变体的代码 TEMPLATE FUNCTION Move template
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • C++类名冲突

    我现在正在做一个项目 需要整合两个子项目 项目A是用C 编写的 项目B是用C编写的 一个问题是 在项目B中 有一个名为vector它是由其作者创建的 在项目 A 中 std vector in STL用来 因为项目B以后可能会更新 所以我不
  • 为什么 std::queue 使用 std::dequeue 作为底层默认容器?

    继续阅读cplusplus com http www cplusplus com reference queue queue std queue实现如下 队列被实现为容器适配器 这些类 使用特定容器类的封装对象作为其 底层容器 提供一组特定
  • 可能的 std::async 实现错误 Windows

    看来 std async 的 Windows 实现存在错误 在重负载下 大约每秒启动 1000 个异步线程 异步任务永远不会被调度 并且等待返回的 future 会导致死锁 请参阅这段代码 使用延迟启动策略而不是异步进行修改 Bundlin
  • std::accumulate 未按预期运行

    我使用 std accumulate 和测试代码得到了意外的结果 我正在尝试将一个大的双精度向量相加 但由于某种原因该值溢出 include

随机推荐

  • 2021-05-26

    import org apache flink api common functions RichMapFunction import org apache flink statefun flink core StatefulFunctio
  • 到底什么是数据中台?

    最近可能大家听到 数据中台 这个词越来越频繁了 有时候我跟一些朋友聊起来 也是都在说这个 但是一直不知道这到底是个什么 最近就看到这篇文章 觉得说的还挺好的 分享给大家看看 希望大家看完能对数据中台有一些认识 转载来源 公众号 AI 前线
  • 【面向对象】多态类继承

    package TcmStudy day26 public class Test01 public static void main String args Cat c1 new Cat 子类对象初始化 实例化子类对象 创建一个父类类型对象
  • 7.2-C 标准库的实现

    复习 sh xv6 c 仅依赖系统调用的 最小 命令行 Shell 本次课回答的问题 Q 如何在系统调用之上构建程序能够普遍受惠的标准库 本次课主要内容 C 标准库设计与实现 基于 libc 的应用程序 一 熟悉又陌生的 libc 为什么需
  • Python基本操作

    前言 啦啦啦 现在开始 打算做一期Python基础教程 欢迎大家来看哦 导读 这期文章真的是Python基础中的基础 相信有一定编程基础的小伙伴们都一定能看懂的 本文共分为以下几个部分 数与运算符 基本输入输出 注释 模块基本操作 小彩蛋
  • Blob总结

    Blob Blob表示二进制类型的大对象 在数据库管理系统中 将二进制数据存储为一个单一个体的集合 Blob 对象表示一个不可变 原始数据的类文件对象 Blob 表示的不一定是JavaScript原生格式的数据 File 接口基于Blob
  • 磁盘性能测试工具-FIO的安装及使用

    文章目录 FIO介绍 FIO安装 在线安装 离线安装 磁盘测试 命令行方式 测试结果说明 命令参数说明 配置文件方式 dd命令介绍 使用方法 FIO介绍 FIO是一款测试IOPS的工具 用于对磁盘进行压力测试和验证 磁盘I O是检查磁盘性能
  • Arcpy(二)逐要素批量裁剪矢量数据集

    文章目录 一 前言 1 1 需求 1 2 实现思路 二 代码 2 1 导入库 2 2 设置文件夹路径并获取图幅编号 2 3 逐图幅批量裁剪 2 4 删除空要素类 三 小结 参考资料 一 前言 1 1 需求 现有一个较大区域的地形图数据集 矢
  • Android性能测试

    Android应用性能测试 Android用户也许会经常碰到以下的问题 1 应用后台开着 手机很快没电了 应用耗电大 2 首次 非首次启动应用 进入应用特别慢 应用启动慢 3 应用使用过程中 越来越卡 CPU能力不足 内存泄露 4 应用页面
  • JavaScript---DOM对象

    文章目录 JavaScript DOM对象 一 操作DOM对象 1 1 DOM对象的核心 1 2 获得DOM节点 1 3 更新DOM节点 1 4 删除DOM节点 1 5 插入DOM节点 1 6 创建一个新标签 实现插入 1 7 insert
  • Intro to Java Programming(Liang.10th)--02

    Chapter2 2 2 Writing a simple program ComputeArea concatenate strings 2 3 Reading input form Console How to specific imp
  • hive sql/ spark sql/sql 根据时间取最新的记录

    取用户购买的最新时间 套餐 价格等 由于用户购买的套餐类型多 导致求出来的是各个套餐的最新时间 但是我只要用户购买时间最新的一个套餐 直接select userid max time product from 表 group by user
  • C语言课程设计之设计菜单程序

    C语言课程设计之设计菜单程序 设计要求 1 菜单内容 程序运行后 给出三个菜单选项的内容和输入提示 1 FindNum 2 Dimand 3 Goodbye Input 1 3 2 设计要求 使用1 3数字来选择菜单项 其他输入则不起作用
  • 【剑指offer】数据结构——字符串

    目录 数据结构 字符串 直接解 剑指offer 05 替换空格 剑指offer 17 打印从1到最大的n位数 剑指offer 20 表示数值的字符串 剑指offer 37 序列化二叉树 剑指offer 50 第一个只出现一次的字符 剑指of
  • CUDA笔记

    1 cudaDeviceSynchronize 用于CPU和GPU同步 即cpu和GPU均运行至cudaDeviceSynchronize 后再继续 CPU多线程时 会阻止所有线程 2 syncthreads 用于核函数内线程块线程同步 即
  • Cygwin配置优化(乱码、颜色等问题)

    前面介绍了如何将Cygwin集成到Windows资源管理器的右键菜单中 点击在当前路径下打开窗口 本文介绍一些乱码问题与美化问题 1 乱码问题 在Cygwin中执行Windows原生程序 如ping ipconfig 时会出现中文乱码 显示
  • 遗传算法与TSP问题

    一 遗传算法 遗传算法 Genetic Algorithm 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 是一种通过模拟自然进化过程搜索最优解的方法 遗传算法是从代表问题可能潜在的解集的一个种群 population
  • 一致性Hash算法

    原文 https www cnblogs com lpfuture p 5796398 html 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的 设计目标是为了解决因特网中的
  • matlab中dropoutLayer,[转]对 CNN 中 dropout layer 的理解

    原文网址 http blog csdn net u012702874 article details 45030991 dropout layer的目的是为了防止CNN 过拟合 那么为什么可以有效的防止过拟合呢 首先 想象我们现在只训练一个
  • 例说数据结构&STL(七)——priority_queue

    1 白话优先队列 priority queue 前面我们已经相继介绍了双向队列和FIFO特性的队列 这里我们还要接触另一个包含 队列 称呼的数据结构 优先队列 其实这三个数据结构名称看似很像 实则天差万别 通过下面的介绍你就会有很深的体会了