Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_dynBinHeap.H
1 # ifndef TPL_DYNBINHEAP_H
2 # define TPL_DYNBINHEAP_H
3 
4 # include <ahDry.H>
5 # include <tpl_binNodeUtils.H>
6 # include <tpl_binHeap.H>
7 
8 using namespace Aleph;
9 
10 namespace Aleph {
11 
25  template <class T, class Compare = Aleph::less<T>>
26 class DynBinHeap : public BinHeap<T, Compare>
27 {
28 public:
29 
32 
34  typedef T Item_Type;
35 
36  typedef T Key_Type;
37 
38 private:
39 
40  typedef typename BinHeap<T, Compare>::Node Node;
41 
42  T & __insert(Node * p)
43  {
44  return BinHeap<T, Compare>::insert(p)->get_key();
45  }
46 
47  void copy(DynBinHeap & src)
48  {
49  for_each_in_preorder(src.top(),
50  [this] (Node * p)
51  {
52  this->insert(new Node (p->get_key()));
53  });
54  }
55 
56 public:
57 
58  DynBinHeap(Compare & cmp)
59  : BinHeap<T, Compare>(cmp)
60  { /* empty */ }
61 
62  DynBinHeap(Compare && cmp = Compare())
63  : BinHeap<T, Compare>(cmp)
64  { /* empty */ }
65 
66  DynBinHeap(const DynBinHeap & h)
67  {
68  copy(const_cast<DynBinHeap&>(h));
69  }
70 
72  {
73  this->swap(h);
74  }
75 
76  DynBinHeap & operator = (const DynBinHeap & h)
77  {
78  if (this == &h)
79  return *this;
80 
81  empty();
82 
83  copy(h);
84 
85  return *this;
86  }
87 
88  DynBinHeap & operator = (DynBinHeap && h)
89  {
90  this->swap(h);
91  return *this;
92  }
93 
103  T & insert(const T & item) throw(std::exception, std::bad_alloc)
104  {
105  return __insert(new Node (item));
106  }
107 
108  T & insert(T && item) throw(std::exception, std::bad_alloc)
109  {
110  return __insert(new Node (std::move(item)));
111  }
112 
122  T & put(const T & item) throw(std::exception, std::bad_alloc)
123  {
124  return insert(item);
125  }
126 
127  T & put(T && item) throw(std::exception, std::bad_alloc)
128  {
129  return insert(std::move(item));
130  }
131 
138  T getMin() throw(std::exception, std::underflow_error)
139  {
140  Node * node = BinHeap<T, Compare>::getMin();
141 
142  T return_value = std::move(node->get_key());
143 
144  delete node;
145 
146  return return_value;
147  }
148 
150  T getMax() throw(std::exception, std::underflow_error)
151  {
152  return getMin();
153  }
154 
161  T get() throw(std::exception, std::underflow_error)
162  {
163  return getMin();
164  }
165 
179  void update(T & data)
180  {
181  Node * node = Node::key_to_node(data);
183  }
184 
200  void remove(T & data)
201  {
202  Node * node = BinHeap<T, Compare>::Node::key_to_node(data);
203 
205  }
206 
208  void erase(T & data)
209  {
210  remove(data);
211  }
212 
216  T & top() const throw(std::exception, std::underflow_error)
217  {
218  return BinHeap<T, Compare>::top()->get_key();
219  }
220 
222  void empty()
223  {
224  this->remove_all_and_delete();
225  }
226 
229  {
230  empty();
231  }
232 
233  template <class Operation>
234  bool traverse(Operation & op)
235  {
236  return this->level_traverse(this->getRoot(), [&op] (Node * p)
237  {
238  return op(p->get_key());
239  });
240  }
241 
242  template <class Operation>
243  bool traverse(Operation && op = Operation())
244  {
245  return traverse(op);
246  }
247 
248  template <class Operation>
249  bool traverse(Operation & op) const
250  {
251  return this->level_traverse(this->getRoot(), [&op] (Node * p)
252  {
253  return op(p->get_key());
254  });
255  }
256 
257  template <class Operation>
258  bool traverse(Operation && op = Operation()) const
259  {
260  return traverse<Operation>(op);
261  }
262 
263  Functional_Methods(T);
264 };
265 
266 } // end namespace Aleph
267 
268 # endif // TPL_DYNBINHEAP_H
269 
270 
271 
T & put(const T &item)
Definition: tpl_dynBinHeap.H:122
T Item_Type
El tipo de elemento que retorna get_current().
Definition: tpl_dynBinHeap.H:34
Node * insert(Node *p)
Definition: tpl_binHeap.H:533
T & insert(const T &item)
Definition: tpl_dynBinHeap.H:103
T getMin()
Definition: tpl_dynBinHeap.H:138
Definition: tpl_sim_agent_graph.H:30
T getMax()
Definition: tpl_dynBinHeap.H:150
void empty()
Vacía todos los elementos del heap dinámico.
Definition: tpl_dynBinHeap.H:222
~DynBinHeap()
Destructor.
Definition: tpl_dynBinHeap.H:228
Definition: tpl_dynBinHeap.H:26
void erase(T &data)
Sinónimo de remove.
Definition: tpl_dynBinHeap.H:208
void update(Node *p)
Definition: tpl_binHeap.H:629
Node * top() const
Definition: tpl_binHeap.H:697
Node * getMin()
Definition: tpl_binHeap.H:589
Definition: tpl_binHeap.H:784
DynBinHeap Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_dynBinHeap.H:31
void update(T &data)
Definition: tpl_dynBinHeap.H:179
T & top() const
Definition: tpl_dynBinHeap.H:216
Node * remove(Node *node)
Definition: tpl_binHeap.H:644
void remove_all_and_delete()
Definition: tpl_binHeap.H:673

Leandro Rabindranath León