Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
List.H
1 
2 /*
3  Aleph implementation of list C++ standard container
4 */
5 
6 # ifndef ALEPH_LIST_H
7 # define ALEPH_LIST_H
8 
9 # include <ah_stdc++_utils.H>
10 # include <tpl_sort_utils.H>
11 
12 namespace Aleph
13 {
14 
22  template <class T>
23 class list
24 {
25  mutable Dnode<T> dlist;
26 
27  typedef Dnode<T> Node;
28 
29 public:
30 
32  typedef T value_type;
33 
35  typedef typename list::value_type & reference;
36 
38  typedef const typename list::value_type & const_reference;
39 
41  typedef size_t size_type;
42 
43 private:
44 
45  mutable size_type num_elem;
46 
47  mutable bool num_elem_is_updated;
48 
49  void reset_num_elem(const size_type & num = 0)
50  {
51  num_elem = num;
52  num_elem_is_updated = true;
53  }
54 
55  void update_num_elem()
56  {
57  I(not num_elem_is_updated);
58 
59  size_type counter = 0;
60 
61  for (typename Dnode<T>::Iterator it(dlist); it.has_current(); it.next())
62  ++counter;
63 
64  num_elem = counter;
65  num_elem_is_updated = true;
66  }
67 
68 public:
69 
75  class iterator
76  {
77  friend class list<T>;
78 
79  typedef typename Dnode<T>::Iterator Iterator;
80 
81  Iterator itor;
82 
83  bool underflow;
84  bool overflow;
85 
86  void init_flags()
87  {
88  if (itor.has_current())
89  underflow = overflow = false;
90  else
91  underflow = overflow = true;
92  }
93 
94  iterator(Dnode<T> & __list) : itor(__list)
95  {
96  init_flags();
97  }
98 
99  void goto_begin()
100  {
101  itor.reset_first();
102  init_flags();
103  }
104 
105  void goto_last()
106  {
107  itor.reset_last();
108  init_flags();
109  }
110 
111  void goto_end()
112  {
113  itor.reset_last();
114  init_flags();
115  if (not overflow)
116  itor.next();
117  overflow = true;
118  }
119 
120  void forward()
121  {
122  if (underflow)
123  {
124  goto_begin();
125  return;
126  }
127 
128  itor.next();
129 
130  if (not itor.has_current())
131  overflow = true;
132  }
133 
134  void backward()
135  {
136  if (overflow)
137  {
138  goto_last();
139  return;
140  }
141 
142  itor.prev();
143 
144  if (not itor.has_current())
145  underflow = true;
146  }
147 
148  public:
149 
151  typedef typename list::value_type value_type;
152 
155  typedef int difference_type;
156 
158  typedef typename list::value_type * pointer;
159 
161  typedef typename list::reference reference;
162 
164  iterator() : underflow(false), overflow(false) { /* empty */ }
165 
168  {
169  return itor.get_current()->get_data();
170  }
171 
174  {
175  return & itor.get_current()->get_data();
176  }
177 
181  {
182  forward();
183  return *this;
184  }
185 
189  {
190  iterator return_value = *this;
191  forward();
192  return return_value;
193  }
194 
198  {
199  backward();
200  return *this;
201  }
202 
206  {
207  iterator return_value = *this;
208  backward();
209  return return_value;
210  }
211 
214  {
215  for (int i = 0; i < n; ++i)
216  forward();
217 
218  return *this;
219  }
220 
223  {
224  for (int i = 0; i < n; ++i)
225  backward();
226 
227  return *this;
228  }
229 
231  bool operator == (const iterator & __itor)
232  {
233  return itor == __itor.itor;
234  }
235 
237  bool operator != (const iterator& __itor)
238  {
239  return itor != __itor.itor;
240  }
241 
242  bool verify (const list<T> & list) const
243  {
244  return itor.verify((Dlink*)(&list.dlist));
245  }
246 
247  bool verify(const iterator & it) const
248  {
249  return itor.verify(it.itor);
250  }
251  }; // end class iterator
252 
253 private:
254 
255  void copy(const list& _list)
256  {
257  I(dlist.is_empty());
258  I(num_elem == 0);
259 
260  for (typename Dnode<T>::Iterator it(_list.dlist);
261  it.has_current(); it.next())
262  {
263  Node * node = new Node(it.get_current()->get_data());
264 
265  dlist.append(node);
266  ++num_elem;
267  }
268  }
269 
270 public:
271 
273  list() : num_elem(0), num_elem_is_updated(true) { /* empty */ }
274 
276  list(const list & c) : num_elem(0), num_elem_is_updated(true)
277  {
278  copy(c);
279  }
280 
283  list(const size_type & num) : num_elem(0), num_elem_is_updated(true)
284  {
285  for (/* nothing */; num_elem < num; ++num_elem)
286  dlist.append(new Node);
287  }
288 
300  list(const size_type & num, const T & value)
301  : num_elem(0), num_elem_is_updated(true)
302  {
303  for (/* nothing */; num_elem < num; ++num_elem)
304  dlist.append(new Node(value));
305  }
306 
321  template <class Itor>
322  list(Itor beg, const Itor & end)
323  : num_elem(0), num_elem_is_updated(true)
324  {
325  Aleph::verify_iterators(beg, end);
326 
327  while (beg != end)
328  {
329  dlist.append(new Node(*beg++));
330  ++num_elem;
331  }
332  }
333 
334  ~list()
335  {
336  clear();
337  }
338 
341  {
342  if (not num_elem_is_updated)
343  update_num_elem();
344 
345  return num_elem;
346  }
347 
349  bool empty() const
350  {
351  return dlist.is_empty();
352  }
353 
356  bool operator == (const list & c) const
357  {
358  if (this == &c)
359  return true;
360 
361  if (num_elem_is_updated and c.num_elem_is_updated)
362  if (num_elem != c.num_elem)
363  return false;
364 
365  typename Dnode<T>::Iterator it_l(*this), it_r(c.dlist);
366 
367  while (it_l.has_current() and it_r.has_current())
368  {
369  if (it_l.get_current()->get_data() != it_r.get_current()->get_data())
370  return false;
371 
372  it_l.next();
373  it_r.next();
374  }
375 
376  if (it_l.is_empty() and it_r.is_empty())
377  return true;
378 
379  return false;
380  }
381 
384  bool operator != (const list & c) const
385  {
386  return not (*this == c);
387  }
388 
391  bool operator < (const list & c) const
392  {
393  if (this == &c)
394  return false;
395 
396  typename Dnode<T>::Iterator it_l(*this);
397  typename Dnode<T>::Iterator it_r(c);
398 
399  while (it_l.has_current() and it_r.has_current())
400  {
401  if (it_l.get_current()->get_data() < it_r.get_current()->get_data())
402  return true;
403  else if (it_r.get_current()->get_data() <
404  it_l.get_current()->get_data())
405  return false; // no son iguales
406 
407  it_l.next();
408  it_r.next();
409  }
410 
411  return it_l.is_empty();
412  }
413 
416  bool operator > (const list & c) const
417  {
418  return c < *this;
419  }
420 
423  bool operator <= (const list & c) const
424  {
425  return not (c > *this );
426  }
427 
430  bool operator >= (const list & c) const
431  {
432  return not (*this < c);
433  }
434 
437  list & operator = (const list & c)
438  {
439  if (this == &c)
440  return *this;
441 
442  clear();
443  copy(c);
444  }
445 
455  void assign(const size_type & num, const T & value)
456  {
457  clear();
458 
459  for (int n = 0; n < num; ++n)
460  push_back(value);
461  }
462 
473  template <typename Itor>
474  void assign (Itor beg, const Itor & end)
475  {
476  Aleph::verify_iterators(beg, end);
477 
478  clear();
479 
480  while (beg != end)
481  push_back(*beg++);
482  }
483 
486  void swap(list & c)
487  {
488  dlist.swap(&c.dlist);
489  std::swap(num_elem, c.num_elem);
490  std::swap(num_elem_is_updated, c.num_elem_is_updated);
491  }
492 
494  reference front() const
495  {
496  return dlist.get_next()->get_data();
497  }
498 
500  reference back() const
501  {
502  return dlist.get_prev()->get_data();
503  }
504 
507  iterator begin() const
508  {
509  return iterator(dlist);
510  }
511 
514  iterator end() const
515  {
516  iterator _itor(dlist);
517  _itor.goto_end();
518 
519  return _itor;
520  }
521 
525  iterator insert(const iterator & pos, const T & value)
526  {
527  Aleph::verify_container_and_iterator(*this, pos);
528 
529  Node * new_node = new Node(value);
530 
531  Node * current_node = pos.itor.get_current();
532 
533  current_node->append(new_node);
534 
535  pos.itor.set(new_node);
536 
537  ++num_elem;
538 
539  return pos;
540  }
541 
544  void insert(iterator pos, const size_type & num, const T & value)
545  {
546  Aleph::verify_container_and_iterator(*this, pos);
547 
548  Node new_list;
549 
550  try
551  {
552  for (int i = 0; i < num; ++i)
553  new_list.append (new Node(value));
554 
555  Node * current_node = pos.itor.get_current();
556  current_node->insert_list(&new_list);
557  num_elem += num;
558  }
559  catch (...)
560  {
561  new_list.remove_all_and_delete();
562  throw;
563  }
564  }
565 
568  template <class Itor>
569  void insert(iterator pos, Itor beg, const Itor & end)
570  {
571  Aleph::verify_container_and_iterator(*this, pos);
572  Aleph::verify_iterators(beg, end);
573 
574  Node new_list;
575  try
576  {
577  while (beg != end)
578  {
579  new_list.append(new Node(*beg++));
580  ++num_elem;
581  }
582 
583  Node * current_node = pos.itor.get_current();
584  current_node->insert_list(&new_list);
585  }
586  catch (...)
587  {
588  new_list.remove_all_and_delete();
589  throw;
590  }
591  }
592 
594  void push_front(const T & value)
595  {
596  dlist.insert(new Node(value));
597  ++num_elem;
598  }
599 
600  void push_back(const T & value)
601  {
602  dlist.append(new Node(value));
603  ++num_elem;
604  }
605 
607  void remove(const T & value)
608  {
609  for (typename Dnode<T>::Iterator it(dlist); it.has_current(); /* nothing */)
610  if (it.get_current()->get_data() == value)
611  {
612  delete it.del();
613  --num_elem;
614  }
615  else
616  it.next();
617  }
618 
621  {
622  Aleph::verify_container_and_iterator(*this, pos);
623 
624  delete pos.itor.del();
625  --num_elem;
626 
627  return pos;
628  }
629 
634  {
635  Aleph::verify_container_and_iterator(*this, beg);
636  Aleph::verify_iterators(beg, end);
637 
638  while (beg != end)
639  {
640  delete beg.itor.del();
641  --num_elem;
642  }
643 
644  return beg;
645  }
646 
648  void pop_front()
649  {
650  delete dlist.remove_next();
651  num_elem--;
652  }
653 
655  void pop_back()
656  {
657  delete dlist.remove_prev();
658  --num_elem;
659  }
660 
662  void clear()
663  {
664  dlist.remove_all_and_delete();
665  reset_num_elem();
666  }
667 
686  void resize(size_type num, const T & t = T())
687  {
688  if (num == size())
689  return;
690 
691  if (num < num_elem)
692  {
693  while (num_elem > num)
694  {
695  delete dlist.remove_prev();
696  --num_elem;
697  }
698 
699  return;
700  }
701 
702  iterator itor(end());
703  --itor;
704  insert(itor, num - num_elem, t);
705  }
706 
709  template <class Op>
710  void unique(const Op & op)
711  {
712  reset_num_elem(); // recordar que coloca num_elem = 0
713 
714  for (typename Dnode<T>::Iterator it1(dlist); it1.has_current();
715  it1.next(), ++num_elem)
716  {
717  typename Dnode<T>::Iterator it2(it1); it2.next();
718 
719  while (it2.has_current())
720  if (op(it1.get_current()->get_data(), it2.get_current()->get_data()))
721  delete it2.del();
722  else
723  break;
724  }
725  }
726 
728  void unique()
729  {
731  }
732 
745  void splice(iterator pos, list & l)
746  {
747  Aleph::verify_container_and_iterator(*this, pos);
748 
749  pos.itor.get_current()->insert_list(&l.dlist);
750 
751  num_elem_is_updated = l.num_elem_is_updated;
752  num_elem += l.num_elem;
753 
754  l.reset_num_elem();
755 
756  I(l.dlist.is_empty());
757  }
758 
772  void splice(iterator pos, list & src_list, iterator src_pos)
773  {
774  Aleph::verify_container_and_iterator(*this, pos);
775  Aleph::verify_container_and_iterator(src_list, src_pos);
776 
777  pos.itor.get_current()->insert(src_pos.itor.del());
778  --src_list.num_elem;
779  ++num_elem;
780  }
781 
784  void splice(iterator pos, list & src_list,
785  iterator src_beg, const iterator & src_end)
786  {
787  Aleph::verify_container_and_iterator(*this, pos);
788  Aleph::verify_container_and_iterator(src_list, src_beg);
789  Aleph::verify_iterators(src_beg, src_end);
790 
791  Dlink list_to_insert;
792  src_list.dlist.cut_list(src_beg.itor.get_current(), &list_to_insert);
793 
794  Dlink remaining_list;
795  list_to_insert.cut_list(src_end.itor.get_current(), &remaining_list);
796 
797  pos.itor.get_current()->insert_list(&list_to_insert);
798  num_elem_is_updated = false;
799 
800  src_list.dlist.concat_list(&remaining_list);
801  src_list.num_elem_is_updated = false;
802  }
803 
805  template <class Cmp>
806  void sort(const Cmp &)
807  {
808  quicksort<T, Cmp>(dlist);
809  }
810 
812  void sort()
813  {
814  sort(Aleph::less<T>());
815  }
816 
818  template <class Cmp>
819  void merge(list & l, const Cmp &)
820  {
821  Dnode<T> result;
822 
823  Aleph::merge_lists<T, Cmp>(dlist, l.dlist, result);
824 
825  dlist.swap(&result);
826 
827  num_elem += l.num_elem;
828 
829  l.reset_num_elem();
830 
831  I(l.dlist.is_empty());
832  }
833 
835  void merge(list & l)
836  {
837  merge(l, Aleph::less<T>());
838  }
839 
841  void reverse()
842  {
843  reset_num_elem(dlist.reverse_list());
844  }
845 };
846 
847 
848  template <typename T>
849 typename list<T>::size_type distance(typename list<T>::iterator it1,
850  typename list<T>::iterator it2)
851 {
852  typename list<T>::size_type counter = 0;
853 
854  while (it1 != it2)
855  {
856  counter++;
857  it1++;
858  }
859 
860  return counter;
861 }
862 
863 } // end namespace Aleph
864 
865 # endif // ALEPH_LIST_H
void merge(list &l)
Mezcla dos listas ordenadas.
Definition: List.H:835
bool operator==(const iterator &__itor)
Retorna true si los iteradores son iguales.
Definition: List.H:231
Definition: List.H:75
T & operator*()
Proporciona una referencia al elemento actual de iterador.
Definition: List.H:167
bool operator==(const list &c) const
Definition: List.H:356
Definition: ahFunction.H:145
reference back() const
Retorna una referencia al último elemento de la lista.
Definition: List.H:500
size_type size()
Retorna la cantidad de elementos que tiene la lista.
Definition: List.H:340
reference front() const
Retorna una referencia al primer elemento de la lista.
Definition: List.H:494
list(const size_type &num)
Definition: List.H:283
const list::value_type & const_reference
Tipo referencia constante a elemento dentro de la lista.
Definition: List.H:38
list::value_type & reference
Tipo referencia a elemento dentro de la lista.
Definition: List.H:35
void pop_back()
Elimina de la lista el último elemento.
Definition: List.H:655
bool operator>(const list &c) const
Definition: List.H:416
void reverse()
Invierte la lista.
Definition: List.H:841
void push_front(const T &value)
Inserta al principio de la lista el valor value.
Definition: List.H:594
T value_type
El tipo de dato que maneja la lista.
Definition: List.H:32
list::value_type * pointer
Tipo puntero a elemento dentro de la lista.
Definition: List.H:158
void swap(list &c)
Definition: List.H:486
size_t size_type
Tipo numérico para el tamaño de la lista.
Definition: List.H:41
void splice(iterator pos, list &l)
Definition: List.H:745
bool operator>=(const list &c) const
Definition: List.H:430
list(const list &c)
Instancia una lista copia de c.
Definition: List.H:276
T * operator->()
Dereferencia el elemento actual del iterador.
Definition: List.H:173
void merge(list &l, const Cmp &)
Mezcla dos listas ordenadas según criterio de comparación Cmp.
Definition: List.H:819
list & operator=(const list &c)
Definition: List.H:437
iterator begin() const
Definition: List.H:507
iterator operator--()
Definition: List.H:197
bool operator<(const list &c) const
Definition: List.H:391
bool operator!=(const iterator &__itor)
Retorna true si los iteradores son distintos.
Definition: List.H:237
list()
Instancia una lista vacía.
Definition: List.H:273
bool operator<=(const list &c) const
Definition: List.H:423
iterator operator+=(const size_type &n)
Avanza el iterador n posiciones.
Definition: List.H:213
bool operator!=(const list &c) const
Definition: List.H:384
iterator operator++()
Definition: List.H:180
list::value_type value_type
Tipo de dato que almacena lista.
Definition: List.H:151
list::reference reference
Tipo referencia a elemento dentro de la lista.
Definition: List.H:161
void unique(const Op &op)
Definition: List.H:710
void unique()
Elimina de la lista todos los elementos duplicados consecutivos.
Definition: List.H:728
void sort()
Ordena la lista.
Definition: List.H:812
Dnode * del()
Definition: tpl_dnode.H:193
void splice(iterator pos, list &src_list, iterator src_pos)
Definition: List.H:772
Definition: tpl_dnode.H:148
void assign(Itor beg, const Itor &end)
Definition: List.H:474
iterator erase(iterator beg, const iterator &end)
Definition: List.H:633
Dnode< T > * get_current() const
retorna puntero al nodo actual
Definition: tpl_dnode.H:181
iterator operator-=(const size_type &n)
Retrocede el iterador n posiciones.
Definition: List.H:222
void sort(const Cmp &)
Ordena la lista según criterio de comparación Cmp.
Definition: List.H:806
void insert(iterator pos, const size_type &num, const T &value)
Definition: List.H:544
int difference_type
Definition: List.H:155
iterator insert(const iterator &pos, const T &value)
Definition: List.H:525
void resize(size_type num, const T &t=T())
Definition: List.H:686
void insert(iterator pos, Itor beg, const Itor &end)
Definition: List.H:569
list(Itor beg, const Itor &end)
Definition: List.H:322
Definition: ahFunction.H:115
void splice(iterator pos, list &src_list, iterator src_beg, const iterator &src_end)
Definition: List.H:784
bool empty() const
Retorna true si la lista está vacía.
Definition: List.H:349
void pop_front()
Elimina de la lista el primer elemento.
Definition: List.H:648
Definition: List.H:23
iterator erase(iterator pos)
Elimina el elemento posicionado por el iterador pos.
Definition: List.H:620
void assign(const size_type &num, const T &value)
Definition: List.H:455
iterator end() const
Definition: List.H:514
list(const size_type &num, const T &value)
Definition: List.H:300
iterator()
Instancia un iterador vacío (no asociado a una lista).
Definition: List.H:164
void clear()
Elimina todos los elementos de la lista.
Definition: List.H:662
Nodo perteneciente a lista doblemente enlazada circular.
Definition: tpl_dnode.H:19

Leandro Rabindranath León