34 # include <ah_stdc++_utils.H> 35 # include <tpl_treapRk.H> 36 # include <tpl_nodePool.H> 63 class Compare = Aleph::less<T>,
64 template <
class,
class>
class Tree =
Treap_Rk>
69 Tree<T, Compare> tree;
71 typedef typename Tree<T, Compare>::Node Node;
99 friend class set<T, Compare, Tree>;
101 typedef typename Tree<T, Compare>::Iterator Iterator;
103 const Tree<T, Compare> * tree;
108 iterator(
const Tree<T, Compare> & _tree, Node * node)
109 : tree (&_tree), itor (_tree, node), underflow (
false), overflow (
false)
116 if (tree->size () == 0)
117 underflow = overflow =
true;
119 underflow = overflow =
false;
122 iterator(
const Tree<T, Compare> & _tree) : tree(&_tree), itor(_tree)
158 if (not itor.has_curr())
172 if (not itor.has_curr())
195 iterator () : tree (
nullptr), underflow (
true), overflow (
true)
201 const T & operator * ()
203 return KEY (itor.get_curr () );
207 const T * operator -> ()
209 return &
KEY (itor.get_curr () );
214 iterator operator ++ ()
221 iterator operator ++ (
int)
223 iterator return_value = *
this;
230 iterator operator -- ()
237 iterator operator -- (
int)
239 iterator return_value = *
this;
246 iterator operator += (
const size_type & n)
248 itor.reset_to_pos(itor.get_current_position () + n);
254 iterator operator -= (
const size_type & n)
256 itor.reset_to_pos(itor.get_current_position () - n);
263 return itor == _itor.itor;
269 return not (itor == _itor.itor);
272 bool verify (
const set & _set)
const 274 return itor.verify ( (Tree<T, Compare>*) &_set.tree);
277 bool verify (
const iterator & it)
const 279 return itor.verify (it.itor);
284 set () : node_pool(100) { }
287 set (
const set & c) :
set()
289 void * ptr = c.tree.getRoot();
290 tree.getRoot () =
copyRec ((Node*) ptr);
301 size_type
size ()
const {
return COUNT(tree.getRoot()); }
313 if (
size () != c.size () )
316 typename Tree<T, Compare>::Iterator it1 (tree), it2 (c.tree);
318 while (it1.has_current () and it2.has_current () )
320 if (Aleph::no_equals<T, Compare> (
KEY(it1.get_curr()),
321 KEY(it2.get_curr())))
335 return not (*
this == c);
345 typename Tree<T, Compare>::Iterator itor1 (tree), itor2 (c.tree);
347 while (itor1.has_current () and itor2.has_current () )
349 if (Compare () (
KEY(itor1.get_curr()),
KEY(itor2.get_curr())))
351 else if (Compare () (
KEY(itor2.get_curr()),
KEY(itor1.get_curr())))
358 if (itor1.has_current () )
361 return itor2.has_current ();
368 return not (*
this == c or *
this < c);
375 return not (*
this > c );
382 return not (*
this < c);
396 size_type
count (
const T & value)
const 398 if (tree.search (value) ==
nullptr)
417 iterator
find(
const T & value)
const 419 Node * node = tree.search (value);
424 iterator itor (tree);
425 itor.itor.reset_to_node (node);
440 return iterator (tree, p);
453 iterator upper(tree, p);
469 tree.getRoot () =
copyRec (c.tree.getRoot () );
478 std::swap (tree.getRoot (), c.tree.getRoot () );
484 return iterator (tree);
490 iterator last (tree);
511 std::pair<iterator, bool>
insert (
const T & value)
513 Node * p = node_pool.
allocate(value);
515 iterator itor (tree);
517 if (tree.search_or_insert(p) != p)
520 itor.itor.reset_to_key (value);
522 return std::pair<iterator, bool> (itor,
false);
525 itor.itor.reset_to_node(p);
527 return std::pair<iterator, bool> (itor,
true);
546 template <
typename Itor>
547 set (Itor beg,
const Itor &
end) :
set()
549 Aleph::verify_iterators (beg,
end);
573 iterator
insert (
const iterator & ,
const T & value)
575 Node * p = node_pool.
allocate(value);
577 iterator _itor(tree);
579 if (tree.search_or_insert(p) != p)
582 _itor.itor.reset_to_key(value);
585 _itor.itor.reset_to_node(p);
607 template <
typename Itor>
610 Aleph::verify_iterators (beg, end);
629 Node * p = tree.remove (value);
654 Aleph::verify_container_and_iterator (*
this, pos);
672 iterator
erase (
const iterator & beg,
const iterator &
end)
674 Aleph::verify_container_and_iterator (*
this, beg);
675 Aleph::verify_iterators (beg, end);
677 iterator ret_val =
end;
679 const size_t pos_beg = beg.itor.get_current_position ();
680 const size_t pos_end = end.itor.get_current_position ();
682 Node * removed_tree = tree.remove(pos_beg, pos_end - 1);
709 template <
typename T>
710 typename iterator_traits<typename set<T>::iterator>::difference_type
713 Aleph::verify_iterators(it1, it2);
715 return it2.itor.get_current_position() - it1.itor.get_current_position();
iterator erase(const iterator &beg, const iterator &end)
Definition: Set.H:672
iterator insert(const iterator &, const T &value)
Definition: Set.H:573
Definition: tpl_nodePool.H:45
bool operator>=(const set &c) const
Definition: Set.H:380
void deallocate(Node *p) noexcept
Definition: tpl_nodePool.H:102
void clear()
Borra todos los elementos del conjunto.
Definition: Set.H:690
set & operator=(set &c)
Asigna todo el contenido de c a this.
Definition: Set.H:462
auto & COUNT(Node *p) noexcept
Definition: tpl_binNodeXt.H:66
size_t size_type
Tipo numérico para los tamaños (natural).
Definition: Set.H:90
set::value_type & reference
Tipo genérico de referencia a elemento del conjunto.
Definition: Set.H:84
void swap(set &c)
Definition: Set.H:476
size_type erase(const T &value)
Definition: Set.H:627
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
iterator end() const
Retorna un iterador posicionado al último elemento del conjunto.
Definition: Set.H:488
bool empty() const
Retorna true si el contenedor esta vacÃo.
Definition: Set.H:304
std::pair< iterator, bool > insert(const T &value)
Definition: Set.H:511
T value_type
El tipo dato de los elementos del conjunto.
Definition: Set.H:78
bool operator<=(const set &c) const
Definition: Set.H:373
bool operator==(const set &c) const
Definition: Set.H:308
void destroyRec(Node *&root) noexcept
Definition: tpl_binNodeUtils.H:500
bool operator>(const set &c) const
Definition: Set.H:366
iterator find(const T &value) const
Definition: Set.H:417
bool operator!=(const set &c) const
Definition: Set.H:333
iterator begin() const
Retorna un iterador posicionado al primer elemento del conjunto.
Definition: Set.H:482
Definition: tpl_treapRk.H:1010
set::value_type * pointer
Tipo genérico de puntero a elemento del conjunto.
Definition: Set.H:81
void erase(iterator pos)
Definition: Set.H:652
bool operator<(const set &c) const
Definition: Set.H:340
size_type size() const
Retorna la cantidad de elementos que contiene el conjunto.
Definition: Set.H:301
iterator upper_bound(const T &value) const
Definition: Set.H:446
void insert(Itor beg, const Itor &end)
Definition: Set.H:608
Node * copyRec(Node *root)
Definition: tpl_binNodeUtils.H:519
const set::value_type & const_reference
Tipo genérico de referencia constante a elemento del conjunto.
Definition: Set.H:87
size_type count(const T &value) const
Definition: Set.H:396
iterator lower_bound(const T &value) const
Definition: Set.H:433
Node * search_rank_parent(Node *root, const typename Node::key_type &key, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1484
Node * allocate()
Definition: tpl_nodePool.H:56
T key_type
El tipo dato de los elementos del conjunto.
Definition: Set.H:93
~set()
Definition: Set.H:295