STL源码剖析 priority_queue

  • priority_queue是一个拥有权重概念的queue,允许底部加入新的元素,头部删除旧的元素,以及审视元素数值的操作
  • priority_queue带有权重的概念,即元素按照权重进行排列,而不是按照插入队列的顺序进行排序。要求权值高者在前
  • 缺省情况下,priority_queue使用max_heap完成,而max_heap物理层面是基于vector逻辑层面表现像complate binary tree;max_tree用于实现priority_queue的按照权值高低自动递增排序的特性

priority_queue定义完整列表

  • priority_queue底层使用vector,在加上堆的处理规则
  • priority_queue不被归纳为容器 而是容器适配器
#include <iostream>
#include <vector>#ifdef __STL_USE_EXCEPTIONS
#define __STL_TRY   try
#define __STL_UNWIND(action)   catch(...) { action; throw; }
#else
#define __STL_TRY
#define __STL_UNWIND(action)
#endiftemplate <class T,class Sequence = std::vector<T>,class Compare = std::less<typename Sequence::value_type>>
class priority_queue{
public:typedef typename Sequence::valuetype 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){}//以下使用的make_heap()、push_heap()、pop_heap()都是泛型算法//注意 任意一个构造函数都立刻在底层容器内产生一个implicit representation heap//指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last,const Compare& x):c(first,last),comp(x){std::make_heap(c.begin(),c.end(),comp);}//没有指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last):c(first,last){std::make_heap(c.begin(),c.end(),comp);}bool empty()const{return c.empty();}size_type size() const{return c.size();}const_reference top()const{return c.front();}void push(const value_type& x){__STL_TRY{//push_heap 是泛型算法,先利用底层的push_back()将新的元素推入末端,再重新排列heapc.push_back(x);//push_heap 是泛型算法std::push_heap(c.begin(),c.end(),comp);}__STL_UNWIND(c.clear());}void pop(){__STL_TRY{//pop_heap是泛型算法,从heap中取出一个元素,并不是整整将这个元素弹出,而是重排heap//需要使用底层vector的pop_back()取得被弹出的元素std::pop_heap(c.begin(),c.end(),comp);c.pop_back();}__STL_UNWIND(c.clear());}};

priority_queue没有迭代器

  • priority_queue的所有元素进出是有规则限制的,只有queue的顶端元素(权值最高者)才可以被外界使用
  • priority_queue不提供遍历的功能,因此无迭代器

测试用例

#include <iostream>
#include <vector>#ifdef __STL_USE_EXCEPTIONS
#define __STL_TRY   try
#define __STL_UNWIND(action)   catch(...) { action; throw; }
#else
#define __STL_TRY
#define __STL_UNWIND(action)
#endiftemplate <class T,class Sequence = std::vector<T>,class Compare = std::less<typename Sequence::value_type>>
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){}//以下使用的make_heap()、push_heap()、pop_heap()都是泛型算法//注意 任意一个构造函数都立刻在底层容器内产生一个implicit representation heap//指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last,const Compare& x):c(first,last),comp(x){std::make_heap(c.begin(),c.end(),comp);}//没有指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last):c(first,last){std::make_heap(c.begin(),c.end(),comp);}bool empty()const{return c.empty();}size_type size() const{return c.size();}const_reference top()const{return c.front();}void push(const value_type& x){__STL_TRY{//push_heap 是泛型算法,先利用底层的push_back()将新的元素推入末端,再重新排列heapc.push_back(x);//push_heap 是泛型算法std::push_heap(c.begin(),c.end(),comp);}__STL_UNWIND(c.clear());}void pop(){__STL_TRY{//pop_heap是泛型算法,从heap中取出一个元素,并不是整整将这个元素弹出,而是重排heap//需要使用底层vector的pop_back()取得被弹出的元素std::pop_heap(c.begin(),c.end(),comp);c.pop_back();}__STL_UNWIND(c.clear());}
};int main(){int ia[9] = {0,1,2,3,4,8,9,3,5};priority_queue<int>iqp(ia,ia+9);std::cout << iqp.size() << std::endl; //9for (int i = 0; i < iqp.size(); ++i) {std::cout << iqp.top() << ' '; //9 9 9 9 9 9 9 9 9}std::cout << std::endl;while(!iqp.empty()){std::cout << iqp.top() << ' '; //9 8 5 4 3 3 2 1 0iqp.pop();}std::cout << std::endl;
}

参考链接

  • __STL_TRY和__STL_UNWIND这两个宏的意思 - Superpig0501 - 博客园

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

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

相关文章

python数字1 3怎么表示_Python入门篇之数字

数字类型 数字提供了标量贮存和直接访问。它是不可更改类型&#xff0c;也就是说变更数字的值会生成新的对象。当然&#xff0c;这个过程无论对程序员还是对用户都是透明的&#xff0c;并不会影响软件的开发方式。 Python 支持多种数字类型&#xff1a;整型、长整型、布尔型、双…

java 打印100以内的质数

题目 质数&#xff1a;只能被1和它本身所整除的数。即&#xff1a;从2开始一直到这个数-1&#xff0c;都不能被这个数整除&#xff1b;最小的质数是2 知识点 1.System.currentTimeMillis():计算当前时间距离1970-1-1的毫秒数&#xff0c;返回long 2.Math.sqrt&#xff1a;开…

STL源码剖析 slist单向链表概述

概述 SGI STL的list是一个双向链表&#xff0c;单向链表是slist&#xff0c;其不在标准规格之内单向和双向链表的区别在于&#xff0c;单向链表的迭代器是单向的 Forward Iterator&#xff0c;双向链表的迭代器属于双向的Bidirectional Iterator。因此很多功能都被受限但是单向…

output怎么用_用树莓派实现室内温度监控

树莓派加上温度传感器实现室内温度监控。可用于家庭&#xff0c;轿车&#xff0c;工业&#xff0c;农业 等许多方面。可做温度预警&#xff0c;自动降温等操作。各位小伙伴可自行脑补发挥。1.硬件准备a.树莓派&#xff08;Raspberry Pi&#xff09;一个b.DS18B20温度传感器一个…

java 家庭收支账户

代码1 package lesson.project.p1_familyAccount;import java.util.Scanner;public class FamilyAccount {public static int money 10000;public static String all "";public static void main(String[] args) {Scanner scanner new Scanner(System.in);while …

【Android 13】使用Android Studio调试系统应用之Settings移植(四):40+个依赖子模块之ActionBarShadow

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、子模块AS移植3.1 AS创建目标3.2 创建ActionBarShadow(1)使用VS Code打开org_settings/SettingsLib目录(2)ActionBarShadow的Manifest.xml(3)ActionBarShadow的An…

STL源码剖析 关联式容器

STL关联式容器以set(集合) 和 map(映射表)两大类&#xff0c;以及对应的衍生体构成,比如mulyiset(多键集合) multimap(多键映射表) ,容器的底层均基于红黑树RB-Tree也是一个独立的容器&#xff0c;但是不对外开放此外还提供了标准之外的关联式容器 hash table散列表&#xff0c…

python求小于n的所有素数_用python求出2000000内所有素数的和?不知怎么写?

展开全部 import itertools import time N 2000000 L range(N) def findnxt(s): flag 0 for n in itertools.ifilter(None, L[s1:]): return n t0 time.time() n 2 X int(N ** .5) while n < X: for i, x in enumerate(L[::n][1:]): if i0: continue L[x] 0 n findn…

STL源码剖析 关联式容器 红黑树

概念 红黑树不仅仅是一个二叉树&#xff0c;必须满足如下条件1&#xff0c;每个节点不是红色就是黑色 (深色底纹为黑色&#xff0c;浅色底纹为红色)2&#xff0c;根节点是黑色的3&#xff0c;如果节点为红&#xff0c;其子节点必须为黑色的4&#xff0c;任一节点至NULL(树的尾…

java蓝桥杯 试题-基础练习-数列排序

试题-基础练习-数列排序 题目 问题描述   给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式   第一行为一个整数n。   第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。 输出格式   输出…

python生成的词云没有图案_还在为专栏封面发愁?我用Python写了个词云生成器!...

妈妈再也不用担心我写专栏找不到合适的封面了&#xff01;B站专栏的封面至少是我一直头疼的问题&#xff0c;每次写完文章却找不到合适的图片作为封面。 词云是一个很不错的选择&#xff0c;既美观&#xff0c;又提纲挈领。网上也有词云生成的工具&#xff0c;但大多收费/只能试…

java 1000以内的完数

题目 代码 package lesson.l6_review;public class PrefectNumber {public static void main(String[] args) {for (int i 1; i <1000 ; i) {int num0;for (int j 1; j <i-1 ; j) {if (i%j0){numj;}}if (inum){System.out.print(i"\t");}}} }

STL源码剖析 set集合

set的特性是 所有的元素会按照键值自动排序set 的键值等同于实值set不允许涵盖两个相同的键值不可以通过迭代器修改set的元素数值&#xff0c;这会破坏元素的排列顺序。因此set<T>::iterator 被定义为底层RB-tree的const_iterator,杜绝写入。也就是set的iterators是一种c…

python turtle画圣诞树动图_圣诞节!教你用Python画棵圣诞树

作者 | 糖甜甜甜&#xff0c;985高校经管研二&#xff0c;擅长用 Python、R、tableau 等工具结合统计学和机器学习模型做数据分析。 如何用Python画一个圣诞树呢&#xff1f; 最简单&#xff1a; 1height 5 2 3stars 1 4for i inrange(height): 5print(( * (height - i)) (** …

java蓝桥杯 试题-基础练习-十六进制转八进制

试题-基础练习-十六进制转八进制 题目 试题 基础练习 十六进制转八进制 资源限制 时间限制&#xff1a;1.0s 内存限制&#xff1a;512.0MB 问题描述   给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n &#xff08;1…

STL源码剖析 map

所有元素会根据元素的键值自动被排序 元素的类型是pair&#xff0c;同时拥有键值和实值&#xff1b;map不允许两个元素出现相同的键值pair 代码 template <class T1,class T2> struct pair{typedef T1 first_type;typedef T2 second_type;T1 first; //publicT2 secon…

java api接口怎么写_Java 如何设计 API 接口,实现统一格式返回?

来源&#xff1a;老顾聊技术前言接口交互返回格式控制层Controller美观美化优雅优化实现方案前言在移动互联网&#xff0c;分布式、微服务盛行的今天&#xff0c;现在项目绝大部分都采用的微服务框架&#xff0c;前后端分离方式&#xff0c;(题外话&#xff1a;前后端的工作职责…

java 输出学生成绩和成绩等级

题目 从键盘读入学生成绩&#xff0c;找出最高分&#xff0c;并输出学生成绩等级。成绩>最高分-10 等级为’A’成绩>最高分-20 等级为’B’成绩>最高分-30 等级为’C’其余 等级为’D’提示&#xff1a;先读入学生人数&#xff0c;根据人数创建int数组&#…

STL源码剖析 multiset 和 multimap

multiset和set完全相同&#xff0c;唯一的差别在于允许键值的重复&#xff0c;因此底层操作使用的是红黑树的insert_equal() 而不是insert_unique()multimap和map完全相同&#xff0c;唯一的差别在于允许键值的重复&#xff0c;因此底层操作使用的是红黑树的insert_equal() 而不…

java 二维数组

声明和初始化 静态初始化 // 静态初始化&#xff1a; // 一维数组int[] arr1_1 {1, 2, 4};System.out.println(Arrays.toString(arr1_1)); // 二维数组int[][] arr1_2 {{1, 2}, {4, 5}, {9, 10}};for (int[] i :arr1_2) {System.out.print(Arrays.toS…