1 #ifndef DOZERG_HEAP_H_20080102 2 #define DOZERG_HEAP_H_20080102 17 #include "impl/environment.hh" 24 class Container = std::vector<T>,
25 class BinaryPredicate = std::less<T>
30 typedef BinaryPredicate less_comp;
31 typedef Container container_type;
32 typedef typename container_type::value_type value_type;
33 typedef typename container_type::size_type size_type;
35 typedef typename container_type::reference reference;
36 typedef typename container_type::const_reference const_reference;
38 explicit CHeap(less_comp = less_comp()){}
39 explicit CHeap(
const container_type & cont, less_comp = less_comp())
42 std::make_heap(cont_.begin(), cont_.end(), less_comp());
44 template<
class InputIterator>
45 CHeap(InputIterator first, InputIterator last, less_comp = less_comp())
48 std::make_heap(cont_.begin(), cont_.end(), less_comp());
50 template<
class InputIterator>
51 CHeap(
const container_type & cont, InputIterator first, InputIterator last, less_comp = less_comp())
54 cont_.insert(cont_.end(), first, last);
55 std::make_heap(cont_.begin(), cont_.end(), less_comp());
57 bool empty()
const {
return cont_.empty();}
58 size_type size()
const {
return cont_.size();}
59 reference top() {
return cont_.front();}
60 const_reference top()
const {
return cont_.front();}
61 void push(const_reference value){
62 cont_.push_back(value);
63 std::push_heap(cont_.begin(), cont_.end(), less_comp());
66 std::pop_heap(cont_.begin(), cont_.end(), less_comp());
69 void swap(__Myt & a)
throw() {
70 std::swap(cont_, a.cont_);
79 class Container = std::vector<T>,
80 class BinaryPredicateLess = std::less<T>,
81 class BinaryPredicateEqual = std::equal_to<T>
86 typedef BinaryPredicateLess less_comp;
87 typedef BinaryPredicateEqual equal_comp;
88 typedef Container container_type;
89 typedef typename container_type::value_type value_type;
90 typedef typename container_type::size_type size_type;
92 typedef typename container_type::reference reference;
93 typedef typename container_type::const_reference const_reference;
95 explicit CFixedHeap(
size_t max_size = 10, less_comp = less_comp(), equal_comp = equal_comp())
98 CFixedHeap(
size_t max_size,
const container_type & cont, less_comp = less_comp(), equal_comp = equal_comp())
101 fromRange(cont_.begin(), cont_.end(), cont_.size());
103 template<
class InputIterator>
104 CFixedHeap(InputIterator first, InputIterator last,
size_t max_size, less_comp = less_comp(), equal_comp = equal_comp())
105 : max_size_(max_size)
107 fromRange(first, last, 0);
109 bool empty()
const {
return cont_.empty();}
110 size_type size()
const {
return cont_.size();}
111 size_type max_size()
const {
return max_size_;}
112 reference top() {
return cont_.front();}
113 const_reference top()
const {
return cont_.front();}
114 void set_max_size(
size_t maxsz){max_size_ = maxsz;}
115 void push(const_reference value){
116 if(size() < max_size_){
117 cont_.push_back(value);
118 std::push_heap(cont_.begin(), cont_.end(), less_comp());
119 }
else if(max_size_ > 0 && less_comp()(value, top())){
121 std::make_heap(cont_.begin(), cont_.end(), less_comp());
125 std::pop_heap(cont_.begin(), cont_.end(), less_comp());
129 void push_unique(const_reference value){
130 typedef typename container_type::const_iterator __Iter;
132 __Iter i = cont_.begin();
133 for(;i != cont_.end() && !eq(value, *i);++i);
135 std::make_heap(cont_.begin(), cont_.end(), less_comp());
139 void swap(__Myt & a)
throw() {
140 std::swap(max_size_, a.max_size_);
141 std::swap(cont_, a.cont_);
144 template<
class InputIterator>
145 void fromRange(InputIterator first, InputIterator last,
size_t sz){
146 if(sz && sz <= max_size_){
147 cont_.assign(first, last);
148 std::make_heap(cont_.first(), cont_.last(), less_comp());
150 for(;first != last;++first)
156 container_type cont_;
159 template<
class T,
class C,
class P>
165 template<
class T,
class C,
class P1,
class P2>