STL源码剖析(四):容器(4)priority_queue

Heap

priority_queue的底层结构为max heap(也可以是min heap,本文统一只叙述max heap),heap并不属于STL的容器组件.

heap是一颗完全二叉树:整颗树除了最底层,都是填满的,而且底层节点从左到右不存在空隙。

因此,heap通常用vector的方式存储:

heap的某个节点位于位置 i 时,其左右子节点分别位于2i 和 2i+1

Heap相关操作

push_heap

首先,因为要满足完全二叉树的性质,需要将新节点放置在底层节点的最后面,也就是vector的end(),然后执行上溯操作:只要父节点比自己小,就不断调换自己和父节点的位置。

pop_heap

将heap的最大元素取走,也就是将根节点取走,那根据完全二叉树的性质,得把底层最后面的元素换到根节点。然后不断执行下溯操作:将自己和两个子节点中,较大的那个对调。

做完下溯操作后,可能还需做一次上溯操作

 sort_heap:不断对heap进行pop操作,就可以得到一个有序序列。

priority_queue

priority_queue底层默认以vector做为容器,其自身归类为适配器。priority_queue在两端操作数据,没有提供迭代器,因此也不提供遍历功能。

其make_heap,push和pop参数有迭代器参数类型,是针对vector的迭代器哦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值