31 # ifndef AH_MULTISET_H 32 # define AH_MULTISET_H 35 # include <ah_stdc++_utils.H> 36 # include <tpl_dnode.H> 37 # include <tpl_treapRk.H> 38 # include <tpl_nodePool.H> 65 class Compare = Aleph::less<T>,
66 template <
class,
class>
class Tree =
Treap_Rk 73 mutable size_t num_reps;
75 Node_Data() : num_reps(0) { }
77 Node_Data(
const T & k) : key(k), num_reps(1) { }
82 bool operator () (
const Node_Data & op1,
const Node_Data & op2)
const 84 return Compare () (op1.key, op2.key);
107 typedef Tree<Node_Data, Cmp_Data> Tree_Type;
109 typedef typename Tree_Type::Node Node;
111 typedef typename Tree_Type::Iterator Tree_Iterator;
113 mutable Tree_Type tree;
115 mutable size_t num_elem;
119 static T & get_key(Node * p) {
return KEY(p).key; }
121 static size_t & get_num_reps(Node * p) {
return KEY(p).num_reps; }
133 friend class multiset<T, Compare, Tree>;
135 typedef typename Tree_Type::Iterator Iterator;
137 mutable multiset * multiset_ptr =
nullptr;
139 mutable Iterator tree_it;
141 mutable int pos_in_node;
147 : multiset_ptr(mset_ptr), tree_it(mset_ptr->tree, curr_tree_node),
148 pos_in_node(pos), overflow (
false), underflow (
false)
155 if (tree_it.has_curr ())
157 underflow = overflow =
false;
161 underflow = overflow =
true;
165 : multiset_ptr(const_cast<multiset*>(&ms)), tree_it(ms.tree)
170 Node * get_curr_node() {
return tree_it.get_curr(); }
172 bool has_curr()
const 174 return tree_it.has_curr();
177 Node_Data & get_data() {
return KEY(get_curr_node()); }
179 T & get_key() {
return multiset::get_key(get_curr_node()); }
181 size_t & get_num_reps() {
return multiset::get_num_reps(get_curr_node()); }
202 : multiset_ptr(mset_ptr), tree_it(multiset_ptr->tree)
208 : multiset_ptr(it.multiset_ptr), tree_it(it.tree_it),
209 pos_in_node(it.pos_in_node),
210 overflow(it.overflow), underflow(it.underflow)
218 underflow = overflow =
true;
223 const T & operator * ()
229 const T * operator -> ()
238 tree_it.reset_first ();
239 if (tree_it.has_curr ())
253 tree_it.reset_last ();
254 if (tree_it.has_curr ())
257 pos_in_node = get_num_reps() - 1;
268 tree_it.reset_last();
269 if (tree_it.has_curr())
288 bool is_at_end()
const 290 return not tree_it.has_curr();
307 if (++pos_in_node == get_num_reps())
311 if (tree_it.has_curr ())
317 assert(*
this == compute_end());
330 if (pos_in_node-- == 0)
334 if (tree_it.has_curr ())
335 pos_in_node = get_num_reps();
343 Node * tree_node = get_curr_node();
344 size_t & num_reps = multiset::get_num_reps(tree_node);
348 --multiset_ptr->num_elem;
353 multiset_ptr->pool.deallocate(tree_node);
355 if (tree_it.has_curr ())
392 T & operator -- (
int)
403 for (
int i = 0; i < n; ++i)
413 for (
int i = 0; i < n; ++i)
422 if (this->has_curr() and it.has_curr())
423 return pos_in_node == it.pos_in_node;
425 if (this->is_at_end() and it.is_at_end())
427 assert(this->overflow and it.overflow);
437 return not (*
this == itor);
440 bool verify (
const multiset & _multiset)
const 442 return tree_it.verify ( (Tree_Type*)& (_multiset.tree));
445 bool verify (
const iterator & it)
const 447 return tree_it.verify (it.tree_it);
467 tree.getRoot () =
copyRec(c.tree.getRoot());
493 template <
typename Itor>
517 num_elem = c.num_elem;
523 size_type
size ()
const {
return num_elem; }
528 return COUNT(tree.getRoot ()) == 0;
541 Tree_Iterator itor1 (tree), itor2 (c.tree);
543 while (itor1.has_curr() and itor2.has_curr())
545 Node * p1 = itor1.get_curr();
546 Node * p2 = itor2.get_curr();
548 if (no_equals <Node_Data, Cmp_Data> (
KEY(p1),
KEY(p2)))
550 else if (get_num_reps(p1) != get_num_reps(p2))
557 return not itor1.has_curr() and not itor2.has_curr();
564 return not (*
this == c);
576 while (itor1.has_curr() and itor2.has_curr())
578 if (Cmp_Data () (itor1.get_data(), itor2.get_data()))
580 else if (Cmp_Data () (itor2.get_data(), itor1.get_data()))
587 if (itor1.has_curr())
590 return itor2.has_curr();
597 return not (*
this == c or *
this < c);
604 return not (*
this > c );
611 return not (*
this < c);
621 size_type
count (
const T & value)
const 623 Node * p = tree.search (Node_Data(value));
628 return get_num_reps(p);
650 Node * node = tree.search(Node_Data(value));
655 return iterator(const_cast<multiset*>(
this), node);
676 throw std::underflow_error (
"multiset is empty");
678 Node * tree_node = tree.search(Node_Data(value));
680 if (tree_node ==
nullptr)
704 throw std::underflow_error(
"multiset is empty");
706 Node * tree_node = tree.search(Node_Data(value));
708 if (tree_node ==
nullptr)
712 it.list_it.reset_last ();
721 std::swap (tree.getRoot (), c.tree.getRoot ());
722 std::swap (num_elem, c.num_elem);
736 return iterator(*this).compute_end();
750 Node * p = pool.
allocate(Node_Data(value));
751 Node * ptr = tree.search_or_insert(p);
758 return iterator(
this, ptr, get_num_reps(ptr)++);
788 Aleph::verify_container_and_iterator (
this, pos);
790 if (pos != pos.compute_end())
792 Node * p = pos.get_curr_node();
794 if (are_equals <Node_Data, Cmp_Data> (
KEY(p), Node_Data(value)))
823 template <
typename Itor>
826 Aleph::verify_iterators (beg, end);
842 Node * tree_node = tree.remove(Node_Data(value));
844 if (tree_node ==
nullptr)
847 const size_t ret_val = get_num_reps(tree_node);
871 Aleph::verify_container_and_iterator (*
this, pos);
873 Node * tree_node = pos.get_curr_node();
875 size_t & num_reps = get_num_reps(tree_node);
882 tree.remove(Node_Data(
KEY(tree_node)));
915 Aleph::verify_container_and_iterator (*
this, beg);
916 Aleph::verify_iterators (beg, end);
918 return delete_range(beg, end);
924 destroyRec (static_cast<Node *> (tree.getRoot ()));
930 template <
typename T>
931 typename iterator_traits<typename multiset<T>::iterator>::difference_type
935 typename iterator_traits<typename multiset<T>::iterator>::difference_type
950 # endif // AH_MULTISET_H Definition: Multiset.H:129
multiset< T >::value_type * pointer
Tipo apuntador a elemento dentro del multi-conjunto.
Definition: Multiset.H:193
Definition: tpl_nodePool.H:45
bool operator>(const multiset &c) const
Definition: Multiset.H:595
multiset::iterator const_iterator
Tipo iterador constante.
Definition: Multiset.H:452
void deallocate(Node *p) noexcept
Definition: tpl_nodePool.H:102
size_t size_type
Tipo numérico para los tamaños (natural).
Definition: Multiset.H:100
bool operator<=(const multiset &c) const
Definition: Multiset.H:602
auto & COUNT(Node *p) noexcept
Definition: tpl_binNodeXt.H:66
multiset()
Constructor vacÃo de un multi-conjunto.
Definition: Multiset.H:461
iterator insert(iterator pos, const T &value)
Definition: Multiset.H:786
iterator upper_bound(const T &value) const
Definition: Multiset.H:701
multiset::value_type & reference
Tipo genérico de referencia a elemento del conjunto.
Definition: Multiset.H:94
void swap(multiset &c)
Definition: Multiset.H:719
void erase(iterator pos)
Definition: Multiset.H:869
multiset(const multiset &c)
Instancia una copia del multi-conjunto c.
Definition: Multiset.H:473
bool operator<(const multiset &c) const
Definition: Multiset.H:569
multiset & operator=(const multiset &c)
Asigna todo el contenido de c a this.
Definition: Multiset.H:508
multiset< T >::value_type value_type
El tipo de dato que contiene el multi-conjunto.
Definition: Multiset.H:186
T key_type
El tipo dato de los elementos del conjunto.
Definition: Multiset.H:103
~multiset()
Definition: Multiset.H:502
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
iterator lower_bound(const T &value) const
Definition: Multiset.H:673
size_type size() const
Retorna la cantidad de elementos que contiene el multi-conjunto.
Definition: Multiset.H:523
size_type count(const T &value) const
Definition: Multiset.H:621
bool operator>=(const multiset &c) const
Definition: Multiset.H:609
Definition: Multiset.H:68
iterator erase(iterator beg, const iterator &end)
Definition: Multiset.H:913
void insert(Itor beg, const Itor &end)
Definition: Multiset.H:824
void destroyRec(Node *&root) noexcept
Definition: tpl_binNodeUtils.H:500
Definition: tpl_treapRk.H:1010
iterator end() const
Definition: Multiset.H:734
T value_type
El tipo dato de los elementos del conjunto.
Definition: Multiset.H:91
multiset::iterator const_reverse_iterator
Tipo iterador invertido constante.
Definition: Multiset.H:458
iterator find(const T &value) const
Definition: Multiset.H:648
void clear()
Borra todos los elementos del multi-conjunto.
Definition: Multiset.H:922
iterator insert(const T &value)
Definition: Multiset.H:748
Node * copyRec(Node *root)
Definition: tpl_binNodeUtils.H:519
multiset< T >::size_type difference_type
Definition: Multiset.H:190
bool operator==(const multiset &c) const
Definition: Multiset.H:533
Node * allocate()
Definition: tpl_nodePool.H:56
multiset::iterator reverse_iterator
Tipo iterador invertido.
Definition: Multiset.H:455
iterator begin() const
Definition: Multiset.H:727
bool empty() const
Retorna true si el contenedor esta vacÃo.
Definition: Multiset.H:526
iterator()
Constructor vacÃo; no tiene validez si no se asocia un conjunto.
Definition: Multiset.H:216
multiset(Itor beg, const Itor &end)
Definition: Multiset.H:494
multiset< T >::reference reference
Tipo referencia a elemento dentro del multi-conjunto.
Definition: Multiset.H:196
const multiset::value_type & const_reference
Tipo genérico de referencia constante a elemento del conjunto.
Definition: Multiset.H:97
bool operator!=(const multiset &c) const
Definition: Multiset.H:562
size_type erase(const T &value)
Definition: Multiset.H:840
const multiset< T >::reference const_reference
Tipo referencia a elemento dentro del multi-conjunto.
Definition: Multiset.H:199