SGISTL源码探究-优先级队列

栈与队列2s总结(不含单调栈) 1.栈可以有效解决匹配问题。在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了。 阅读详情

前言

在上一小节中,我们分析了heap算法,其实是为了priority_queue优先级队列做准备,它也不是容器,而是配接器,因为它是通过vector来实现的,然后封装了一些vector提供的接口供自己使用而形成的。
优先级队列,即一种特殊的队列,但是它内部的元素没有按照传统队列的先进先出这种顺序排序,而是按照元素的权值进行排列,所以执行出队操作时,出队的是权值最大的元素。

priority_queue

在SGISTL的实现中,priority_queue队列底部实现的容器就是vector,然后再配合heap提供的一些算法就可以完成优先级队列的所有功能了。
它的实现源码如下:

定义部分
#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
template <class T, class Sequence = vector<T>,
          class Compare = less<typename Sequence::value_type> >
#else
template <class T, class Sequence, class Compare>
#endif
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(const Compare& x) :  c(), comp(x) {}

#ifdef __STL_MEMBER_TEMPLATES
  //以迭代器范围构造时,调用make_heap函数使这些元素形成堆结构
  template <class InputIterator>
  priority_queue(InputIterator first, InputIterator last, const Compare& x)
    : c(first, last), comp(x) { make_heap(c.begin(), c.end(), comp); }
  template <class InputIterator>
  priority_queue(InputIterator first, InputIterator last)
    : c(first, last) { make_heap(c.begin(), c.end(), comp); }
#else /* __STL_MEMBER_TEMPLATES */
  priority_queue(const value_type* first, const value_type* last,
                 const Compare& x) : c(first, last), comp(x) {
    make_heap(c.begin(), c.end(), comp);
  }
  priority_queue(const value_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(); }
  /* 将元素压入优先级队列
   * 先将元素压入vector尾部
   * 然后调用push_heap进行调整
   */
  void push(const value_type& x) {
    __STL_TRY {
      c.push_back(x);
      push_heap(c.begin(), c.end(), comp);
    }
    __STL_UNWIND(c.clear());
  }
  /* 调用pop_heap将权值最大的元素存在vector尾部
   * 接着调用vector提供的pop_back弹出尾部元素
   */
  void pop() {
    __STL_TRY {
      pop_heap(c.begin(), c.end(), comp);
      c.pop_back();
    }
    __STL_UNWIND(c.clear());
  }
};
例子
#include <iostream>
#include <queue>
using namespace std;
int main()
{
    vector<int> vec{0, 1, 2, 3, 4, 5, 6};
    priority_queue<int> pri_que(vec.begin(), vec.end());


    while(!pri_que.empty())
    {
        cout << pri_que.top() << endl;
        pri_que.pop();
    }

    pri_que.push(10);
    cout << pri_que.top() << endl;

    return 0;
}

很简单的一个例子,这里为了方便理解,就只使用了最普通的int作为权值,你可以尝试声明一个对象,然后定义自己的compare类作为大小比较标准,然后在创建priority_queue的时候指定比较标准。

小结

在本小节中,我们分析了priority_queue的实现,其实它的实现很简单,在我们并没有深入源码的时候可能觉得它很复杂,但是并不是。
priority_queue主要借用了vector作为底部容器,以及使用了heap有关的算法,只是改变了相应的接口,就形成了另外一种数据结构,不得不感叹stl的精妙。
关于序列式容器,我们就告一段落,接下来我们将进入到关联式容器。但是由于set和map这类关联式容器都借助了红黑树实现,所以我们要先对红黑树做个了解。

疑难问题(二)——PyTorch 2.3.0 ‘import torch‘ 错误排查:深入解析‘shm.dll‘加载失败与系统路径修复 本文深入解析了在Windows系统上安装PyTorch 2.3.0后,执行'import torch'时遇到的'shm.dll'加载失败错误(OSError)。该问题通常源于系统DLL搜索路径缺失,导致无法找到关键的共享内存通信组件或其依赖项。文章提供了核心解决方案:通过手动修改PyTorch的`__init__.py`文件,将用户基目录下的Library\bin路径添加到DLL搜索列表中,从而从根本上修复此导入错误,并给出了详细的修改步骤和验证方法。 阅读详情

相关推荐

告别Mac自带终端:iTerm2 + Oh My Zsh 保姆级配置指南(含国内镜像源)

本文提供了一份详细的Mac终端优化指南,涵盖iTerm2、Oh My Zsh和Homebrew的配置流程,特别针对国内用户提供镜像源解决方案。通过安装现代化工具链和优化配置,帮助开发者打造高效、美观的终端工作环境,提升日常开发效率。

weixin_42638178的博客 397

c++之STL(8)优先级队列 priority_queue

本文是听的网络课程,而记录下来的学习心得。 自适应容器(容器适配器):不能使用list 特点:数据中最大的放的是队首 从队首拿出来的数据始终是最大的 两种优先级队列: 最大值优先级队列、最小值优先级队列 优先级队列适配器 STL priority_queue priority_queue> pq; priority_queue> pq; pq.empty() p

taotaoahui 823

Windows 游戏 EXCEPTION_ACCESS_VIOLATION 修复:3类硬件问题与5步软件排查法

本文提供Windows游戏EXCEPTION_ACCESS_VIOLATION错误的终极修复指南,涵盖3类硬件问题(内存故障、显卡问题、超频不稳定)和5步软件排查法(文件验证、驱动更新、DEP调整等),帮助玩家彻底解决0xFFFFFFFFFFFFFFFF内存访问冲突问题。

weixin_31856057的博客 2417

STL-08-priority_queue源码剖析

priority_queue一、相关定义二、使用方法1、普通方法:2、自定义优先级:3、结构体声明方式:4、代码使用介绍三、源码剖析 一、相关定义     优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规

FairLikeSnow的博客 479

逆向淘宝x-mini-wua:从加密算法到设备指纹的生成逻辑

本文深入剖析了淘宝风控核心参数x-mini-wua的生成逻辑与加密算法。通过逆向分析,揭示了其作为设备“身份证”的作用,详细拆解了从硬件信息采集、SG_INNER_DATA文件解密、关键参数提取到最终长wua合成的完整技术链条,并探讨了模拟生成与绕过风控的实战思路及注意事项。

year5的博客 1076

光耦继电器电路分析

光耦电路的分析笔记

MingYue_SSS的博客 6874

STL源码笔记(14)—堆和优先级队列(一)

STL堆和优先级队列简介

上善若水 1733

2024年物联网嵌入式最新嵌入式期末大作业——家用智能晾衣杆,初面蚂蚁金服

在家用智能晾衣杆中,用户可以根据自身的需要,切换手动和自动两个模式。天气对应的接口对应心知天气的天气图,可以下载后:调整尺寸->调整透明度->用画图工具保存为单色位图->提取出点阵信息(如我用的zimoV2.2软件),将点阵信息,存到数组里,根据weather的信息,调用display.drawBitmap()方法就能打印出对应的天气了。该库依赖于,将他们导入后,设置屏幕的主从关系,片选信号和数据,时钟信号等引脚后,就设置好屏幕的驱动。

2401_85013604的博客 1247

STL源码:priority_queue

优先队列完全以底部容器为依据,加上heap处理规则,实现很简单。缺省下以vector为底部容器,利用大根堆。它是一个有权值概念的queue(头出尾进,无其他存取元素的途径)。          和queue、stack一样,是容器适配器,详见queue #ifndef __STL_LIMITED_DEFAULT_TEMPLATES template , class Compare =

Sunshine的专栏 1487

【PointNet++】制作点云数据集使用CloudCompare进行标注

使用PointNet++复现成功后,需要训练自己的数据集。于是使用cloudcompare参照ShapeNet的数据集格式去制作,最终保存的txt文件格式为“xyz+rgb+label”,一共7列。 自己按此制作好的数据集已成功训练及推测,于是记录下来让好兄弟好姐妹们少踩坑多吃肉。

纵马踏花向自由 5714

openpi 入门教程(二)droid libero 训练、推理

OpenPI是由物理智能团队发布的机器人领域开源模型与软件平台,提供基于流扩散式(π₀)和自回归式(π₀-FAST)两类视觉-语言-动作模型。平台支持在DROID、ALOHA、UR5等多种机器人系统上部署,包含预训练检查点(1万+小时数据)和微调示例。文档详细说明了各平台部署流程:DROID需启动策略服务器并配置摄像头;ALOHA提供真实机器人任务(取吐司、叠毛巾等)的检查点和场景设置建议;UR5示例展示自定义数据转换方法。实验性验证显示π₀-FAST在LIBERO基准测试中平均得分85.5。平台强调模型适

2506_90492529的博客 1023

SGISTL源码探究-大根堆heap

前言小根堆和大根堆的概念在数据结构都讲过,等下简单的过一下就行了。在SGISTL的实现中,它并不作为一种容器,而是一系列的算法,用于给priority_queue提供支持,使优先级队列能够体现其优先级。 在SGISTL实现heap中,采用的数据结构并不是使用二叉树实现,而是采用隐式表达,即使用数组表示一个堆。能用数组表示这是因为堆总是一棵完全二叉树(没有节点漏洞):即若设二叉树的高度为h,除第 h

Move_now的博客 874

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SGISTL源码探究-stl_algo.h中的排序算法

前言在本小节中,我们将分析STL中算法组件的最后一部分:排序算法。排序算法分为内部排序和外部排序。而内部排序中常见的有八种排序算法:直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序、桶排序。在SGISTL实现的sort算法中,并不是简单的使用快速排序作为排序算法,而是交叉使用了插入排序、堆排序以及快速排序,并且做了一定的优化,并且只接受迭代器类型为RandomAccessI

Move_now的博客 938

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SGISTL源码探究-queue配接器

前言在本小节中,我们将分析queue,即队列,这种数据结构的元素符合先进先出(FIFO)的条件。它同stack一样,不算是一种容器,而是采用一种容器(SGISTL中默认是deque)作为底层结构并修改部分接口为自己所用的配接器。queue同stack一样,不支持元素的遍历操作,因此并不需要迭代器。它的所有接口都依靠底层的容器实现。queue源码定义部分#ifndef __STL_LIMITED_DE

Move_now的博客 770

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

栈与队列->算法实现

栈和队列提供 push 和 pop 等等接口,不提供迭代器(iterator)。不像是set 或者map 提供迭代器iterator来遍历所有元素。因此在 STL 中其实 stack 和 queue 是不被归类为容器的,而是归类为 container adapter(容器适配器)在 SGI STL 默认是使用 deque 来实现的 stack 和 queue,当然 vector 和 list 也可以实现。以下介绍的都是 SGI STL 里面的数据结构。栈是先进后出,队列是先进先出。

qq_57780419的博客 459

栈与队列:理论基础、用栈实现队列、用队列实现栈、有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值、滑动窗口最大值(难点)、前k个高频元素(难点)

首先了解栈和队列的理论基础,提到四个问题:1.C++中stack、queue是容器码?——>它们是容器适配器2.使用的stack、queue是属于哪个版本的STL?——>SGI STL是开源的3.使用的STL中的stack、queue是如何实现的?——>底层采用deque、list、链表等向外提供接口实现功能4.stack、queue提供迭代器来遍历空间吗?——>不提供面试题:栈里面的元素在内存中是连续分布的吗?

evildoerxmf的博客 169

Leetcode刷题笔记:栈与队列篇

Leetcode刷题笔记:栈与队列篇

qq_27673853的博客 502

代码随想录二刷 | 栈与队列 |总结篇

栈与队列总结篇

方可申不翘二郎腿的博客 1023

栈和队列-代码随想录-刷题笔记

栈和队列-代码随想录-刷题笔记

Coderwind的博客 383

STL之priority_queue源码剖析

STL之priority_queue源码剖析 heap 在探讨priority_queue之前,我们必须先分析heap。heap并不归属于STL容器,他是个幕后英雄,扮演priorityqueue的助手。顾名思义,priority queue允许用户以任何次序将任何元素推入容器,但取出时一定是从优先权最高的元素开始取。Binary max heap证据有这样的特性,适合作为priority_q...

系统 运维 333

SGISTL源码探究-STL中的红黑树(上)

前言本小节将进入到SGISTL的红黑树部分。关于红黑树,是一种比较复杂的数据结构,但是并不是特别难。如果对红黑树不太了解,可以去网上查阅相关的资料,因为本文的主要目的是分析STL中的红黑树的源码,和普通的红黑树略有不同,还要复杂一些,需要有一定的基础。基本概念首先什么是二叉搜索树,二叉搜索树即符合任何一个节点的值一定大于其左子树的任何一个节点的值并且小于其右子树的任何一个节点的值(节点的值不允许重复

Move_now的博客 1806

SGISTL源码探究-STL中的hashtable(上)

前言关于哈希表部分,哈希函数以及解决哈希冲突的方法都有很多种,在本文中不会详细去讨论哈希表的大量知识,而是以SGISTL实现的hashtable为主,所以如果对hashtable不太了解,建议先去网上查阅相关的资料。这里只给出基本的概念。了解哈希表原理基本概念哈希表(hashtable,也称散列表):根据key来访问元素的一种数据结构。它可能先经过哈希函数计算出key,然后通过key访问表中对应ke

Move_now的博客 1483

SGISTL源码探究-stl_algobase.h中的算法

前言在上一小节中,我们分析了stl_numeric.h中的算法部分。在本小节中,我们将分析stl_algobase.h文件中的算法,里面实现的都是一些比较基本的算法,比如equal、fill、max、swap等,可以从中学习到泛型的思想。stl_algobase.h中的算法iter_swap该函数的作用是交换迭代器指向的两个元素。注意迭代器的类型必须是ForwardIterator及其派生类。 并

Move_now的博客 1244

SGISTL源码探究-STL中的hashtable(下)

前言在上一小节中,我们介绍了hashtable的基本概念,以及分析了在STL中,hashtable的迭代器、采用的数据结构及它的构造/析构函数,还有部分成员函数。 在本小节中,我们讲继续分析剩下的一些操作,如插入、删除、复制等。插入操作关于插入操作,有大量的重载版本,我们只分析比较关键的函数,其他的可以随便看看。/* insert_unique,插入元素(不允许重复) * 首先先判断加上新增元素

Move_now的博客 1184

SGISTL源码探究-关联式容器:hash_multimap

前言本小节将介绍hash_multimap的源码实现,它与hash_map的不同与map和multimap的不同类似,所以我们可以一边分析它们的不同之处,一边顺便复习hash_map。hash_multimap的实现定义及数据结构#ifndef __STL_LIMITED_DEFAULT_TEMPLATES template <class Key, class T, class HashFcn =

Move_now的博客 1117
上一篇: SGISTL源码探究-大根堆heap
下一篇: SGISTL源码探究-STL中的红黑树(上)
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值