简介

  heap有查找时间复杂度O(1),查找、插入、删除时间复杂度为O(logN)的特性,STL中heap相关的操作如下:

  make_heap()

  push_heap()

  pop_heap()

  sort_heap()

  reverse()

本次着重介绍make_heap() ,根据其创出的堆有大小堆之分。 其函数原型如下:

default (1)
template <class RandomAccessIterator>
void make_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
void make_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp );

  

  函数解释如下:

  

  Make heap from range

  Rearranges the elements in the range [first,last) in such a way that they form a heap.

  A heap is a way to organize the elements of a range that allows for fast retrieval of the element with the highest value at any moment (with pop_heap), even repeatedly, while allowing for fast insertion of new elements (with         push_heap).

  The element with the highest value is always pointed by first. The order of the other elements depends on the particular implementation, but it is consistent throughout all heap-related functions of this header.

  The elements are compared using operator< (for the first version), or comp (for the second): The element with the highest value is an element for which this would return false when compared to every other element in the range.

  The standard container adaptorpriority_queue callsmake_heap,push_heap andpop_heap automatically to maintain heap properties for a container.

  Parameters

  first, last
Random-access iterators to the initial and final positions of the sequence to be transformed into a heap. The range used is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.
RandomAccessIterator shall point to a type for whichswap is properly defined and which is both move-constructible and move-assignable.
  comp
Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to be less than the second in the specific strict weak ordering it defines.
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.
基本上可以概括为默认的参数原型创建最大堆,带有comp仿函数参数的原型可以根据comp的选取创建所需的堆,根据后面的实例可得,默认的比较符是小于号,创建最大堆; 若comp的比较操作为“ >” 则创建最小堆。

实例

  1.创建最大堆(默认函数)

// range heap example
#include <iostream> // std::cout
#include <algorithm> // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap
#include <vector> // std::vector int main () {
int myints[] = {,,,,};
std::vector<int> v(myints,myints+); std::make_heap (v.begin(),v.end());
std::cout << "initial max heap : " << v.front() << '\n'; std::pop_heap (v.begin(),v.end()); v.pop_back();
std::cout << "max heap after pop : " << v.front() << '\n'; v.push_back(); std::push_heap (v.begin(),v.end());
std::cout << "max heap after push: " << v.front() << '\n'; std::sort_heap (v.begin(),v.end()); std::cout << "final sorted range :";
for (unsigned i=; i<v.size(); i++)
std::cout << ' ' << v[i]; std::cout << '\n'; return ;
}

输出:

initial max heap   :
max heap after pop :
max heap after push:
final sorted range :

可得最大堆。

  2.最小堆创建(使用custom(2)函数)

#include <iostream>
#include <vector>
#include <algorithm> struct doc {
double rank;
explicit doc(double r) : rank(r) {}
}; struct doc_rank_greater_than {
bool operator()(doc const& a, doc const& b) const {
return a.rank > b.rank;
}
}; int main() {
std::vector<doc> docvec;
docvec.push_back( doc() );
docvec.push_back( doc() );
docvec.push_back( doc() );
docvec.push_back( doc() );
std::make_heap(docvec.begin(),docvec.end(),doc_rank_greater_than());
std::cout << docvec.front().rank << '\n';
}

输出:

可得最小堆。

总结  自定义函数可以根据容器中的对象创建相应的最大最小堆。

最新文章

  1. Xcode will continue when iPad is finished. &quot;Could not find Developer Disk Image&quot;
  2. onSaveInstanceState() 和 onRestoreInstanceState()
  3. include &quot;&quot;与include&lt;&gt;
  4. Netdom query基本用法
  5. GoldentGate Oracle to Oracle 初始化具体解释
  6. git命令中带有特殊符号如@
  7. Java开发规范总结(两周至少看一次)
  8. SetCooperativeLevel函数介绍(设置协作等级)
  9. labview web发布局域网内访问
  10. URIError: Failed to decode param &#39;/%PUBLIC_URL%/favicon.ico&#39;
  11. wireshark----linux
  12. Vue2+Webpack创建vue项目
  13. SrervletContext和文件下载
  14. Mac 10.12安装IntelliJ出品的数据库管理工具DataGrip
  15. CodeForces 604A(浮点数)
  16. email的传输协议与格式(资源链接)
  17. QT与HALCON(入门)
  18. 51NOD 1149:Pi的递推式——题解
  19. 服务器如何开启php的fsockopen函数? 使用发邮箱类
  20. #include&quot;&quot;和#include&lt;&gt;的区别

热门文章

  1. Socket编程实践(1) 基本概念
  2. CentOS 6/7安装ffmpeg
  3. js设置css样式.
  4. wireshark lua脚本
  5. SNMP Tutorial
  6. openstack资料相关
  7. Python *与** 参数问题
  8. git gui 还原部分提交文件
  9. ORACLE 常见错误
  10. [Linux] Linux常用文本操作命令整理