32 # ifndef ALEPH_MULTIMAP_H 33 # define ALEPH_MULTIMAP_H 35 # include <ah_stdc++_utils.H> 36 # include <tpl_treapRk.H> 99 template <
typename Key,
typename T,
100 class Compare = Aleph::less<Key>,
101 template <
class,
class>
class KTree =
Treap_Rk,
102 template <
class,
class>
class TTree =
Treap_Rk>
112 Tdata() : elem(), num_reps(0) { }
114 Tdata(
const T & e) : elem(e), num_reps(0) { }
116 Tdata(
const Tdata & item) : elem(item.elem), num_reps(item.num_reps)
122 typedef Aleph::less<T> Tless;
126 bool operator () (
const Tdata & op1,
const Tdata & op2)
const 128 return Tless () (op1.elem, op2.elem);
133 typedef TTree<Tdata, Cmpt> T_Tree;
135 typedef typename T_Tree::Node Tnode;
144 Kdata() : num_reps(0) { }
146 Kdata(
const Kdata & item) : key(item.key), num_reps(0)
148 t_tree.getRoot() =
copyRec(const_cast<Kdata&>(item).t_tree.getRoot());
149 num_reps = item.num_reps;
164 t_tree.getRoot() =
copyRec(const_cast<Kdata&>(item).t_tree.getRoot());
167 num_reps = item.num_reps;
175 bool operator () (
const Kdata & op1,
const Kdata & op2)
const 177 return Compare () (op1.key, op2.key);
181 typedef KTree<Kdata, Cmpk> K_Tree;
183 typedef typename K_Tree::Node Knode;
196 mutable Kdata searching_kdata;
200 Kdata & key_kdata(
const Key & key)
const 202 searching_kdata.key = key;
203 return searching_kdata;
222 typedef std::pair<Key, T> Pair;
232 typedef size_t size_type;
234 typedef Key key_type;
236 typedef T mapped_type;
240 const size_t &
size ()
const {
return num_elem; }
246 int sizek =
sizeof(Knode);
247 int sizet =
sizeof(Tnode);
249 double total_mem = pow(2, __WORDSIZE);
251 size_type ret_val = floor(total_mem / (sizek + sizet));
258 bool empty ()
const {
return k_tree.is_empty(); }
262 typedef typename K_Tree::Iterator K_Itor;
263 typedef typename T_Tree::Iterator T_Itor;
273 friend class multimap<Key, T, Compare, KTree, TTree>;
276 const K_Tree * k_tree_ptr =
nullptr;
278 const T_Tree * t_tree_ptr =
nullptr;
280 mutable int pos_in_k = 0;
281 mutable int pos_in_t = 0;
288 assert(k_tree_ptr !=
nullptr);
292 assert(
KEY(k_it.get_curr()).t_tree.size() > 0);
293 underflow = overflow =
false;
294 pos_in_k = pos_in_t = 0;
295 t_tree_ptr = &
KEY(k_it.get_curr()).t_tree;
296 t_it = T_Itor(*t_tree_ptr);
303 int kpos = 0,
int tpos = 0)
304 : multimap_ptr(const_cast<multimap*>(m)),
305 k_tree_ptr(&m->k_tree),
306 k_it(*k_tree_ptr, kp),
307 t_tree_ptr(&
KEY(kp).t_tree),
308 t_it(*t_tree_ptr, tp),
314 assert(not
KEY(kp).t_tree.is_empty());
315 assert(
KEY(tp).num_reps > 0 and tpos <
KEY(tp).num_reps);
319 : multimap_ptr(const_cast<multimap*>(m)),
320 k_tree_ptr(&m->k_tree), k_it(*k_tree_ptr, p),
321 t_tree_ptr(&
KEY(p).t_tree), t_it(*t_tree_ptr),
322 pos_in_t(0), underflow(
false), overflow(
false)
324 assert(
KEY(p).num_reps > 0);
325 assert(not
KEY(p).t_tree.is_empty());
346 : multimap_ptr(const_cast<
multimap*>(&mm)),
347 k_tree_ptr(&multimap_ptr->k_tree), k_it(*k_tree_ptr)
354 : multimap_ptr(it.multimap_ptr), k_tree_ptr(it.k_tree_ptr), k_it(it.k_it),
355 t_tree_ptr(it.t_tree_ptr), t_it(it.t_it),
356 pos_in_k(it.pos_in_k), pos_in_t(it.pos_in_t),
357 underflow(it.underflow), overflow(it.overflow)
364 : multimap_ptr(nullptr), k_tree_ptr(nullptr), t_tree_ptr(nullptr),
365 pos_in_k(-1), pos_in_t(-1), underflow(true), overflow(true)
376 multimap_ptr = it.multimap_ptr;
377 k_tree_ptr = it.k_tree_ptr;
379 t_tree_ptr = it.t_tree_ptr;
381 pos_in_k = it.pos_in_k;
382 pos_in_t = it.pos_in_t;
383 underflow = it.underflow;
384 overflow = it.overflow;
391 bool has_curr()
const {
return k_it.has_curr(); }
393 Knode * get_curr() {
return k_it.get_curr(); }
395 Kdata & get_curr_kdata() {
return KEY(get_curr()); }
400 value_type operator * ()
402 return value_type(get_curr_kdata().key,
KEY(t_it.get_curr()).elem);
416 const value_type * operator -> ()
418 ret_pair.first = get_curr_kdata().key;
419 ret_pair.second =
KEY(t_it.get_curr()).elem;
435 t_tree_ptr = &
KEY(get_curr()).t_tree;
436 t_it = T_Itor(*t_tree_ptr);
437 pos_in_k = pos_in_t = 0;
450 Kdata & kdata =
KEY(get_curr());
451 t_tree_ptr = &kdata.t_tree;
452 t_it = T_Itor(*t_tree_ptr);
454 pos_in_k = kdata.num_reps - 1;
455 pos_in_t =
KEY(t_it.get_curr()).num_reps - 1;
480 bool is_at_end()
const {
return not has_curr(); }
488 void put_in_overflow()
490 t_tree_ptr =
nullptr;
492 if (k_tree_ptr->is_empty())
498 void put_in_underflow()
500 t_tree_ptr =
nullptr;
516 t_tree_ptr = &
KEY(get_curr()).t_tree;
517 t_it = T_Itor(*t_tree_ptr);
521 void forward_tree_iterators()
543 assert(t_tree_ptr ==
nullptr);
544 throw std::overflow_error(
"Multimap::iterator is already " 548 assert(t_it.has_curr() and t_tree_ptr !=
nullptr);
550 Tdata & tdata =
KEY(t_it.get_curr());
551 if (++pos_in_t < tdata.num_reps)
554 forward_tree_iterators();
566 t_tree_ptr = &
KEY(get_curr()).t_tree;
567 t_it = T_Itor(*t_tree_ptr);
569 pos_in_t =
KEY(t_it.get_curr()).num_reps - 1;
572 void backward_tree_iterators()
577 pos_in_t =
KEY(t_it.get_curr()).num_reps - 1;
594 assert(t_tree_ptr ==
nullptr);
595 throw std::underflow_error(
"Multimap::iterator is " 596 "already in underflow");
599 assert(t_it.has_curr() and t_tree_ptr !=
nullptr);
604 backward_tree_iterators();
609 Kdata & kdata = get_curr_kdata();
610 Tnode * tp = t_it.get_curr();
611 Tdata & tdata =
KEY(tp);
613 --multimap_ptr->num_elem;
615 if (--tdata.num_reps == 0)
620 else if (pos_in_t == tdata.num_reps)
628 assert(kdata.num_reps > 0);
632 if (kdata.num_reps == 0)
634 Knode * kp = k_it.del();
635 assert(
KEY(kp).t_tree.is_empty());
641 if (not k_it.has_curr())
647 t_tree_ptr = &
KEY(get_curr()).t_tree;
648 t_it = T_Itor(*t_tree_ptr);
649 pos_in_k = pos_in_t = 0;
657 if (this->has_curr() and it.has_curr())
658 return (t_it.get_curr() == it.t_it.get_curr() and
659 pos_in_t == it.pos_in_t);
661 if (this->is_at_end() and it.is_at_end())
663 assert(this->overflow and it.overflow);
673 return not (*
this == itor);
719 assert(
KEY(t_it.get_curr()).num_reps > 0);
721 const size_t treps =
KEY(t_it.get_curr()).num_reps;
722 const int remain_in_t_node = treps - pos_in_t;
723 if (n < remain_in_t_node)
727 assert(pos_in_t <
KEY(t_it.get_curr()).num_reps);
732 n -= remain_in_t_node;
739 assert(pos_in_k ==
KEY(k_it.get_curr()).num_reps);
747 throw std::overflow_error(
"Multimap::iterator is " 748 "already in overflow");
751 assert(
KEY(get_curr()).num_reps > 0);
753 const int remain_in_k_node =
KEY(get_curr()).num_reps;
754 if (n < remain_in_k_node)
756 t_tree_ptr = &
KEY(get_curr()).t_tree;
757 t_it = T_Itor(*t_tree_ptr);
758 pos_in_k = pos_in_t = 0;
762 n -= remain_in_k_node;
779 Knode * kp =
new Knode(key_kdata(value.first));
780 Knode * kq = k_tree.search_or_insert(kp);
785 assert(
KEY(kq).key == value.first);
787 T_Tree & t_tree =
KEY(kq).t_tree;
788 const Tdata tdata(value.second);
792 Tnode * tp =
new Tnode(tdata);
793 Tnode * tq = t_tree.search_or_insert(tp);
814 template <
class InputIterator>
815 void insert(InputIterator first,
const InputIterator & last)
817 while (first != last)
822 template <
class InputIterator>
823 multimap(InputIterator first,
const InputIterator & last)
826 this->
insert(first, last);
833 k_tree.getRoot() =
copyRec(const_cast<multimap&>(m).k_tree.getRoot());
834 num_elem = m.num_elem;
847 k_tree.getRoot() =
copyRec(const_cast<multimap&>(m).k_tree.getRoot());
848 num_elem = m.num_elem;
874 Knode * kp =
const_cast<iterator&
>(hint).get_curr();
875 Kdata & kdata =
KEY(kp);
878 if (Aleph::are_equals <Key, Compare> (kdata.key, value.first))
881 Tnode * tq = hint.t_it.get_curr();
882 const Tdata & tdata =
KEY(tq);
884 if (Aleph::no_equals <T, Tless> (tdata.elem, value.second))
886 Tnode * tp =
new Tnode(tdata);
887 tq = kdata.t_tree.search_or_insert(tp);
915 size_type
erase(
const key_type & key)
917 Knode * p = k_tree.remove(key_kdata(key));
921 size_type ret_val =
KEY(p).num_reps;
958 size_type
count(
const Key & key)
const 960 Kdata & kdata =
const_cast<multimap*
>(
this)->key_kdata(key);
961 Knode * p =
const_cast<multimap*
>(
this)->k_tree.search(kdata);
965 return KEY(p).num_reps;
972 Knode * p = k_tree.search(key_kdata(key));
982 if (k_tree.is_empty())
985 std::pair<int, Knode*> p = k_tree.find_position(key_kdata(key));
986 Knode * kp = p.second;
990 if (Aleph::are_equals <Key, Compare> (
KEY(kp).key, key))
993 if (p.first == k_tree.size())
999 if (Compare () (ret->first, key))
1009 if (k_tree.is_empty())
1012 std::pair<int, Knode*> p = k_tree.find_position(key_kdata(key));
1013 Knode * kp = p.second;
1017 if (Aleph::are_equals <Key, Compare> (
KEY(kp).key, key))
1020 if (p.first == k_tree.size())
1026 if (Compare () (ret->first, key))
1036 Knode * p = k_tree.search(key_kdata(key));
1040 return std::pair<iterator,iterator>(e, e);
1045 last +=
KEY(p).num_reps;
1047 return std::pair<iterator,iterator>(first, last);
1053 k_tree.swap(other.k_tree);
1054 std::swap(num_elem, other.num_elem);
1064 K_Itor kit1(const_cast<multimap*>(
this)->k_tree);
1065 K_Itor kit2(const_cast<multimap&>(rhs).k_tree);
1066 for (; kit1.has_curr() and kit2.has_curr(); kit1.next_ne(), kit2.next_ne())
1068 Kdata & kdata1 =
KEY(kit1.get_curr_ne());
1069 Kdata & kdata2 =
KEY(kit2.get_curr_ne());
1071 const size_t & n1 = kdata1.num_reps;
1072 const size_t & n2 = kdata2.num_reps;
1077 const Key & key1 = kdata1.key;
1078 const Key & key2 = kdata2.key;
1079 if (Compare () (key1, key2))
1081 else if (Compare () (key2, key1))
1085 if (kit1.has_curr() or kit2.has_curr())
1086 return kit2.has_curr();
1098 K_Itor kit1(const_cast<multimap*>(
this)->k_tree);
1099 K_Itor kit2(const_cast<multimap&>(rhs).k_tree);
1100 for (; kit1.has_curr() and kit2.has_curr(); kit1.next_ne(), kit2.next_ne())
1102 Kdata & kdata1 =
KEY(kit1.get_curr_ne());
1103 Kdata & kdata2 =
KEY(kit2.get_curr_ne());
1105 const size_t & n1 = kdata1.num_reps;
1106 const size_t & n2 = kdata2.num_reps;
1111 const Key & key1 = kdata1.key;
1112 const Key & key2 = kdata2.key;
1113 if (Compare () (key1, key2))
1115 else if (Compare () (key2, key1))
1119 if (kit1.has_curr() or kit2.has_curr())
1120 return kit2.has_curr();
1131 K_Itor kit1(const_cast<multimap*>(
this)->k_tree);
1132 K_Itor kit2(const_cast<multimap&>(rhs).k_tree);
1133 for (; kit1.has_curr() and kit2.has_curr(); kit1.next_ne(), kit2.next_ne())
1135 Kdata & kdata1 =
KEY(kit1.get_curr_ne());
1136 Kdata & kdata2 =
KEY(kit2.get_curr_ne());
1138 if (kdata1.num_reps != kdata2.num_reps)
1141 const Key & key1 = kdata1.key;
1142 const Key & key2 = kdata2.key;
1143 if (Compare () (key1, key2))
1145 else if (Compare () (key2, key1))
1149 if (kit1.has_curr() or kit2.has_curr())
1158 return not (*
this == rhs);
1178 return rhs <= *
this;
1207 throw std::domain_error(
"key not found on constant multimap");
1216 # endif // ALEPH_MULTIMAP_H iterator erase(const_iterator &position)
Elimina del multimapeo el elemento situado en position.
Definition: Multimap.H:904
iterator insert(const value_type &value)
Definition: Multimap.H:777
iterator erase(iterator first, const_iterator &last)
Definition: Multimap.H:942
bool operator<(const multimap &rhs) const
Definition: Multimap.H:1062
bool operator>(const multimap &rhs) const
Definition: Multimap.H:1166
void clear()
VacÃa el multimapeo. Todos los elementos son borrados.
Definition: Multimap.H:216
const iterator const_iterator
iterador constante
Definition: Multimap.H:769
Pair value_type
Tipo de valor de clave manejado (que es un par)
Definition: Multimap.H:225
bool operator<=(const multimap &rhs) const
Definition: Multimap.H:1096
iterator()
Constructor vacÃo; uso indefinido.
Definition: Multimap.H:363
const size_t & size() const
Definition: Multimap.H:240
multimap::reference reference
Tipo referencia a elemento dentro del multi-mapeo.
Definition: Multimap.H:341
const T & operator[](const Key &key)
Definition: Multimap.H:1194
iterator(const multimap &mm)
Definition: Multimap.H:345
iterator insert(const_iterator &hint, const value_type &value)
Definition: Multimap.H:870
Definition: Multimap.H:271
iterator end() const
retorna un iterador al último elemento del multimapeo.
Definition: Multimap.H:955
void insert(InputIterator first, const InputIterator &last)
Definition: Multimap.H:815
multimap(InputIterator first, const InputIterator &last)
Construye un multimapeo con los pares del rango [first,last).
Definition: Multimap.H:823
bool operator==(const multimap &rhs) const
Retorna true si this es exactamente igual a rhs.
Definition: Multimap.H:1126
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
multimap::value_type * pointer
Tipo apuntador a elemento dentro del multi-mapeo.
Definition: Multimap.H:338
size_type max_size() const
Definition: Multimap.H:244
bool operator!=(const multimap &rhs) const
Retorna true si this es distinto de rhs.
Definition: Multimap.H:1156
void destroyRec(Node *&root) noexcept
Definition: tpl_binNodeUtils.H:500
iterator(const iterator &it)
Constructor copia (masivamente usado por el estándar)
Definition: Multimap.H:353
Definition: Multimap.H:103
Definition: tpl_treapRk.H:1010
multimap & operator=(const multimap &m)
Definition: Multimap.H:839
size_type count(const Key &key) const
retorna la cantidad pares con clave igual a key
Definition: Multimap.H:958
iterator upper_bound(const Key &key) const
Definition: Multimap.H:1007
size_type erase(const key_type &key)
Definition: Multimap.H:915
void swap(multimap &other)
Intercambia los valores de this con los de other.
Definition: Multimap.H:1051
Node * copyRec(Node *root)
Definition: tpl_binNodeUtils.H:519
iterator find(const Key &key) const
Definition: Multimap.H:970
multimap::value_type & reference
Referencia al par.
Definition: Multimap.H:228
iterator begin() const
retorna un iterador al primer elemento del multimapeo.
Definition: Multimap.H:952
std::pair< iterator, iterator > equal_range(const Key &key) const
Definition: Multimap.H:1034
iterator lower_bound(const Key &key) const
Retorna un iterador posicionado en el lugar donde serÃa insertado key.
Definition: Multimap.H:980
multimap::size_type difference_type
Definition: Multimap.H:335
multimap(const multimap &m)
Constructor copia.
Definition: Multimap.H:830
bool empty() const
Definition: Multimap.H:258
multimap::value_type value_type
El tipo de dato que contiene el multi-mapeo.
Definition: Multimap.H:331
bool operator>=(const multimap &rhs) const
Definition: Multimap.H:1176