标签:
简介
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 ); |
函数解释如下:
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.
[first,last)
, which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.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.实例
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[] = {10,20,30,5,15}; std::vector<int> v(myints,myints+5); 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(99); 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=0; i<v.size(); i++) std::cout << ‘ ‘ << v[i]; std::cout << ‘\n‘; return 0; }
输出:
initial max heap : 30 max heap after pop : 20 max heap after push: 99 final sorted range : 5 10 15 20 99
可得最大堆。
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(4) ); docvec.push_back( doc(3) ); docvec.push_back( doc(2) ); docvec.push_back( doc(1) ); std::make_heap(docvec.begin(),docvec.end(),doc_rank_greater_than()); std::cout << docvec.front().rank << ‘\n‘; }
输出:
1
可得最小堆。
总结 自定义函数可以根据容器中的对象创建相应的最大最小堆。
标签:
原文地址:http://www.cnblogs.com/with-a-orchid/p/STL_heap.html