heap只能算是算法,而priority_queue只是封装了vector,所以又称为配接器。

由于在下面的实现中需要获得iterator所指向的类型,所以又用到了stl中的类型萃取技术

cconstruct.h

#ifndef C_CONSTRUCT_H
#define C_CONSTRUCT_H
#include <iostream>
#include <new.h>inline void destroy(char *, char *){}
inline void destroy(int *, int *){}
inline void destroy(long *, long *){}
inline void destroy(float *, float *){}
inline void destroy(double *, double *){}//对于int* p,也可以调用这个函数,比较怪异
template <class T>
inline void destroy(T* pointer) {pointer->~T();
}template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last) {for (; first  < last ; ++first)destroy(first);
}template <class T1, class T2>
inline void construct(T1* p, const T2& value) {new (p) T1(value);
}template <class _Iter>
inline typename std::iterator_traits<_Iter>::value_type*
__value_type(const _Iter&)
{return static_cast<typename std::iterator_traits<_Iter>::value_type*>(0);
}#endif

cheap.h

#ifndef C_HEAP_H
#define C_HEAP_H
#include "cconstruct.h"
#include <iostream>//上溯。假设要上溯的值放在堆尾
template <class RandomAccessIterator, class Compare>
void cpush_heap(RandomAccessIterator first, RandomAccessIterator last, Compare cmp ) {__cpush_heap(first, last, __value_type(first), cmp);
}template <class RandomAccessIterator, class T, class Compare>
void __cpush_heap(RandomAccessIterator first, RandomAccessIterator last, T*, Compare cmp) {size_t holeIndex = last - first - 1;size_t parent = (holeIndex - 1)/2;T value = *(last - 1);while (holeIndex > 0 && cmp(*(first + parent), value)) {*(first + holeIndex) = *(first + parent);holeIndex = parent;parent = (holeIndex - 1)/2;}*(first + holeIndex) = value;
}//上溯操作只适用于在尾部添加元素,维持堆特性的操作template <class RandomAccessIterator, class Compare>
void cpop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare cmp) {__cpop_heap(first, last, __value_type(first), cmp);
}template <class RandomAccessIterator, class T, class Compare>
void __cpop_heap(RandomAccessIterator first, RandomAccessIterator last, T*, Compare cmp) {T value = *(last - 1);*(last - 1) = *first;__cadjust_heap(first, 0, last - first - 1, value, cmp);//注意,此时的长度就不应该算上堆尾
}//向下走。value本来放在holeIndex
template <class RandomAccessIterator, class T, class Compare>
void __cadjust_heap(RandomAccessIterator first, size_t holeIndex, size_t len, T value, Compare cmp) {size_t firstChild = 2* holeIndex + 1;for ( ; firstChild < len; firstChild = 2* firstChild + 1) {if (firstChild + 1 < len && cmp(*(first + firstChild ), *(first + firstChild + 1)))++firstChild;if (!cmp(value, *(first + firstChild) ))//value >= childbreak;*(first + holeIndex) = *(first + firstChild);holeIndex = firstChild;}*(first + holeIndex) = value;
}//输入必须是已经成堆的
template <class RandomAccessIterator, class Compare>
void csort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare cmp) {while (last - first > 1) cpop_heap(first, last--, cmp);
}template <class RandomAccessIterator, class Compare>
void cmake_heap(RandomAccessIterator first, RandomAccessIterator last, Compare cmp) {__cmake_heap(first, last, __value_type(first), cmp);
}template <class RandomAccessIterator, class T,class Compare>
void __cmake_heap(RandomAccessIterator first, RandomAccessIterator last, T*, Compare cmp) {if (last - first < 2) return;size_t len = last - first;size_t holeIndex = (len - 2)/2;//从底向上,第一棵子树的头while (true) {__cadjust_heap(first, holeIndex, len, *(first + holeIndex), cmp);if (holeIndex == 0) return;--holeIndex;}}#endif

cqueue.h

#ifndef C_QUEUE_H
#define C_QUEUE_H
#include "cvector.h"
#include "cheap.h"
#include <iostream>template <class T, class Seq = cvector<T>, class Compare = less<typename Seq::value_type> >
class cpriority_queue {
public:typedef typename Seq::value_type value_type;typedef typename Seq::reference reference;typedef typename Seq::const_reference const_reference;
protected:Seq c;//底层容器Compare comp;public:cpriority_queue() : c() {}template <class InputIterator>cpriority_queue(InputIterator first, InputIterator last, const Compare& x): c(first, last), comp(x) { cmake_heap(c.begin(), c.end(), comp); }template <class InputIterator>cpriority_queue(InputIterator first, InputIterator last): c(first, last){ cmake_heap(c.begin(), c.end(), comp); }/*void show() {Seq::iterator first = c.begin();for (;first != c.end(); ++first)std::cout<<*first<<" ";std::cout<<endl;}*/bool empty() const { return c.empty(); }size_t size() const { return c.size(); }const_reference top() const { return c.front(); }void push(const value_type& x) {c.push_back(x);cpush_heap(c.begin(), c.end(), comp);}void pop() {cpop_heap(c.begin(), c.end(), comp);c.pop_back();}};#endif

sgi 之heap, priority_queue相关推荐

  1. SGI STL 学习笔记二 vector

    sequence containers Array Vector Heap Priority_queue List sList(not in standard) Deque Stack Queue S ...

  2. STL容器的底层数据结构

    本文部分内容转自此博客 目录 vector list deque stack queue heap priority_queue set map multiset/multimap 哈希表hashta ...

  3. STL-源码剖析 简单总结

    STL-源码剖析 STL 六大组件 功能与运用 1. 容器 2. 算法 3. 迭代器 4. 仿函数 5. 配接器(adapters) 6. 配置器(allocators) 空间配置器(allocato ...

  4. uoj#268. 【清华集训2016】数据交互(动态dp+堆)

    传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 ...

  5. bzoj 1095: [ZJOI2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  6. BZOJ1095 [ZJOI2007]Hide 捉迷藏 【动态点分治 + 堆】

    题目链接 BZOJ1095 题解 传说中的动态点分治,一直不敢碰 今日一会,感觉其实并不艰涩难懂 考虑没有修改,如果不用树形dp的话,就得点分治 对于每个重心,我们会考虑其分治的子树内所有点到它的距离 ...

  7. 【清华集训2016】数据交互

    [清华集训2016]数据交互 比较神的\(DDP\). 首先对于给出的一条链我们分两部分统计:\(lca\)以及其他部分. 我们设两个变量\(w_i,g_i\).一条路径的权值就是路径上所有点的\(w ...

  8. BZOJ3832 [Poi2014]Rally 【拓扑序 + 堆】

    题目链接 BZOJ3832 题解 神思路orz,根本不会做 设\(f[i]\)为到\(i\)的最长路,\(g[i]\)为\(i\)出发的最长路,二者可以拓扑序后\(dp\)求得 那么一条边\((u,v ...

  9. codeforces 739E - Gosha is hunting

    这道题有三种做法,感受一下: 感觉到了歪果仁费尽脑汁想出来的神仙贪心脑洞题被中国人套路算法踩爆的凄凉...(我的名字是不是暴露了我的真实实力) ============================ ...

最新文章

  1. git rebase 和 git merger
  2. 必须为非自相关端口上的非激活接收指定至少一个已初始化的相关集
  3. php嵌套查询mysql语句_mysql 查询嵌套
  4. opencv论坛_Opencv批量添加logo的解决方案
  5. 14岁的男孩说想学生信,应该给予哪些指导?
  6. 在适当的场合使用FlagsAttribute修饰枚举
  7. Framework学习(一)深入Android 系统架构
  8. 嵌入式linux系统运行程序,嵌入式Linux系统启动过程
  9. 小乌龟git的安装、配置(TortoiseGit安装、配置)
  10. Jersey入门教程
  11. Android大举进入智能电视领域
  12. 亭子早期博客中16进制颜色值地址
  13. matplotlib plot函数使用详解
  14. 解决aspx页面中关键词(keywords)和描述(descript)不显示问题
  15. 台式电脑网络连接配置异常_专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机...
  16. ROS小车-上位机代码:两驱小车直线行走校准
  17. 曝光的原理 自动曝光
  18. 【收集】HTML特殊转义字符对照表大全
  19. 出口路由器网关配置案例
  20. 如何才能让一个B2C企业销售额高速成长呢?

热门文章

  1. 【机器学习算法专题(蓄力计划)】十四、机器学习中逻辑回归
  2. 六十五、下一个更大的数系列,单调栈解决方法
  3. 2020 年最全 Python 面试题汇总 (二)
  4. 物理化学 化学 动力学(下)
  5. 虚拟机中Ubuntu不能联网----
  6. 北京/上海/杭州 | 蚂蚁金服智能引擎技术事业部招聘知识图谱算法工程师
  7. 超越谷歌BERT!依图推出预训练语言理解模型ConvBERT
  8. 搜索,然后学习:两阶段的无监督文本生成
  9. 逃离数学焦虑、算法选择,思考做好机器学习项目的3个核心问题
  10. The POM for com.ruifeng.tjtaxiqy:shiro:jar:0.0.1-SNAPSHOT is missing, no dependency information avai