STL源码剖析之heap,priority_queue【2013.11.25】
2013-11-25 17:16
176 查看
STL源码剖析之heap,priority_queue【2013.11.25】
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/a0f609b288c7de88131b6f6ba37c81b3.png)
priority_queue是一种特殊的queue,queue的出队顺序是根据入队顺序确定的,priority_queue则有一种权重概念,他的出队顺序由这个权重大小决定。
heap不是容器,但是却是实现priority_queue的关键,由他实现权重排列。实现权重出队。
heap
heap在数据结构中,是一种堆的概念(二叉堆,这里分为大堆[max_heap]和小堆[min_heap],即最大值,最小值位于堆的跟节点,下图A)。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/e2a0e378c88ec2b538af739ec2fd7bf5)
对于堆的概念
所谓的大堆就是 父节点比子节点大,同样小堆就是父节点小于子节点。这样保持根节点永远是最大或最小的。
由于堆的特殊性质,完全二叉树,所以堆的数据可以用一个连续空间表示,其父子节点之间的关系可以是 A为第0个,其子节点A,B就是第 1 ,2个,即 2i和2i+1;
对于堆,在priority_queue中,最重要的就是heap的取出算法,即每次取最大或最小(pop);当然还有构造一个heap(push);
【1】构造heap就是一个一个节点push进heap;
第一个即为根节点,之后的push,则是和父节点比较,如果大就互换父子节点,再向上取父节点,循环。看图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/be28133eabbc11d22f9a8df37c6852f4)
代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/f917ed635c34212fa164e2c320208e27)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/d08d6ea3078609e1f5ed443a53d0dea3)
【2】取出堆POP,就是直接取跟节点,然后对应的互换子节点。保证堆的规范。
先取跟节点,然后判断两个子节点,大的子节点变成父节点;
然后并继续向下,左右子节点判断,取大的,并和堆的最后一个节点比较,如果最后一个大就把最后一个直接放到此节点,否则就是取大的子节点变父节点,继续向下重复操作
如图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/c89de5e360c0e5f0f64ecc9b7ea67b69)
代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/d6067f1affb00c4f25a5e608364eaeb4)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/7192df265b3d10ca63457f1bd225783d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/df2840ae19904c086a164e949edb564d)
【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之上再做封装,就可以实现了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/50fef588266280f212805eccaf92d659)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/48eb6e5ccaf41c18c90d80689b53b893)
根据代码可以看出,底层还是默认Vector,可以指定底层的实现容器。
和queue不同的是 push和pop方法,是用到了,建立heap和出heap的方法,实现构造一个大小堆,出堆(取最大小元素),
值得注意的是,定义的时候多了一个Compare ,这个是在push和pop 堆的时候的比较规则,当是特殊元素的时候,就需要指定对应的compare 仿函数!
【1】没有迭代器
附录priority_queue使用范例:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201311/25/81e979669d37bbd49660f470915d326d)
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/a0f609b288c7de88131b6f6ba37c81b3.png)
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/a0f609b288c7de88131b6f6ba37c81b3.png)
priority_queue是一种特殊的queue,queue的出队顺序是根据入队顺序确定的,priority_queue则有一种权重概念,他的出队顺序由这个权重大小决定。
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
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/a0f609b288c7de88131b6f6ba37c81b3.png)
相关文章推荐
- STL源码剖析之stack,queue容器【2013.11.25】
- STL 源码剖析读书笔记五:序列式容器之 heap、priority_queue、slist
- 【优先队列】【堆】STL之priority_queue、make_heap()、push_heap()、pop_heap()、容器适配器
- c++中STL之heap, priority_queue使用
- STL之heap及priority_queue实现以及源码中的两个小问题
- 从一道整数合并问题学习 STL 之make_heap &&priority_queue&&multiset
- Chapter 4: 序列式容器之 heap and priority queue
- sgi 之heap, priority_queue
- STL源码剖析之Deque容器【2013.11.25】
- stl源码剖析 详细学习笔记priority_queue slist
- STL源码剖析-序列式容器之heap和priority_queue
- stl源码剖析 详细学习笔记priority_queue slist
- 三 序列式容器(五)priority_queue(heap)(container adapter)
- STL 之 queue、priority_queue 源代码剖析
- CLRS: heap sort and priority queue
- Heap && Priority_Queue
- PriorityQueue and Heap
- 【STL源码剖析读书笔记】【第4章】序列式容器之heap和priority_queue
- heapsort in PriorityQueue
- Heap & Priority Queue