STL源码剖析之heap,priority_queue【2013.11.25】
来源:互联网 发布:淘宝手机开店认证步骤 编辑:程序博客网 时间:2024/06/06 19:39
STL源码剖析之heap,priority_queue【2013.11.25】
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
heap不是容器,但是却是实现priority_queue的关键,由他实现权重排列。实现权重出队。
heap
heap在数据结构中,是一种堆的概念(二叉堆,这里分为大堆[max_heap]和小堆[min_heap],即最大值,最小值位于堆的跟节点,下图A)。
对于堆的概念
所谓的大堆就是 父节点比子节点大,同样小堆就是父节点小于子节点。这样保持根节点永远是最大或最小的。
由于堆的特殊性质,完全二叉树,所以堆的数据可以用一个连续空间表示,其父子节点之间的关系可以是 A为第0个,其子节点A,B就是第 1 ,2个,即 2i和2i+1;
对于堆,在priority_queue中,最重要的就是heap的取出算法,即每次取最大或最小(pop);当然还有构造一个heap(push);
【1】构造heap就是一个一个节点push进heap;
第一个即为根节点,之后的push,则是和父节点比较,如果大就互换父子节点,再向上取父节点,循环。看图:
代码如下:
【2】取出堆POP,就是直接取跟节点,然后对应的互换子节点。保证堆的规范。
先取跟节点,然后判断两个子节点,大的子节点变成父节点;
然后并继续向下,左右子节点判断,取大的,并和堆的最后一个节点比较,如果最后一个大就把最后一个直接放到此节点,否则就是取大的子节点变父节点,继续向下重复操作
如图:
代码如下:
【1】heap在STL中是用vector做容器实现的。根据heap的父节点和子节点的关系(i , 2i , 2i+1 )
【2】heap的pop操作中,取出跟节点,完成pop后,并没有删除,而是放到了vector的最后元素,由pop步骤图可以看出;
【3】heap没有迭代器,虽然vector有迭代器,但是作为底层容器封装成heap后,heap没有提供迭代器
priority_queue
priority_queue也不是一种严格意义的容器,也是一种容器配接器
根据heap的特性,每次都取出最大货最小值,那么priority_queue就的出队序列就可以根据heap的根节点确定了,而不是入队顺序。
所以只要在heap之上再做封装,就可以实现了。
根据代码可以看出,底层还是默认Vector,可以指定底层的实现容器。
和queue不同的是 push和pop方法,是用到了,建立heap和出heap的方法,实现构造一个大小堆,出堆(取最大小元素),
值得注意的是,定义的时候多了一个Compare ,这个是在push和pop 堆的时候的比较规则,当是特殊元素的时候,就需要指定对应的compare 仿函数!
【1】没有迭代器
附录priority_queue使用范例:
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
- STL源码剖析之heap,priority_queue【2013.11.25】
- STL之priority_queue源码剖析
- 【STL源码剖析读书笔记】【第4章】序列式容器之heap和priority_queue
- STL 源码剖析读书笔记五:序列式容器之 heap、priority_queue、slist
- STL源码剖析-序列式容器之heap和priority_queue
- STL 之 queue、priority_queue 源码剖析
- STL源码剖析---heap
- STL源码剖析heap
- STL源码剖析——容器配接器之priority_queue
- 【STL源码剖析读书笔记】自己实现priority_queue之MyPriorityQueue
- 基本于STL heap 之 priority_queue
- c++中STL之heap, priority_queue使用
- c++中STL之heap, priority_queue使用
- STL源码剖析 [容器](八)[priority_queue]
- STL源码剖析——priority_queue
- STL之heap及priority_queue实现以及源码中的两个小问题
- C++ STL源码学习(priority_queue内部heap篇)
- stl源码剖析 详细学习笔记heap
- Linux(CentOS 5.8)下部署Django-1.5.5遇到的一些问题
- rem与px的转换
- 关于Response.redirect和Response.End出现线程中止异常的处理
- 一些好的网页设计工具
- C#关于AutoResetEvent的使用介绍[转载]
- STL源码剖析之heap,priority_queue【2013.11.25】
- 解决MySql8小时自动断开连接问题。
- uva 231 Testing the CATCHER
- 18个非常好用的vim指令
- LayoutInflater作用及使用
- HTTP Status 415 - Unsupported Media Type
- Atlassian Bamboo 5:串起DevOps的节点
- USACO1.2.1 Milking Cows 给奶牛挤奶
- Android(Java):多线程断点续传下载