Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
Vector.H
1 
2 /*
3  Aleph implementation of vector C++ standard container
4 */
5 
6 # ifndef ALEPH_VECTOR_H
7 # define ALEPH_VECTOR_H
8 
9 # include <tpl_dynArray.H>
10 # include <ahIterator.H>
11 # include <ah_stdc++_utils.H>
12 
13 namespace Aleph
14 {
15 
16 template <class T> class vector;
17 
18  template <typename T>
19 typename iterator_traits<typename vector<T>::iterator>::difference_type
20 distance(typename vector<T>::iterator, typename vector<T>::iterator);
21 
45  template <typename T>
46 class vector
47 {
48 public:
49 
51  typedef T value_type;
52 
54  typedef typename vector::value_type & reference;
55 
57  typedef const typename vector::value_type & const_reference;
58 
60  typedef size_t size_type;
61 
62 private:
63 
64  mutable DynArray<T> array;
65 
66  mutable size_type num_elem;
67 
68 public:
69 
74  class iterator
75  {
76  friend class vector<T>;
77 
78  static const int Invalid_Position = -1;
79 
80  mutable DynArray<T> * dyn_array_ptr;
81 
82  mutable size_type current_position;
83 
84  T cookie_data;
85 
86  iterator(const vector<T> & vec, const size_t & pos = 0)
87  : dyn_array_ptr(&vec.array), current_position(pos)
88  {
89  /* empty */
90  }
91 
92  void set_pos(const size_t &)
93  {
94  current_position = this->num_elem;
95  }
96 
97  int get_position() const { return current_position; }
98 
99  DynArray<T> * get_dyn_array_ptr() { return dyn_array_ptr; }
100 
101  T & access(const size_type & i)
102  {
103  if (i >= dyn_array_ptr->size())
104  return cookie_data;
105 
106  return dyn_array_ptr->access(i);
107  }
108 
109  public:
110 
113 
116  typedef int difference_type;
117 
119  typedef typename vector<T>::value_type * pointer;
120 
122  typedef typename vector<T>::reference reference;
123 
125  iterator() : dyn_array_ptr(NULL), current_position(Invalid_Position)
126  {
127  /* empty */
128  }
129 
131  iterator(const iterator & itor)
132  : dyn_array_ptr(itor.dyn_array_ptr),
133  current_position(itor.current_position)
134  {
135  /* empty */
136  }
137 
139  iterator & operator = (const iterator & itor)
140  {
141  if (&itor == this)
142  return *this;
143 
144  dyn_array_ptr = itor.dyn_array_ptr;
145  current_position = itor.current_position;
146 
147  return *this;
148  }
149 
151  T & operator [] (const size_type & index)
152  {
153  current_position = index;
154 
155  return access(index);
156  }
157 
160  iterator & operator = (const T & key)
161  {
162  access(current_position) = key;
163 
164  return *this;
165  }
166 
169  {
170  return dyn_array_ptr->access(current_position);
171  }
172 
175  {
176  return & dyn_array_ptr->access(current_position);
177  }
178 
182  {
183  current_position++;
184  return *this;
185  }
186 
190  {
191  iterator return_value = *this;
192  current_position++;
193  return return_value;
194  }
195 
199  {
200  current_position--;
201  return *this;
202  }
203 
207  {
208  iterator return_value = *this;
209  current_position--;
210  return return_value;
211  }
212 
215  {
216  current_position += n;
217  return *this;
218  }
219 
222  {
223  current_position -= n;
224  return *this;
225  }
226 
229  bool operator < (const iterator & itor) const
230  {
231  return current_position < itor.current_position;
232  }
233 
236  bool operator <= (const iterator & itor) const
237  {
238  return current_position <= itor.current_position;
239  }
240 
243  bool operator > (const iterator & itor) const
244  {
245  return current_position > itor.current_position;
246  }
247 
250  bool operator >= (const iterator& itor) const
251  {
252  return current_position >= itor.current_position;
253  }
254 
257  bool operator == (const iterator & itor) const
258  {
259  return current_position == itor.current_position;
260  }
261 
264  bool operator != (const iterator & itor) const
265  {
266  return current_position != itor.current_position;
267  }
268 
271  int operator - (const iterator & itor) const
272  {
273  return current_position - itor.current_position;
274  }
275 
278  iterator operator + (const int & n) const
279  {
280  iterator ret_val(*this);
281 
282  ret_val.current_position += n;
283 
284  return ret_val;
285  }
286 
287  bool verify(const DynArray<T> & array) const
288  {
289  return &array == dyn_array_ptr;
290  }
291 
292  bool verify(const iterator & it) const
293  {
294  return dyn_array_ptr == it.dyn_array_ptr;
295  }
296  };
297 
299  vector() : array(0), num_elem(0) { /* empty */ }
300 
302  vector (const vector & c) : array(c.array), num_elem(c.num_elem)
303  {
304  // empty
305  }
306 
308  vector (const size_type & num) : array(num), num_elem(num)
309  {
310  array.reserve(0, num_elem - 1);
311  }
312 
315  template <typename Itor> explicit
316  vector (Itor beg, const Itor & end) : array(0), num_elem(0)
317  {
318  Aleph::verify_iterators(beg, end);
319 
320  while (beg != end)
321  array[num_elem++] = *beg++;
322 
323  I(num_elem == array.size());
324  }
325 
327  vector (const size_type & num, const T & value) : array(num), num_elem(num)
328  {
329  array.reserve(0, num_elem - 1);
330 
331  for(size_type i = 0; i < num; i++)
332  array.access(i) = value;
333  }
334 
335  ~vector() { /* empty */ }
336 
338  const size_type & size() const { return num_elem; }
339 
341  bool empty() const { return num_elem == 0; }
342 
344  size_type max_size() const { return array.max_size(); }
345 
347  size_type capacity() const { return array.size(); }
348 
350  void reserve (const size_type & num)
351  {
352  if (num < array.size())
353  return;
354 
355  array.reserve(array.size(), array.size() + num);
356  }
357 
359  void resize (const size_type & num)
360  {
361  if (num < array.size())
362  {
363  num_elem = num;
364  return;
365  }
366 
367  reserve(num - array.size());
368  }
369 
372  void resize (const size_type & num, const T & value)
373  {
374  if (num < array.size())
375  {
376  num_elem = num;
377  return;
378  }
379 
380  reserve(num - array.size());
381 
382  for (/* nothing */; num_elem < num; num_elem++)
383  array.access(num_elem) = value;
384  }
385 
387  vector & operator = (const vector & c)
388  {
389  if (this == &c)
390  return *this;
391 
392  array = c.array;
393  num_elem = c.num_elem;
394 
395  return *this;
396  }
397 
399  void assign (const size_type & num, const T & value)
400  {
401  if (num > array.size())
402  array.reserve(0, num - 1);
403 
404  num_elem = num;
405 
406  for(size_type i = 0; i < num; i++)
407  array.access(i) = value;
408  }
409 
412  template <typename Itor>
413  void assign (Itor beg, const Itor & end)
414  {
415  Aleph::verify_iterators(beg, end);
416 
417  num_elem = 0;
418  while (beg < end)
419  array[num_elem++] = *beg++;
420  }
421 
424  void swap(vector & c)
425  {
426  std::swap(num_elem, c.num_elem);
427  array.swap(c.array);
428  }
429 
431  reference at(const size_type & idx)
432  {
433  return array[idx];
434  }
435 
438  const_reference at(const size_type & idx) const
439  {
440  return array[idx];
441  }
442 
445  {
446  return array.access(idx);
447  }
448 
451  {
452  return array.access(idx);
453  }
454 
457  reference front() const
458  {
459  return array.access(0);
460  }
461 
464  reference back() const
465  {
466  return array.access(num_elem - 1);
467  }
468 
471  iterator begin() const
472  {
473  return iterator (*this);
474  }
475 
478  iterator end() const
479  {
480  return iterator (*this, num_elem);
481  }
482 
483 private:
484 
485  void open_gap(const size_t & position, const size_type & gap_len = 1)
486  {
487  const size_type old_size = array.size();
488  array.reserve(old_size, old_size + gap_len - 1);
489 
490  if (position >= old_size)
491  return;
492 
493  const size_t final_pos = position + gap_len;
494  for (int i = array.size() - 1; i > final_pos; i--)
495  array.access(i) = array.access(i - gap_len);
496  }
497 
498 public:
499 
501  iterator insert(const iterator & pos, const T & value)
502  {
503  Aleph::verify_container_and_iterator(array, pos);
504 
505  open_gap(pos.get_position());
506 
507  array.access(pos.get_position()) = value;
508 
509  num_elem++;
510 
511  return pos;
512  }
513 
516  void insert(iterator pos, const size_type & len, const T & value)
517  {
518  Aleph::verify_container_and_iterator(array, pos);
519 
520  open_gap(pos.get_position(), len);
521 
522  for (int i = 0; i < len; i++, pos++, num_elem++)
523  array.access(i) = value;
524  }
525 
528  template <class Itor>
529  void insert(const iterator & pos, Itor beg, const Itor & end)
530  {
531  Aleph::verify_container_and_iterators(array, pos, beg, end);
532 
533  size_type gap_len = Aleph::distance<T>(beg, end);
534 
535  open_gap(pos.get_position(), gap_len);
536 
537  num_elem += gap_len;
538 
539  for (int i = pos.get_position(); gap_len > 0; i++, gap_len--)
540  array.access(i) = *beg++;
541  }
542 
544  void push_back (const T & value)
545  {
546  array[num_elem] = value;
547  num_elem++;
548  }
549 
550 private:
551 
552  void close_gap(const size_t & position, const size_type & len = 1)
553  {
554  for (int i = position; i < num_elem - len; i++)
555  array.access(i) = array.access(i + len);
556 
557  num_elem -= len;
558  }
559 
560 public:
561 
563  iterator erase (const iterator & pos)
564  {
565  Aleph::verify_container_and_iterator(array, pos);
566 
567  close_gap(pos.get_position());
568 
569  return iterator(*this, pos.get_position());
570  }
571 
575  iterator erase (const iterator & beg, const iterator & end)
576  {
577  Aleph::verify_container_and_iterators(array, beg, end);
578 
579  const size_t gap_last =
580  end.get_position() <= num_elem ? end.get_position() : num_elem;
581  const size_t gap_start = beg.get_position();
582  const size_t gap_len = gap_last - gap_start;
583 
584  if (gap_start > gap_last)
585  return iterator(*this, num_elem);
586 
587  close_gap(gap_start, gap_len);
588 
589  return iterator(*this, gap_start);
590  }
591 
593  void pop_back() { num_elem--; }
594 
596  void clear() { num_elem = 0; }
597 
600  bool operator == (const vector & r) const
601  {
602  if (this == &r)
603  return true;
604 
605  if (num_elem != r.num_elem)
606  return false;
607 
608  const size_t len = std::min( num_elem, r.num_elem);
609 
610  for (size_t i = 0; i < len; i++)
611  if (array.access(i) != r.array.access(i))
612  return false;
613 
614  return true;
615  }
616 
618  bool operator != (const vector & r) const
619  {
620  return not (*this == r);
621  }
622 
625  bool operator < (const vector & r) const
626  {
627  if (this == &r)
628  return false;
629 
630  const bool l_smaller = num_elem < r.num_elem;
631 
632  const size_t len = l_smaller ? num_elem : r.num_elem;
633 
634  for (size_t i = 0; i < len; i++)
635  if (array.access(i) < r.array.access(i))
636  return true;
637  else if (r.array.access(i) < array.access(i))
638  return false; // ==> no son iguales
639 
640  return l_smaller;
641  }
642 
645  bool operator > (const vector & r) const
646  {
647  return r < *this;
648  }
649 
653  bool operator <= (const vector & r) const
654  {
655  return not (r > *this);
656  }
657 
661  bool operator >= (const vector & r) const
662  {
663  return not (*this < r);
664  }
665 };
666 
667 
668 
669  template <typename T>
670 typename iterator_traits<typename vector<T>::iterator>::difference_type
671 distance(typename vector<T>::iterator it1, typename vector<T>::iterator it2)
672 {
673  return it2 - it1;
674 }
675 
676 } // end namespace Aleph
677 
678 # endif // ALEPH_VECTOR_H
iterator operator+=(const size_type &n)
Avanza el iterador n posiciones hacia delante.
Definition: Vector.H:214
vector< T >::reference reference
Tipo referencia a un elemento dentro del vector.
Definition: Vector.H:122
iterator insert(const iterator &pos, const T &value)
Inserta value en la posición dada por el iterador pos.
Definition: Vector.H:501
vector(const vector &c)
Instancia un vector copia de v.
Definition: Vector.H:302
iterator erase(const iterator &pos)
Borra el elemento de la posición pos.
Definition: Vector.H:563
size_type max_size() const
Retorna la máxima dimensión que puede tener el vector.
Definition: Vector.H:344
T value_type
El tipo de dato que almacena el vector.
Definition: Vector.H:51
bool operator>(const iterator &itor) const
Definition: Vector.H:243
bool operator!=(const vector &r) const
Retorna true si this es distinto que el vector r.
Definition: Vector.H:618
void pop_back()
Elimina el elemento situado al final del vector.
Definition: Vector.H:593
iterator operator++()
Definition: Vector.H:181
bool operator<=(const iterator &itor) const
Definition: Vector.H:236
const size_type & size() const
Retorna el número de elementos que tiene el vector.
Definition: Vector.H:338
vector::value_type & reference
Tipo referencia a una entrada del vector.
Definition: Vector.H:54
bool operator==(const vector &r) const
Definition: Vector.H:600
void clear()
Elimina todos los elementos del vector.
Definition: Vector.H:596
T & operator*()
Retorna una referencia al elemento actual del iterador.
Definition: Vector.H:168
void assign(const size_type &num, const T &value)
Asigna al vector num entradas con valor value.
Definition: Vector.H:399
iterator operator+(const int &n) const
Definition: Vector.H:278
iterator operator--()
Definition: Vector.H:198
bool empty() const
Retorna true si el vector está vacío.
Definition: Vector.H:341
void assign(Itor beg, const Itor &end)
Definition: Vector.H:413
size_t size_type
Tipo numérico utilizados para tamaños e índices del vector.
Definition: Vector.H:60
T & operator[](const size_type &index)
Acceso por posición; es equivalente al mismo acceso en el vector.
Definition: Vector.H:151
Definition: ahIterator.H:8
bool operator<(const iterator &itor) const
Definition: Vector.H:229
vector()
Instancia un vector vacío.
Definition: Vector.H:299
T * operator->()
Dereferencia el elemento actual del iterador.
Definition: Vector.H:174
iterator()
Instancia un iterador sin contenedor asociado.
Definition: Vector.H:125
int difference_type
Definition: Vector.H:116
vector< T >::value_type value_type
El tipo de dato que almacena el vector.
Definition: Vector.H:112
void resize(const size_type &num)
Reajusta la capacidad del vector a num entradas.
Definition: Vector.H:359
void resize(const size_type &num, const T &value)
Definition: Vector.H:372
void insert(iterator pos, const size_type &len, const T &value)
Definition: Vector.H:516
bool operator>=(const vector &r) const
Definition: Vector.H:661
vector(Itor beg, const Itor &end)
Definition: Vector.H:316
bool operator<=(const vector &r) const
Definition: Vector.H:653
void reserve(const size_type &num)
Aumenta la capacidad del vector en num entradas.
Definition: Vector.H:350
reference back() const
Definition: Vector.H:464
iterator erase(const iterator &beg, const iterator &end)
Definition: Vector.H:575
Definition: Vector.H:74
iterator begin() const
Definition: Vector.H:471
iterator operator-=(const size_type &n)
Retrocede el iterador n posiciones hacia atrás.
Definition: Vector.H:221
bool operator==(const iterator &itor) const
Definition: Vector.H:257
iterator(const iterator &itor)
Instancia un iterador copia de otro iterador.
Definition: Vector.H:131
size_type capacity() const
Retorna la capacidad (dimension actual) del vector.
Definition: Vector.H:347
Definition: Vector.H:16
Definition: tpl_dynArray.H:70
int operator-(const iterator &itor) const
Definition: Vector.H:271
reference front() const
Definition: Vector.H:457
iterator & operator=(const iterator &itor)
Asigna un iterador.
Definition: Vector.H:139
reference at(const size_type &idx)
Retorna una referencia al elemento idx del vector.
Definition: Vector.H:431
bool operator<(const vector &r) const
Definition: Vector.H:625
void swap(vector &c)
Definition: Vector.H:424
vector(const size_type &num, const T &value)
Instancia un nuevo vector de num elementos de valor value.
Definition: Vector.H:327
vector(const size_type &num)
Instancia un vector con capacidad inicial de num.
Definition: Vector.H:308
void insert(const iterator &pos, Itor beg, const Itor &end)
Definition: Vector.H:529
bool operator>(const vector &r) const
Definition: Vector.H:645
void push_back(const T &value)
Inserta value al final del vector.
Definition: Vector.H:544
const vector::value_type & const_reference
Tipo referencia constante a una entrada del vector.
Definition: Vector.H:57
reference operator[](const size_type &idx)
Accede a la entrada idx.
Definition: Vector.H:444
iterator end() const
Definition: Vector.H:478
bool operator!=(const iterator &itor) const
Definition: Vector.H:264
const_reference at(const size_type &idx) const
Definition: Vector.H:438
vector & operator=(const vector &c)
Asigna un vector.
Definition: Vector.H:387
vector< T >::value_type * pointer
Tipo puntero a entrada dentro del vector.
Definition: Vector.H:119
bool operator>=(const iterator &itor) const
Definition: Vector.H:250

Leandro Rabindranath León