27 # ifndef TPL_DYNARRAYHEAP_H 28 # define TPL_DYNARRAYHEAP_H 30 # include <tpl_dynArray.H> 35 template <
typename T,
class Compare>
inline 36 void sift_up(
DynArray<T> & a,
size_t l,
size_t r, Compare & cmp) noexcept
38 for (
size_t p, i = r; i > l; i = p)
50 template <
typename T,
class Compare>
inline 51 void sift_down(
DynArray<T> & a,
size_t l,
size_t r, Compare & cmp) noexcept
60 T * ac = & a.access(c);
63 T * ac1 = & a.access(c + 1);
94 template <
typename T,
class Compare = Aleph::less<T>>
99 public StlAlephIterator<DynArrayHeap<T, Compare>>
102 size_t num_items = 0;
106 static size_t r_index(
const size_t & i) noexcept
129 throw std::underflow_error(
"Heap is empty");
145 array.
touch(++num_items) = key;
146 sift_up(array, 1, num_items, cmp);
147 return array.
access(num_items);
152 array.
touch(++num_items) = move(key);
153 sift_up(array, 1, num_items, cmp);
154 return array.
access(num_items);
157 void reserve(
size_t n)
160 throw out_of_range(
"DynArrayHeap: n is greater than current heap size");
164 T & insert_direct(
const T & key) noexcept
166 array(++num_items) = key;
167 sift_up(array, 1, num_items, cmp);
168 return array.
access(num_items);
171 T & insert_direct(T && key) noexcept
173 array(++num_items) = move(key);
174 sift_up(array, 1, num_items, cmp);
175 return array.
access(num_items);
178 T & put(
const T & key) {
return insert(key); }
180 T & put(T && key) {
return insert(std::forward<T>(key)); }
182 T & append(
const T & key) {
return insert(key); }
184 T & append(T && key) {
return insert(std::forward<T>(key)); }
198 throw std::underflow_error(
"Heap is empty");
201 T ret_val = move(a1);
202 a1 = move(array(num_items--));
203 sift_down(array, 1, num_items, cmp);
205 array.
cut(num_items + 1);
223 const size_t &
size() const noexcept {
return num_items; }
226 bool is_empty() const noexcept {
return num_items == 0; }
228 struct Iterator :
DynArray<T>::Iterator
232 Iterator(
const DynArrayHeap & h) noexcept : Base(h.array)
234 if (h.num_items != 0)
238 Iterator() noexcept { }
240 bool has_curr()
const noexcept
242 return this->curr_idx != 0 and this->curr_idx != this->array_ptr->
size();
245 long get_pos()
const noexcept {
return this->Base::get_pos() - 1; }
248 template <
class Operation>
249 bool traverse(Operation & operation) noexcept(noexcept(operation))
251 for (Iterator it(*
this); it.has_curr(); it.next_ne())
252 if (not operation(it.get_curr_ne()))
257 template <
class Operation>
258 bool traverse(Operation & operation)
const noexcept(noexcept(operation))
260 return const_cast<DynArrayHeap&
>(*this).traverse<Operation>(operation);
263 template <
class Operation>
264 bool traverse(Operation && operation = Operation())
const 265 noexcept(noexcept(operation))
268 return traverse<Operation>(operation);
271 template <
class Operation>
272 bool traverse(Operation && operation = Operation())
273 noexcept(noexcept(operation))
275 return traverse<Operation>(operation);
283 # endif // TPL_DYNARRAYHEAP_H
Definition: htlist.H:1290
void reserve(const size_t l, const size_t r)
Definition: tpl_dynArray.H:998
void cut(const size_t new_dim=0)
Definition: tpl_dynArray.H:1104
Definition: tpl_dynArrayHeap.H:95
T & access(const size_t i) const noexcept
Definition: tpl_dynArray.H:874
T & touch(const size_t i)
Definition: tpl_dynArray.H:958
T getMin()
Definition: tpl_dynArrayHeap.H:195
bool is_empty() const noexcept
Retorna true si el heap está vacÃo.
Definition: tpl_dynArrayHeap.H:226
DynArrayHeap(Compare __cmp=Compare())
Constructor con dimensión por omisión.
Definition: tpl_dynArrayHeap.H:116
T & insert(const T &key)
Definition: tpl_dynArrayHeap.H:143
T & top()
Retorna el menor elemento del heap.
Definition: tpl_dynArrayHeap.H:126
T getMax()
Definition: tpl_dynArrayHeap.H:217
const size_t & size() const noexcept
Retorna la cantidad de elementos.
Definition: tpl_dynArrayHeap.H:223
size_t size() const noexcept
Definition: tpl_dynArray.H:641
Definition: tpl_dynArray.H:159
Definition: tpl_dynArray.H:1258
Definition: htlist.H:1323