Aleph-w  1.9
General library for algorithms and data structures
Set.H
1 
2 /* Aleph-w
3 
4  / \ | | ___ _ __ | |__ __ __
5  / _ \ | |/ _ \ '_ \| '_ \ ____\ \ /\ / / Data structures & Algorithms
6  / ___ \| | __/ |_) | | | |_____\ V V / version 1.9b
7  /_/ \_\_|\___| .__/|_| |_| \_/\_/ https://github.com/lrleon/Aleph-w
8  |_|
9 
10  This file is part of Aleph-w library
11 
12  Copyright (c) 2002-2018 Leandro Rabindranath Leon & Alejandro Mujica
13 
14  This program is free software: you can redistribute it and/or modify
15  it under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  This program is distributed in the hope that it will be useful, but
20  WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  General Public License for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27 /*
28  Aleph implementation of set C++ standard container
29 */
30 
31 # ifndef AH_SET_H
32 # define AH_SET_H
33 
34 # include <ah_stdc++_utils.H>
35 # include <tpl_treapRk.H>
36 # include <tpl_nodePool.H>
37 
38 namespace Aleph
39 {
40 
62  template <typename T,
63  class Compare = Aleph::less<T>,
64  template <class, class> class Tree = Treap_Rk>
65 class set
66 {
67 private:
68 
69  Tree<T, Compare> tree;
70 
71  typedef typename Tree<T, Compare>::Node Node;
72 
73  Node_Pool<Node> node_pool;
74 
75 public:
76 
78  typedef T value_type;
79 
81  typedef typename set::value_type * pointer;
82 
84  typedef typename set::value_type & reference;
85 
87  typedef const typename set::value_type & const_reference;
88 
90  typedef size_t size_type;
91 
93  typedef T key_type;
94 
95  class iterator
96  {
97  private:
98 
99  friend class set<T, Compare, Tree>;
100 
101  typedef typename Tree<T, Compare>::Iterator Iterator;
102 
103  const Tree<T, Compare> * tree;
104  Iterator itor;
105  bool underflow;
106  bool overflow;
107 
108  iterator(const Tree<T, Compare> & _tree, Node * node)
109  : tree (&_tree), itor (_tree, node), underflow (false), overflow (false)
110  {
111  /* empty */
112  }
113 
114  void init_flags ()
115  {
116  if (tree->size () == 0)
117  underflow = overflow = true;
118  else
119  underflow = overflow = false;
120  }
121 
122  iterator(const Tree<T, Compare> & _tree) : tree(&_tree), itor(_tree)
123  {
124  init_flags ();
125  }
126 
127  void goto_begin ()
128  {
129  itor.reset_first ();
130  init_flags ();
131  }
132 
133  void goto_last ()
134  {
135  itor.reset_last ();
136  init_flags ();
137  }
138 
139  void goto_end ()
140  {
141  itor.reset_last ();
142  init_flags ();
143  if (not overflow)
144  itor.next ();
145  overflow = true;
146  }
147 
148  void forward ()
149  {
150  if (underflow)
151  {
152  goto_begin ();
153  return;
154  }
155 
156  itor.next ();
157 
158  if (not itor.has_curr())
159  overflow = true;
160  }
161 
162  void backward ()
163  {
164  if (overflow)
165  {
166  goto_last ();
167  return;
168  }
169 
170  itor.prev ();
171 
172  if (not itor.has_curr())
173  underflow = true;
174  }
175 
176  public:
177 
179  typedef typename set<T>::value_type value_type;
180 
183  typedef typename set<T>::size_type difference_type;
184 
186  typedef typename set<T>::value_type * pointer;
187 
189  typedef typename set<T>::reference reference;
190 
192  typedef const typename set<T>::reference const_reference;
193 
195  iterator () : tree (nullptr), underflow (true), overflow (true)
196  {
197  /* empty */
198  }
199 
201  const T & operator * ()
202  {
203  return KEY (itor.get_curr () );
204  }
205 
207  const T * operator -> ()
208  {
209  return & KEY (itor.get_curr () );
210  }
211 
214  iterator operator ++ ()
215  {
216  forward ();
217  return *this;
218  }
219 
221  iterator operator ++ (int)
222  {
223  iterator return_value = *this;
224  forward ();
225  return return_value;
226  }
227 
230  iterator operator -- ()
231  {
232  backward ();
233  return *this;
234  }
235 
237  iterator operator -- (int)
238  {
239  iterator return_value = *this;
240  backward ();
241  return return_value;
242  }
243 
246  iterator operator += (const size_type & n)
247  {
248  itor.reset_to_pos(itor.get_current_position () + n);
249  return *this;
250  }
251 
254  iterator operator -= (const size_type & n)
255  {
256  itor.reset_to_pos(itor.get_current_position () - n);
257  return *this;
258  }
259 
261  bool operator == (const iterator & _itor) const
262  {
263  return itor == _itor.itor;
264  }
265 
267  bool operator != (const iterator & _itor) const
268  {
269  return not (itor == _itor.itor);
270  }
271 
272  bool verify (const set & _set) const
273  {
274  return itor.verify ( (Tree<T, Compare>*) &_set.tree);
275  }
276 
277  bool verify (const iterator & it) const
278  {
279  return itor.verify (it.itor);
280  }
281  };
282 
284  set () : node_pool(100) { /* empty */ }
285 
287  set (const set & c) : set()
288  {
289  void * ptr = c.tree.getRoot();
290  tree.getRoot () = copyRec ((Node*) ptr);
291  }
292 
295  ~set ()
296  {
297  destroyRec(tree.getRoot () );
298  }
299 
301  size_type size () const { return COUNT(tree.getRoot()); }
302 
304  bool empty () const { return size() == 0; }
305 
308  bool operator == (const set & c) const
309  {
310  if (this == &c)
311  return true;
312 
313  if (size () != c.size () )
314  return false;
315 
316  typename Tree<T, Compare>::Iterator it1 (tree), it2 (c.tree);
317 
318  while (it1.has_current () and it2.has_current () )
319  {
320  if (Aleph::no_equals<T, Compare> (KEY(it1.get_curr()),
321  KEY(it2.get_curr())))
322  return false;
323 
324  it1.next ();
325  it2.next ();
326  }
327 
328  return true;
329  }
330 
333  bool operator != (const set & c) const
334  {
335  return not (*this == c);
336  }
337 
340  bool operator < (const set & c) const
341  {
342  if (this == &c)
343  return false;
344 
345  typename Tree<T, Compare>::Iterator itor1 (tree), itor2 (c.tree);
346 
347  while (itor1.has_current () and itor2.has_current () )
348  {
349  if (Compare () (KEY(itor1.get_curr()), KEY(itor2.get_curr())))
350  return true;
351  else if (Compare () (KEY(itor2.get_curr()), KEY(itor1.get_curr())))
352  return false;
353 
354  itor1.next ();
355  itor2.next ();
356  }
357 
358  if (itor1.has_current () ) /* |*this| >= |c| */
359  return false;
360 
361  return itor2.has_current ();
362  }
363 
366  bool operator > (const set & c) const
367  {
368  return not (*this == c or *this < c);
369  }
370 
373  bool operator <= (const set & c) const
374  {
375  return not (*this > c );
376  }
377 
380  bool operator >= (const set & c) const
381  {
382  return not (*this < c);
383  }
384 
396  size_type count (const T & value) const
397  {
398  if (tree.search (value) == nullptr)
399  return 0;
400 
401  return 1;
402  }
403 
417  iterator find(const T & value) const
418  {
419  Node * node = tree.search (value);
420 
421  if (node == nullptr)
422  return end();
423 
424  iterator itor (tree);
425  itor.itor.reset_to_node (node);
426 
427  return itor;
428  }
429 
433  iterator lower_bound(const T & value) const
434  {
435  if (size() == 0)
436  return end ();
437 
438  Node * p = search_rank_parent(tree.getRoot(), value);
439 
440  return iterator (tree, p);
441  }
442 
446  iterator upper_bound(const T & value) const
447  {
448  if (size () == 0)
449  return end ();
450 
451  Node * p = search_rank_parent(tree.getRoot(), value);
452 
453  iterator upper(tree, p);
454 
455  if (KEY(p) == value)
456  upper.itor.next();
457 
458  return upper;
459  }
460 
462  set & operator = (set & c)
463  {
464  if (this == &c)
465  return *this;
466 
467  destroyRec (tree.getRoot () );
468 
469  tree.getRoot () = copyRec (c.tree.getRoot () );
470 
471  return *this;
472  }
473 
476  void swap (set & c)
477  {
478  std::swap (tree.getRoot (), c.tree.getRoot () );
479  }
480 
482  iterator begin () const
483  {
484  return iterator (tree);
485  }
486 
488  iterator end () const
489  {
490  iterator last (tree);
491  last.goto_end ();
492 
493  return last;
494  }
495 
511  std::pair<iterator, bool> insert (const T & value)
512  {
513  Node * p = node_pool.allocate(value);
514 
515  iterator itor (tree);
516 
517  if (tree.search_or_insert(p) != p) // se inserta o ya está en el conjunto?
518  { // value ya está dentro del conjunto
519  node_pool.deallocate(p);
520  itor.itor.reset_to_key (value);
521 
522  return std::pair<iterator, bool> (itor, false);
523  }
524 
525  itor.itor.reset_to_node(p);
526 
527  return std::pair<iterator, bool> (itor, true);
528  }
529 
530 
546  template <typename Itor>
547  set (Itor beg, const Itor & end) : set()
548  {
549  Aleph::verify_iterators (beg, end);
550 
551  while (beg != end)
552  insert(*beg++) ;
553  }
554 
573  iterator insert (const iterator & /* pos */, const T & value)
574  {
575  Node * p = node_pool.allocate(value);
576 
577  iterator _itor(tree);
578 
579  if (tree.search_or_insert(p) != p)
580  { // clave duplicada
581  node_pool.deallocate(p);
582  _itor.itor.reset_to_key(value);
583  }
584  else
585  _itor.itor.reset_to_node(p);
586 
587  return _itor;
588  }
589 
607  template <typename Itor>
608  void insert (Itor beg, const Itor & end)
609  {
610  Aleph::verify_iterators (beg, end);
611 
612  while (beg != end)
613  insert(*beg++);
614  }
615 
627  size_type erase (const T & value)
628  {
629  Node * p = tree.remove (value);
630 
631  if (p == nullptr)
632  return 0;
633 
634  node_pool.deallocate(p);
635 
636  return 1;
637  }
638 
652  void erase (iterator pos)
653  {
654  Aleph::verify_container_and_iterator (*this, pos);
655 
656  node_pool.deallocate(pos.itor.del());
657  }
658 
672  iterator erase (const iterator & beg, const iterator & end)
673  {
674  Aleph::verify_container_and_iterator (*this, beg);
675  Aleph::verify_iterators (beg, end);
676 
677  iterator ret_val = end;
678 
679  const size_t pos_beg = beg.itor.get_current_position ();
680  const size_t pos_end = end.itor.get_current_position ();
681 
682  Node * removed_tree = tree.remove(pos_beg, pos_end - 1);
683 
684  destroyRec(removed_tree);
685 
686  return ret_val;
687  }
688 
690  void clear ()
691  {
692  destroyRec(tree.getRoot());
693  }
694 };
695 
696 
709  template <typename T>
710 typename iterator_traits<typename set<T>::iterator>::difference_type
711 distance(typename set<T>::iterator it1, typename set<T>::iterator it2)
712 {
713  Aleph::verify_iterators(it1, it2);
714 
715  return it2.itor.get_current_position() - it1.itor.get_current_position();
716 }
717 
718 }
719 
720 # endif // AH_SET_H
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
Definition: ah-comb.H:35
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
Definition: Set.H:65
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

Leandro Rabindranath León