Marine Library  1.0
C++ library for Linux Networking Development
heap.hh
1 #ifndef DOZERG_HEAP_H_20080102
2 #define DOZERG_HEAP_H_20080102
3 
4 /*
5  STL风格的堆 CHeap CFixedHeap 固定大小堆 History: 20071006 为CHeap和CFixedHeap增加swap函数 去掉CFixedHeap的less_和equal_成员变量 CFixedHeap::push_unique函数里使用迭代器,而不是下标 //*/ #include <vector> #include <algorithm> //std::less, std::make_heap, ... #include <functional> //std::less, std::equal #include "impl/environment.hh" NS_SERVER_BEGIN //CHeap template< class T, class Container = std::vector<T>, class BinaryPredicate = std::less<T> >class CHeap { typedef CHeap<T, Container, BinaryPredicate> __Myt; public: typedef BinaryPredicate less_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CHeap(less_comp = less_comp()){} explicit CHeap(const container_type & cont, less_comp = less_comp()) : cont_(cont) { std::make_heap(cont_.begin(), cont_.end(), less_comp()); } template<class InputIterator> CHeap(InputIterator first, InputIterator last, less_comp = less_comp()) : cont_(first, last) { std::make_heap(cont_.begin(), cont_.end(), less_comp()); } template<class InputIterator> CHeap(const container_type & cont, InputIterator first, InputIterator last, less_comp = less_comp()) : cont_(cont) { cont_.insert(cont_.end(), first, last); std::make_heap(cont_.begin(), cont_.end(), less_comp()); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void push(const_reference value){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } void swap(__Myt & a) throw() { std::swap(cont_, a.cont_); } private: container_type cont_; }; //CFixedHeap template< class T, class Container = std::vector<T>, class BinaryPredicateLess = std::less<T>, //小于比较算符 class BinaryPredicateEqual = std::equal_to<T> //等于比较算符 >class CFixedHeap { typedef CFixedHeap<T, Container, BinaryPredicateLess, BinaryPredicateEqual> __Myt; public: typedef BinaryPredicateLess less_comp; typedef BinaryPredicateEqual equal_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CFixedHeap(size_t max_size = 10, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) {} CFixedHeap(size_t max_size, const container_type & cont, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(cont_.begin(), cont_.end(), cont_.size()); } template<class InputIterator> CFixedHeap(InputIterator first, InputIterator last, size_t max_size, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(first, last, 0); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} size_type max_size() const {return max_size_;} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void set_max_size(size_t maxsz){max_size_ = maxsz;} void push(const_reference value){ if(size() < max_size_){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); }else if(max_size_ > 0 && less_comp()(value, top())){ top() = value; std::make_heap(cont_.begin(), cont_.end(), less_comp()); } } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } //保证value不重复 void push_unique(const_reference value){ typedef typename container_type::const_iterator __Iter; equal_comp eq; __Iter i = cont_.begin(); for(;i != cont_.end() && !eq(value, *i);++i); if(i != cont_.end()) std::make_heap(cont_.begin(), cont_.end(), less_comp()); else push(value); } void swap(__Myt & a) throw() { std::swap(max_size_, a.max_size_); std::swap(cont_, a.cont_); } private: template<class InputIterator> void fromRange(InputIterator first, InputIterator last, size_t sz){ if(sz && sz <= max_size_){ cont_.assign(first, last); std::make_heap(cont_.first(), cont_.last(), less_comp()); }else{ for(;first != last;++first) push(*first); } } //members: size_t max_size_; container_type cont_; }; template<class T, class C, class P> inline void swap(CHeap<T, C, P> & a, CHeap<T, C, P> & b) { a.swap(b); } template<class T, class C, class P1, class P2> inline void swap(CFixedHeap<T, C, P1, P2> & a, CFixedHeap<T, C, P1, P2> & b) { a.swap(b); } NS_SERVER_END #endif
6  CHeap
7  CFixedHeap 固定大小堆 History: 20071006 为CHeap和CFixedHeap增加swap函数 去掉CFixedHeap的less_和equal_成员变量 CFixedHeap::push_unique函数里使用迭代器,而不是下标 //*/ #include <vector> #include <algorithm> //std::less, std::make_heap, ... #include <functional> //std::less, std::equal #include "impl/environment.hh" NS_SERVER_BEGIN //CHeap template< class T, class Container = std::vector<T>, class BinaryPredicate = std::less<T> >class CHeap { typedef CHeap<T, Container, BinaryPredicate> __Myt; public: typedef BinaryPredicate less_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CHeap(less_comp = less_comp()){} explicit CHeap(const container_type & cont, less_comp = less_comp()) : cont_(cont) { std::make_heap(cont_.begin(), cont_.end(), less_comp()); } template<class InputIterator> CHeap(InputIterator first, InputIterator last, less_comp = less_comp()) : cont_(first, last) { std::make_heap(cont_.begin(), cont_.end(), less_comp()); } template<class InputIterator> CHeap(const container_type & cont, InputIterator first, InputIterator last, less_comp = less_comp()) : cont_(cont) { cont_.insert(cont_.end(), first, last); std::make_heap(cont_.begin(), cont_.end(), less_comp()); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void push(const_reference value){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } void swap(__Myt & a) throw() { std::swap(cont_, a.cont_); } private: container_type cont_; }; //CFixedHeap template< class T, class Container = std::vector<T>, class BinaryPredicateLess = std::less<T>, //小于比较算符 class BinaryPredicateEqual = std::equal_to<T> //等于比较算符 >class CFixedHeap { typedef CFixedHeap<T, Container, BinaryPredicateLess, BinaryPredicateEqual> __Myt; public: typedef BinaryPredicateLess less_comp; typedef BinaryPredicateEqual equal_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CFixedHeap(size_t max_size = 10, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) {} CFixedHeap(size_t max_size, const container_type & cont, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(cont_.begin(), cont_.end(), cont_.size()); } template<class InputIterator> CFixedHeap(InputIterator first, InputIterator last, size_t max_size, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(first, last, 0); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} size_type max_size() const {return max_size_;} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void set_max_size(size_t maxsz){max_size_ = maxsz;} void push(const_reference value){ if(size() < max_size_){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); }else if(max_size_ > 0 && less_comp()(value, top())){ top() = value; std::make_heap(cont_.begin(), cont_.end(), less_comp()); } } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } //保证value不重复 void push_unique(const_reference value){ typedef typename container_type::const_iterator __Iter; equal_comp eq; __Iter i = cont_.begin(); for(;i != cont_.end() && !eq(value, *i);++i); if(i != cont_.end()) std::make_heap(cont_.begin(), cont_.end(), less_comp()); else push(value); } void swap(__Myt & a) throw() { std::swap(max_size_, a.max_size_); std::swap(cont_, a.cont_); } private: template<class InputIterator> void fromRange(InputIterator first, InputIterator last, size_t sz){ if(sz && sz <= max_size_){ cont_.assign(first, last); std::make_heap(cont_.first(), cont_.last(), less_comp()); }else{ for(;first != last;++first) push(*first); } } //members: size_t max_size_; container_type cont_; }; template<class T, class C, class P> inline void swap(CHeap<T, C, P> & a, CHeap<T, C, P> & b) { a.swap(b); } template<class T, class C, class P1, class P2> inline void swap(CFixedHeap<T, C, P1, P2> & a, CFixedHeap<T, C, P1, P2> & b) { a.swap(b); } NS_SERVER_END #endif
8  History:
9  20071006 为CHeap和CFixedHeap增加swap函数
10  去掉CFixedHeap的less_和equal_成员变量
11  CFixedHeap::push_unique函数里使用迭代器,而不是下标//*/ #include <vector> #include <algorithm> //std::less, std::make_heap, ... #include <functional> //std::less, std::equal #include "impl/environment.hh" NS_SERVER_BEGIN //CHeap template< class T, class Container = std::vector<T>, class BinaryPredicate = std::less<T> >class CHeap { typedef CHeap<T, Container, BinaryPredicate> __Myt; public: typedef BinaryPredicate less_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CHeap(less_comp = less_comp()){} explicit CHeap(const container_type & cont, less_comp = less_comp()) : cont_(cont) { std::make_heap(cont_.begin(), cont_.end(), less_comp()); } template<class InputIterator> CHeap(InputIterator first, InputIterator last, less_comp = less_comp()) : cont_(first, last) { std::make_heap(cont_.begin(), cont_.end(), less_comp()); } template<class InputIterator> CHeap(const container_type & cont, InputIterator first, InputIterator last, less_comp = less_comp()) : cont_(cont) { cont_.insert(cont_.end(), first, last); std::make_heap(cont_.begin(), cont_.end(), less_comp()); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void push(const_reference value){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } void swap(__Myt & a) throw() { std::swap(cont_, a.cont_); } private: container_type cont_; }; //CFixedHeap template< class T, class Container = std::vector<T>, class BinaryPredicateLess = std::less<T>, //小于比较算符 class BinaryPredicateEqual = std::equal_to<T> //等于比较算符 >class CFixedHeap { typedef CFixedHeap<T, Container, BinaryPredicateLess, BinaryPredicateEqual> __Myt; public: typedef BinaryPredicateLess less_comp; typedef BinaryPredicateEqual equal_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CFixedHeap(size_t max_size = 10, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) {} CFixedHeap(size_t max_size, const container_type & cont, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(cont_.begin(), cont_.end(), cont_.size()); } template<class InputIterator> CFixedHeap(InputIterator first, InputIterator last, size_t max_size, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(first, last, 0); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} size_type max_size() const {return max_size_;} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void set_max_size(size_t maxsz){max_size_ = maxsz;} void push(const_reference value){ if(size() < max_size_){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); }else if(max_size_ > 0 && less_comp()(value, top())){ top() = value; std::make_heap(cont_.begin(), cont_.end(), less_comp()); } } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } //保证value不重复 void push_unique(const_reference value){ typedef typename container_type::const_iterator __Iter; equal_comp eq; __Iter i = cont_.begin(); for(;i != cont_.end() && !eq(value, *i);++i); if(i != cont_.end()) std::make_heap(cont_.begin(), cont_.end(), less_comp()); else push(value); } void swap(__Myt & a) throw() { std::swap(max_size_, a.max_size_); std::swap(cont_, a.cont_); } private: template<class InputIterator> void fromRange(InputIterator first, InputIterator last, size_t sz){ if(sz && sz <= max_size_){ cont_.assign(first, last); std::make_heap(cont_.first(), cont_.last(), less_comp()); }else{ for(;first != last;++first) push(*first); } } //members: size_t max_size_; container_type cont_; }; template<class T, class C, class P> inline void swap(CHeap<T, C, P> & a, CHeap<T, C, P> & b) { a.swap(b); } template<class T, class C, class P1, class P2> inline void swap(CFixedHeap<T, C, P1, P2> & a, CFixedHeap<T, C, P1, P2> & b) { a.swap(b); } NS_SERVER_END #endif
12 //*/
13 
14 #include <vector>
15 #include <algorithm> //std::less, std::make_heap, ...
16 #include <functional> //std::less, std::equal
17 #include "impl/environment.hh"
18 
19 NS_SERVER_BEGIN
20 
21 //CHeap
22 template<
23  class T,
24  class Container = std::vector<T>,
25  class BinaryPredicate = std::less<T>
26 >class CHeap
27 {
29 public:
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;
34 protected:
35  typedef typename container_type::reference reference;
36  typedef typename container_type::const_reference const_reference;
37 public:
38  explicit CHeap(less_comp = less_comp()){}
39  explicit CHeap(const container_type & cont, less_comp = less_comp())
40  : cont_(cont)
41  {
42  std::make_heap(cont_.begin(), cont_.end(), less_comp());
43  }
44  template<class InputIterator>
45  CHeap(InputIterator first, InputIterator last, less_comp = less_comp())
46  : cont_(first, last)
47  {
48  std::make_heap(cont_.begin(), cont_.end(), less_comp());
49  }
50  template<class InputIterator>
51  CHeap(const container_type & cont, InputIterator first, InputIterator last, less_comp = less_comp())
52  : cont_(cont)
53  {
54  cont_.insert(cont_.end(), first, last);
55  std::make_heap(cont_.begin(), cont_.end(), less_comp());
56  }
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());
64  }
65  void pop(){
66  std::pop_heap(cont_.begin(), cont_.end(), less_comp());
67  cont_.pop_back();
68  }
69  void swap(__Myt & a) throw() {
70  std::swap(cont_, a.cont_);
71  }
72 private:
73  container_type cont_;
74 };
75 
76 //CFixedHeap
77 template<
78  class T,
79  class Container = std::vector<T>,
80  class BinaryPredicateLess = std::less<T>, //小于比较算符 class BinaryPredicateEqual = std::equal_to<T> //等于比较算符 >class CFixedHeap { typedef CFixedHeap<T, Container, BinaryPredicateLess, BinaryPredicateEqual> __Myt; public: typedef BinaryPredicateLess less_comp; typedef BinaryPredicateEqual equal_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CFixedHeap(size_t max_size = 10, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) {} CFixedHeap(size_t max_size, const container_type & cont, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(cont_.begin(), cont_.end(), cont_.size()); } template<class InputIterator> CFixedHeap(InputIterator first, InputIterator last, size_t max_size, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(first, last, 0); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} size_type max_size() const {return max_size_;} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void set_max_size(size_t maxsz){max_size_ = maxsz;} void push(const_reference value){ if(size() < max_size_){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); }else if(max_size_ > 0 && less_comp()(value, top())){ top() = value; std::make_heap(cont_.begin(), cont_.end(), less_comp()); } } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } //保证value不重复 void push_unique(const_reference value){ typedef typename container_type::const_iterator __Iter; equal_comp eq; __Iter i = cont_.begin(); for(;i != cont_.end() && !eq(value, *i);++i); if(i != cont_.end()) std::make_heap(cont_.begin(), cont_.end(), less_comp()); else push(value); } void swap(__Myt & a) throw() { std::swap(max_size_, a.max_size_); std::swap(cont_, a.cont_); } private: template<class InputIterator> void fromRange(InputIterator first, InputIterator last, size_t sz){ if(sz && sz <= max_size_){ cont_.assign(first, last); std::make_heap(cont_.first(), cont_.last(), less_comp()); }else{ for(;first != last;++first) push(*first); } } //members: size_t max_size_; container_type cont_; }; template<class T, class C, class P> inline void swap(CHeap<T, C, P> & a, CHeap<T, C, P> & b) { a.swap(b); } template<class T, class C, class P1, class P2> inline void swap(CFixedHeap<T, C, P1, P2> & a, CFixedHeap<T, C, P1, P2> & b) { a.swap(b); } NS_SERVER_END #endif
81  class BinaryPredicateEqual = std::equal_to<T> //等于比较算符>class CFixedHeap { typedef CFixedHeap<T, Container, BinaryPredicateLess, BinaryPredicateEqual> __Myt; public: typedef BinaryPredicateLess less_comp; typedef BinaryPredicateEqual equal_comp; typedef Container container_type; typedef typename container_type::value_type value_type; typedef typename container_type::size_type size_type; protected: typedef typename container_type::reference reference; typedef typename container_type::const_reference const_reference; public: explicit CFixedHeap(size_t max_size = 10, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) {} CFixedHeap(size_t max_size, const container_type & cont, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(cont_.begin(), cont_.end(), cont_.size()); } template<class InputIterator> CFixedHeap(InputIterator first, InputIterator last, size_t max_size, less_comp = less_comp(), equal_comp = equal_comp()) : max_size_(max_size) { fromRange(first, last, 0); } bool empty() const {return cont_.empty();} size_type size() const {return cont_.size();} size_type max_size() const {return max_size_;} reference top() {return cont_.front();} const_reference top() const {return cont_.front();} void set_max_size(size_t maxsz){max_size_ = maxsz;} void push(const_reference value){ if(size() < max_size_){ cont_.push_back(value); std::push_heap(cont_.begin(), cont_.end(), less_comp()); }else if(max_size_ > 0 && less_comp()(value, top())){ top() = value; std::make_heap(cont_.begin(), cont_.end(), less_comp()); } } void pop(){ std::pop_heap(cont_.begin(), cont_.end(), less_comp()); cont_.pop_back(); } //保证value不重复 void push_unique(const_reference value){ typedef typename container_type::const_iterator __Iter; equal_comp eq; __Iter i = cont_.begin(); for(;i != cont_.end() && !eq(value, *i);++i); if(i != cont_.end()) std::make_heap(cont_.begin(), cont_.end(), less_comp()); else push(value); } void swap(__Myt & a) throw() { std::swap(max_size_, a.max_size_); std::swap(cont_, a.cont_); } private: template<class InputIterator> void fromRange(InputIterator first, InputIterator last, size_t sz){ if(sz && sz <= max_size_){ cont_.assign(first, last); std::make_heap(cont_.first(), cont_.last(), less_comp()); }else{ for(;first != last;++first) push(*first); } } //members: size_t max_size_; container_type cont_; }; template<class T, class C, class P> inline void swap(CHeap<T, C, P> & a, CHeap<T, C, P> & b) { a.swap(b); } template<class T, class C, class P1, class P2> inline void swap(CFixedHeap<T, C, P1, P2> & a, CFixedHeap<T, C, P1, P2> & b) { a.swap(b); } NS_SERVER_END #endif
82 >class CFixedHeap
83 {
85 public:
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;
91 protected:
92  typedef typename container_type::reference reference;
93  typedef typename container_type::const_reference const_reference;
94 public:
95  explicit CFixedHeap(size_t max_size = 10, less_comp = less_comp(), equal_comp = equal_comp())
96  : max_size_(max_size)
97  {}
98  CFixedHeap(size_t max_size, const container_type & cont, less_comp = less_comp(), equal_comp = equal_comp())
99  : max_size_(max_size)
100  {
101  fromRange(cont_.begin(), cont_.end(), cont_.size());
102  }
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)
106  {
107  fromRange(first, last, 0);
108  }
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())){
120  top() = value;
121  std::make_heap(cont_.begin(), cont_.end(), less_comp());
122  }
123  }
124  void pop(){
125  std::pop_heap(cont_.begin(), cont_.end(), less_comp());
126  cont_.pop_back();
127  }
128  //保证value不重复
129  void push_unique(const_reference value){
130  typedef typename container_type::const_iterator __Iter;
131  equal_comp eq;
132  __Iter i = cont_.begin();
133  for(;i != cont_.end() && !eq(value, *i);++i);
134  if(i != cont_.end())
135  std::make_heap(cont_.begin(), cont_.end(), less_comp());
136  else
137  push(value);
138  }
139  void swap(__Myt & a) throw() {
140  std::swap(max_size_, a.max_size_);
141  std::swap(cont_, a.cont_);
142  }
143 private:
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());
149  }else{
150  for(;first != last;++first)
151  push(*first);
152  }
153  }
154  //members:
155  size_t max_size_;
156  container_type cont_;
157 };
158 
159 template<class T, class C, class P>
160 inline void swap(CHeap<T, C, P> & a, CHeap<T, C, P> & b)
161 {
162  a.swap(b);
163 }
164 
165 template<class T, class C, class P1, class P2>
166 inline void swap(CFixedHeap<T, C, P1, P2> & a, CFixedHeap<T, C, P1, P2> & b)
167 {
168  a.swap(b);
169 }
170 
171 NS_SERVER_END
172 
173 #endif
Definition: heap.hh:26
Definition: heap.hh:82