c++中STL之heap, priority_queue使用_longhopefor的博客

文章推薦指數: 80 %
投票人數:10人

C++中堆的应用:make_heap, pop_heap, push_heap, sort_heap, ... heap并不属于STL容器组件,它分为max heap 和min heap,在缺省情况下,max-heap是 ... c++中STL之heap,priority_queue使用 longhopefor 于 2014-07-3020:36:39 发布 12802 收藏 7 分类专栏: C++编程 版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/longhopefor/article/details/38303545 版权 C++编程 专栏收录该内容 8篇文章 0订阅 订阅专栏 一、heap heap并不属于STL容器组件,它分为maxheap和minheap,在缺省情况下,max-heap是优先队列(priorityqueue)的底层实现机制。

而这个实现机制中的max-heap实际上是以一个vector表现的完全二叉树(completebinarytree)。

STL在中实现了对存储在vector/deque中的元素进行堆操作的函数,包括make_heap,pop_heap,push_heap,sort_heap,对不愿自己写数据结构堆的C++选手来说,这几个算法函数很有用,详细解释可以参见: http://www.cplusplus.com/reference/algorithm/make_heap/ 下面的_First与_Last为可以随机访问的迭代器(指针),_Comp为比较函数(仿函数),其规则——如果函数的第一个参数小于第二个参数应返回true,否则返回false。

1.make_heap(): make_heap(_First,_Last) make_heap(_First,_Last,_Comp) 默认是建立最大堆的。

对int类型,可以在第三个参数传入greater()得到最小堆。

2.push_heap(_First,_Last): 新添加一个元素在末尾,然后重新调整堆序。

也就是把元素添加在底层vector的end()处。

该算法必须是在一个已经满足堆序的条件下,添加元素。

该函数接受两个随机迭代器,分别表示first,end,区间范围。

关键是我们执行一个siftup()函数,上溯函数来重新调整堆序。

具体的函数机理很简单,可以参考我的编程珠玑里面堆的实现的文章。

3.pop_heap(_First,_Last): 这个算法跟push_heap类似,参数一样。

不同的是我们把堆顶元素取出来,放到了数组或者是vector的末尾,用原来末尾元素去替代,然后end迭代器减1,执行siftdown()下溯函数来重新调整堆序。

注意算法执行完毕后,最大的元素并没有被取走,而是放于底层容器的末尾。

如果要取走,则可以使用底部容器(vector)提供的pop_back()函数。

4.sort_heap(_First,_Last): 既然每次pop_heap可以获得堆中最大的元素,那么我们持续对整个heap做pop_heap操作,每次将操作的范围向前缩减一个元素。

当整个程序执行完毕后,我们得到一个非降的序列。

注意这个排序执行的前提是,在一个堆上执行。

下面是这几个函数操作vector中元素的例子。

#include #include #include usingnamespacestd; intmain() { inta[]={15,1,12,30,20}; vectorivec(a,a+5); for(vector::iteratoriter=ivec.begin();iter!=ivec.end();++iter) cout<::iteratoriter=ivec.begin();iter!=ivec.end();++iter) cout<::iteratoriter=ivec.begin();iter!=ivec.end();++iter) cout<::iteratoriter=ivec.begin();iter!=ivec.end();++iter) cout<::iteratoriter=ivec.begin();iter!=ivec.end();++iter) cout< qi; 通过, greater >qi2; 其中第二个参数为容器类型。

第三个参数为比较函数。

第三种方法:自对自定义的数据类型自定义优先级, 1.通过自定义operator(constNode&a,constNode&b)     {         returna.key>b.key;     } }; 在该结构中,value为值,priority为优先级,使用示例: priority_queue,less>pqLess; priority_queue,greater>pqGreater; 2.自定义一个比较“类”,重载括号,operator(),这这种方式可以由less“继承”。

structNode {     intkey;     intvalue; }; structcmpLess {      booloperator()(constNode&a,constNode&b)      {        returna.keyb.key;      } }; 使用示例: priority_queue,cmpLess>pqLess; priority_queue,cmpGreater>pqGreater; 一个简单的例子如下: #include #include #include #include usingnamespacestd; intmain() { constintlen=5; inti; inta[len]={3,5,9,6,2}; priority_queueqi; for(i=0;i,less>pq2; //priority_queue,cmpLess>pq2; vectorb(len); b[0].key=6;b[0].value=1; b[1].key=9;b[1].value=5; b[2].key=2;b[2].value=3; b[3].key=8;b[3].value=2; b[4].key=1;b[4].value=4; for(i=0;i #include usingnamespaceboost::heap; intmain(){ priority_queuepq; pq... 【C++系列】STL中的priority_queue的用法详解及模拟实现 Li-eng的博客 11-29 456 STL——priority_queue的详解及模拟实现 1.priority_queue的介绍和使用 文档介绍(cplusplus官方) stl源码中,包含三个模板参数:类型、容器适配器、比较规则。

template, classCompare=less<:value_type>> classpriority_queue; 其底层容器需 参与评论 您还未登录,请先 登录 后发表或查看评论 C++STL容器优先队列(priority_queue)用法详解(图文详解)(全网最详细简单易懂) 四季不败的博客 08-07 8084 C++STL容器优先队列(priority_queue)用法详解 常见用途 1,可以解决一些贪心问题; 2,也可以对dijksta算法进行优化; 既然是队列那么先要包含头文件#include, 其底层是用堆来进行实现的 在优先队列中,优先队列本身默认的规则就是优先级高的放在队首 先举个例子(假设数字小的优先级高): 原先队列中有 ... c++优先队列(priority_queue) STATICHIT静砸的博客 02-13 9837 C++中的优先队列是STL中的派生容器,它仅考虑最高优先级元素。

队列遵循FIFO策略,而优先队列根据优先级弹出元素,即,优先级最高的元素首先弹出。

它在某些方面类似于普通队列,但在以下方面有所不同: 在优先队列中,队列中的每个元素都与某个优先级相关联,但是优先级在队列数据结构中不存在。

优先队列中具有最高优先级的元素将被首先删除,而队列遵循FIFO(先进先出)策略,这意味着先插入的元素将被首先删除。

如果存在多个具有相同优先级的元素,则将考虑该元素在队列中的顺序。

注意:优 堆(heap)与优先队列(priorityqueue) 最新发布 weixin_52575498的博客 03-25 1571 一、堆 1.堆定义: 如果这棵完全二叉树的任意结点的关键字小于或等于其左孩子和右孩子的关键字,则称之为小堆 C++基础数据结构|优先对列、堆(PriorityQueue、Heap) 小麦China的博客 04-20 39 C++基础数据结构|优先对列、堆(PriorityQueue、Heap) 优先级队列priority_queue 这是一个拥有权值queue,其内部元素按照元素的权值排列。

权值较高者排在最前优先出队。

其中缺省情况下系统是通过一个max-heap以堆实现完成排序特性,表现为一个以vector表现的完全二叉树。

//升序队列小顶堆great小到大 priority_queue,greater>pq; . 堆Heap和优先队列(PriorityQueue)学习小结 热门推荐 roufoo的博客 06-10 1万+ Heap是一种数据结构,能保证取max/min是O(1)时间。

Max-heap/Min-heap保证父节点都比子节点大/小,但兄弟节点之间没有大小关系。

Heap通常用数组实现。

一个节点i的左子节点编号是2*i,右子节点是2*i+1。

Heap通常是完全二叉树(因为效率高),但没有要求一定是完全二叉树。

PriorityQueue也是一种数据结构。

其中每个元素都有一个关键字key,元素之间的比... heap、priority_queue qq_46514141的博客 03-18 62 heap 一.heap概述 heap并不是STL容器组件,那为什么要有它呢,因为随后的priorityqueue是以heap为底层结构,priorityqueue就是一个优先队列,即无论按什么样的顺序把任何元素推入优先队列中,取出来的时候一定是先取优先级最大的元素。

为了实现这一目标,heap要做的就是把存在其中的元素排好序,如果用list的话排序太慢,如果用binarysearchtree的话实现太复杂,所以我们这里用completebinarytree,即用二叉完全树作为heap的数据结构,那 STL:priority_queue和heap笔记 编程爱好者的博客 03-19 296 heap数据结构,图和原理网上很多。

我的一个堆排序,这是堆思想的一个应用。

voidadjustHeap(inta[],inti,intsize) { //intmax; intl=2*i+1; intr=2*i+2; intmax=i; //vs2017会检测&&右边的,故不能将l)中使用vector作为其底层的 C++STL优先队列priority_queue使用 weixin_34179762的博客 08-07 102 头文件:#include 一.申明方式 std::priority_queueq; std::priority_queue,cmp>q;1.普通方法:priority_queueq;//大的优先级高priority_queue



請為這篇文章評分?