Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
Set.H
1 /*
2  Aleph implementation of set C++ standard container
3 */
4 
5 # ifndef AH_SET_H
6 # define AH_SET_H
7 
8 # include <ah_stdc++_utils.H>
9 # include <tpl_treapRk.H>
10 # include <tpl_nodePool.H>
11 
12 namespace Aleph
13 {
14 
36  template <typename T,
37  class Compare = Aleph::less<T>,
38  template <class, class> class Tree = Treap_Rk>
39 class set
40 {
41 private:
42 
43  Tree<T, Compare> tree;
44 
45  typedef typename Tree<T, Compare>::Node Node;
46 
47  Node_Pool<Node> node_pool;
48 
49 public:
50 
52  typedef T value_type;
53 
55  typedef typename set::value_type * pointer;
56 
58  typedef typename set::value_type & reference;
59 
61  typedef const typename set::value_type & const_reference;
62 
64  typedef size_t size_type;
65 
67  typedef T key_type;
68 
69  class iterator
70  {
71  private:
72 
73  friend class set<T, Compare, Tree>;
74 
75  typedef typename Tree<T, Compare>::Iterator Iterator;
76 
77  Tree<T, Compare> * tree;
78  Iterator itor;
79  bool underflow;
80  bool overflow;
81 
82  iterator (Tree<T, Compare> & _tree, Node * node)
83  : tree (&_tree), itor (_tree, node), underflow (false), overflow (false)
84  {
85  /* empty */
86  }
87 
88  void init_flags ()
89  {
90  if (tree->size () == 0)
91  underflow = overflow = true;
92  else
93  underflow = overflow = false;
94  }
95 
96  iterator (Tree<T, Compare> & _tree) : tree (&_tree), itor (_tree)
97  {
98  init_flags ();
99  }
100 
101  void goto_begin ()
102  {
103  itor.reset_first ();
104  init_flags ();
105  }
106 
107  void goto_last ()
108  {
109  itor.reset_last ();
110  init_flags ();
111  }
112 
113  void goto_end ()
114  {
115  itor.reset_last ();
116  init_flags ();
117  if (not overflow)
118  itor.next ();
119  overflow = true;
120  }
121 
122  void forward ()
123  {
124  if (underflow)
125  {
126  goto_begin ();
127  return;
128  }
129 
130  itor.next ();
131 
132  if (not itor.has_current() )
133  overflow = true;
134  }
135 
136  void backward ()
137  {
138  if (overflow)
139  {
140  goto_last ();
141  return;
142  }
143 
144  itor.prev ();
145 
146  if (not itor.has_current() )
147  underflow = true;
148  }
149 
150  public:
151 
153  typedef typename set<T>::value_type value_type;
154 
158 
160  typedef typename set<T>::value_type * pointer;
161 
163  typedef typename set<T>::reference reference;
164 
166  typedef const typename set<T>::reference const_reference;
167 
169  iterator () : tree (NULL), underflow (true), overflow (true)
170  {
171  /* empty */
172  }
173 
175  const T & operator * ()
176  {
177  return KEY (itor.get_current () );
178  }
179 
181  const T * operator -> ()
182  {
183  return & KEY (itor.get_current () );
184  }
185 
189  {
190  forward ();
191  return *this;
192  }
193 
196  {
197  iterator return_value = *this;
198  forward ();
199  return return_value;
200  }
201 
205  {
206  backward ();
207  return *this;
208  }
209 
212  {
213  iterator return_value = *this;
214  backward ();
215  return return_value;
216  }
217 
221  {
222  itor.reset_to_pos(itor.get_current_position () + n);
223  return *this;
224  }
225 
229  {
230  itor.reset_to_pos(itor.get_current_position () - n);
231  return *this;
232  }
233 
235  bool operator == (const iterator & _itor) const
236  {
237  return itor == _itor.itor;
238  }
239 
241  bool operator != (const iterator & _itor) const
242  {
243  return not (itor == _itor.itor);
244  }
245 
246  bool verify (const set & _set) const
247  {
248  return itor.verify ( (Tree<T, Compare>*) &_set.tree);
249  }
250 
251  bool verify (const iterator & it) const
252  {
253  return itor.verify (it.itor);
254  }
255  };
256 
258  set () : node_pool(100) { /* empty */ }
259 
261  set (const set & c) : set()
262  {
263  void * ptr = c.tree.getRoot();
264  tree.getRoot () = copyRec ((Node*) ptr);
265  }
266 
269  ~set ()
270  {
271  destroyRec(tree.getRoot () );
272  }
273 
275  size_type size () { return COUNT (tree.getRoot () ); }
276 
278  bool empty ()
279  {
280  return COUNT (tree.getRoot () ) == 0;
281  }
282 
285  bool operator == (const set & c) const
286  {
287  if (this == &c)
288  return true;
289 
290  if (size () != c.size () )
291  return false;
292 
293  typename Tree<T, Compare>::Iterator it1 (tree), it2 (c.tree);
294 
295  while (it1.has_current () and it2.has_current () )
296  {
297  if (Aleph::no_equals<T, Compare> (KEY(it1.get_curr()),
298  KEY(it2.get_curr())))
299  return false;
300 
301  it1.next ();
302  it2.next ();
303  }
304 
305  return true;
306  }
307 
310  bool operator != (const set & c) const
311  {
312  return not (*this == c);
313  }
314 
317  bool operator < (const set & c) const
318  {
319  if (this == &c)
320  return false;
321 
322  typename Tree<T, Compare>::Iterator itor1 (tree), itor2 (c.tree);
323 
324  while (itor1.has_current () and itor2.has_current () )
325  {
326  if (Compare () (KEY(itor1.get_curr()), KEY(itor2.get_curr())))
327  return true;
328  else if (Compare () (KEY(itor2.get_curr()), KEY(itor1.get_curr())))
329  return false;
330 
331  itor1.next ();
332  itor2.next ();
333  }
334 
335  if (itor1.has_current () ) /* |*this| >= |c| */
336  return false;
337 
338  return itor2.has_current ();
339  }
340 
343  bool operator > (const set & c) const
344  {
345  return not (*this == c or *this < c);
346  }
347 
350  bool operator <= (const set & c) const
351  {
352  return not (*this > c );
353  }
354 
357  bool operator >= (const set & c) const
358  {
359  return not (*this < c);
360  }
361 
373  size_type count (const T & value)
374  {
375  if (tree.search (value) == NULL)
376  return 0;
377 
378  return 1;
379  }
380 
394  iterator find(const T & value)
395  {
396  Node * node = tree.search (value);
397 
398  if (node == NULL)
399  return end();
400 
401  iterator itor (tree);
402  itor.itor.reset_to_node (node);
403 
404  return itor;
405  }
406 
410  iterator lower_bound(const T & value)
411  {
412  if (size() == 0)
413  return end ();
414 
415  Node * p = search_rank_parent(tree.getRoot(), value);
416 
417  return iterator (tree, p);
418  }
419 
423  iterator upper_bound(const T & value)
424  {
425  if (size () == 0)
426  return end ();
427 
428  Node * p = search_rank_parent(tree.getRoot(), value);
429 
430  iterator upper(tree, p);
431 
432  if (KEY(p) == value)
433  upper.itor.next();
434 
435  return upper;
436  }
437 
440  {
441  if (this == &c)
442  return *this;
443 
444  destroyRec (tree.getRoot () );
445 
446  tree.getRoot () = copyRec (c.tree.getRoot () );
447 
448  return *this;
449  }
450 
453  void swap (set & c)
454  {
455  std::swap (tree.getRoot (), c.tree.getRoot () );
456  }
457 
459  iterator begin ()
460  {
461  return iterator (tree);
462  }
463 
465  iterator end ()
466  {
467  iterator last (tree);
468  last.goto_end ();
469 
470  return last;
471  }
472 
488  std::pair<iterator, bool> insert (const T & value)
489  {
490  Node * p = node_pool.allocate(value);
491 
492  iterator itor (tree);
493 
494  if (tree.search_or_insert(p) != p) // se inserta o ya está en el conjunto?
495  { // value ya está dentro del conjunto
496  node_pool.deallocate(p);
497  itor.itor.reset_to_key (value);
498 
499  return std::pair<iterator, bool> (itor, false);
500  }
501 
502  itor.itor.reset_to_node(p);
503 
504  return std::pair<iterator, bool> (itor, true);
505  }
506 
507 
523  template <typename Itor>
524  set (Itor beg, const Itor & end) : set()
525  {
526  Aleph::verify_iterators (beg, end);
527 
528  while (beg != end)
529  insert(*beg++) ;
530  }
531 
550  iterator insert (const iterator & /* pos */, const T & value)
551  {
552  Node * p = node_pool.allocate(value);
553 
554  iterator _itor(tree);
555 
556  if (tree.search_or_insert(p) != p)
557  { // clave duplicada
558  node_pool.deallocate(p);
559  _itor.itor.reset_to_key(value);
560  }
561  else
562  _itor.itor.reset_to_node(p);
563 
564  return _itor;
565  }
566 
584  template <typename Itor>
585  void insert (Itor beg, const Itor & end)
586  {
587  Aleph::verify_iterators (beg, end);
588 
589  while (beg != end)
590  insert(*beg++);
591  }
592 
604  size_type erase (const T & value)
605  {
606  Node * p = tree.remove (value);
607 
608  if (p == NULL)
609  return 0;
610 
611  node_pool.deallocate(p);
612 
613  return 1;
614  }
615 
629  void erase (iterator pos)
630  {
631  Aleph::verify_container_and_iterator (*this, pos);
632 
633  node_pool.deallocate(pos.itor.del());
634  }
635 
649  iterator erase (const iterator & beg, const iterator & end)
650  {
651  Aleph::verify_container_and_iterator (*this, beg);
652  Aleph::verify_iterators (beg, end);
653 
654  iterator ret_val = end;
655 
656  const size_t pos_beg = beg.itor.get_current_position ();
657  const size_t pos_end = end.itor.get_current_position ();
658 
659  Node * removed_tree = tree.remove(pos_beg, pos_end - 1);
660 
661  destroyRec(removed_tree);
662 
663  return ret_val;
664  }
665 
667  void clear ()
668  {
669  destroyRec(tree.getRoot());
670  }
671 };
672 
673 
686  template <typename T>
687 typename iterator_traits<typename set<T>::iterator>::difference_type
688 distance(typename set<T>::iterator it1, typename set<T>::iterator it2)
689 {
690  Aleph::verify_iterators(it1, it2);
691 
692  return it2.itor.get_current_position() - it1.itor.get_current_position();
693 }
694 
695 }
696 
697 # endif // AH_SET_H
set(const set &c)
Instancia una copia del conjunto c.
Definition: Set.H:261
iterator erase(const iterator &beg, const iterator &end)
Definition: Set.H:649
iterator insert(const iterator &, const T &value)
Definition: Set.H:550
iterator operator--()
Definition: Set.H:204
iterator upper_bound(const T &value)
Definition: Set.H:423
Definition: tpl_treapRk.H:902
bool operator==(const iterator &_itor) const
Retorna true si los iterador tienen el mismo estado.
Definition: Set.H:235
Definition: tpl_nodePool.H:19
bool operator!=(const set &c) const
Definition: Set.H:310
set< T >::size_type difference_type
Definition: Set.H:157
iterator find(const T &value)
Definition: Set.H:394
set< T >::reference reference
Tipo referencia a elemento dentro del conjunto.
Definition: Set.H:163
void clear()
Borra todos los elementos del conjunto.
Definition: Set.H:667
Definition: ahFunction.H:145
iterator()
Constructor vacío; no tiene validez si no se asocia un conjunto.
Definition: Set.H:169
set & operator=(set &c)
Asigna todo el contenido de c a this.
Definition: Set.H:439
bool operator>=(const set &c) const
Definition: Set.H:357
bool operator<=(const set &c) const
Definition: Set.H:350
Node * search_rank_parent(Node *root, const typename Node::key_type &key, Compare &&cmp=Compare())
Definition: tpl_binNodeUtils.H:1921
size_t size_type
Tipo numérico para los tamaños (natural).
Definition: Set.H:64
set::value_type & reference
Tipo genérico de referencia a elemento del conjunto.
Definition: Set.H:58
#define COUNT(p)
Definition: tpl_binNodeXt.H:34
iterator begin()
Retorna un iterador posicionado al primer elemento del conjunto.
Definition: Set.H:459
void swap(set &c)
Definition: Set.H:453
Definition: ahIterator.H:8
iterator lower_bound(const T &value)
Definition: Set.H:410
size_type erase(const T &value)
Definition: Set.H:604
bool empty()
Retorna true si el contenedor esta vacío.
Definition: Set.H:278
const T & operator*()
Proporciona una referencia al elemento actual.
Definition: Set.H:175
bool operator>(const set &c) const
Definition: Set.H:343
std::pair< iterator, bool > insert(const T &value)
Definition: Set.H:488
T value_type
El tipo dato de los elementos del conjunto.
Definition: Set.H:52
iterator operator-=(const size_type &n)
Definition: Set.H:228
void destroyRec(Node *&root)
Definition: tpl_binNodeUtils.H:798
bool operator==(const set &c) const
Definition: Set.H:285
const set< T >::reference const_reference
Tipo referencia a elemento dentro del conjunto.
Definition: Set.H:166
bool operator!=(const iterator &_itor) const
Retorna true si los iterador tienen estados distintos.
Definition: Set.H:241
set()
Constructor vacío.
Definition: Set.H:258
iterator operator+=(const size_type &n)
Definition: Set.H:220
set(Itor beg, const Itor &end)
Definition: Set.H:524
size_type count(const T &value)
Definition: Set.H:373
Node * copyRec(Node *src_root)
Definition: tpl_binNodeUtils.H:821
set::value_type * pointer
Tipo genérico de puntero a elemento del conjunto.
Definition: Set.H:55
Definition: Set.H:39
void erase(iterator pos)
Definition: Set.H:629
set< T >::value_type value_type
El tipo de dato que contiene el conjunto.
Definition: Set.H:153
void insert(Itor beg, const Itor &end)
Definition: Set.H:585
iterator operator++()
Definition: Set.H:188
const set::value_type & const_reference
Tipo genérico de referencia constante a elemento del conjunto.
Definition: Set.H:61
Definition: Set.H:69
size_type size()
Retorna la cantidad de elementos que contiene el conjunto.
Definition: Set.H:275
#define KEY(p)
Definition: tpl_binNode.H:206
const T * operator->()
"Dereferencia" un puntero al elemento actual.
Definition: Set.H:181
iterator end()
Retorna un iterador posicionado al último elemento del conjunto.
Definition: Set.H:465
bool operator<(const set &c) const
Definition: Set.H:317
set< T >::value_type * pointer
Tipo apuntador a elemento dentro del conjunto.
Definition: Set.H:160
T key_type
El tipo dato de los elementos del conjunto.
Definition: Set.H:67
~set()
Definition: Set.H:269

Leandro Rabindranath León