Aleph-w  1.9
General library for algorithms and data structures
Vector.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 /*
29  Aleph implementation of vector C++ standard container
30 */
31 
32 # ifndef ALEPH_VECTOR_H
33 # define ALEPH_VECTOR_H
34 
35 # include <tpl_dynArray.H>
36 # include <ahIterator.H>
37 # include <ah_stdc++_utils.H>
38 
39 namespace Aleph
40 {
41 
42 template <class T> class vector;
43 
44  template <typename T>
45 typename iterator_traits<typename vector<T>::iterator>::difference_type
46 distance(typename vector<T>::iterator, typename vector<T>::iterator);
47 
71  template <typename T>
72 class vector
73 {
74 public:
75 
77  typedef T value_type;
78 
80  typedef typename vector::value_type & reference;
81 
83  typedef const typename vector::value_type & const_reference;
84 
86  typedef size_t size_type;
87 
88 private:
89 
90  mutable DynArray<T> array;
91 
92  mutable size_type num_elem;
93 
94 public:
95 
100  class iterator
101  {
102  friend class vector<T>;
103 
104  static const int Invalid_Position = -1;
105 
106  mutable DynArray<T> * dyn_array_ptr;
107 
108  mutable size_type current_position;
109 
110  T cookie_data;
111 
112  iterator(const vector<T> & vec, const size_t & pos = 0)
113  : dyn_array_ptr(&vec.array), current_position(pos)
114  {
115  /* empty */
116  }
117 
118  void set_pos(const size_t &)
119  {
120  current_position = this->num_elem;
121  }
122 
123  int get_position() const { return current_position; }
124 
125  DynArray<T> * get_dyn_array_ptr() { return dyn_array_ptr; }
126 
127  T & access(const size_type & i)
128  {
129  if (i >= dyn_array_ptr->size())
130  return cookie_data;
131 
132  return dyn_array_ptr->access(i);
133  }
134 
135  public:
136 
139 
142  typedef int difference_type;
143 
145  typedef typename vector<T>::value_type * pointer;
146 
148  typedef typename vector<T>::reference reference;
149 
151  iterator() : dyn_array_ptr(nullptr), current_position(Invalid_Position)
152  {
153  /* empty */
154  }
155 
157  iterator(const iterator & itor)
158  : dyn_array_ptr(itor.dyn_array_ptr),
159  current_position(itor.current_position)
160  {
161  /* empty */
162  }
163 
165  iterator & operator = (const iterator & itor)
166  {
167  if (&itor == this)
168  return *this;
169 
170  dyn_array_ptr = itor.dyn_array_ptr;
171  current_position = itor.current_position;
172 
173  return *this;
174  }
175 
177  T & operator [] (const size_type & index)
178  {
179  current_position = index;
180 
181  return access(index);
182  }
183 
186  iterator & operator = (const T & key)
187  {
188  access(current_position) = key;
189 
190  return *this;
191  }
192 
195  {
196  return dyn_array_ptr->access(current_position);
197  }
198 
201  {
202  return & dyn_array_ptr->access(current_position);
203  }
204 
208  {
209  current_position++;
210  return *this;
211  }
212 
216  {
217  iterator return_value = *this;
218  current_position++;
219  return return_value;
220  }
221 
225  {
226  current_position--;
227  return *this;
228  }
229 
233  {
234  iterator return_value = *this;
235  current_position--;
236  return return_value;
237  }
238 
240  iterator operator += (const size_type & n)
241  {
242  current_position += n;
243  return *this;
244  }
245 
247  iterator operator -= (const size_type & n)
248  {
249  current_position -= n;
250  return *this;
251  }
252 
255  bool operator < (const iterator & itor) const
256  {
257  return current_position < itor.current_position;
258  }
259 
262  bool operator <= (const iterator & itor) const
263  {
264  return current_position <= itor.current_position;
265  }
266 
269  bool operator > (const iterator & itor) const
270  {
271  return current_position > itor.current_position;
272  }
273 
276  bool operator >= (const iterator& itor) const
277  {
278  return current_position >= itor.current_position;
279  }
280 
283  bool operator == (const iterator & itor) const
284  {
285  return current_position == itor.current_position;
286  }
287 
290  bool operator != (const iterator & itor) const
291  {
292  return current_position != itor.current_position;
293  }
294 
297  int operator - (const iterator & itor) const
298  {
299  return current_position - itor.current_position;
300  }
301 
304  iterator operator + (const int & n) const
305  {
306  iterator ret_val(*this);
307 
308  ret_val.current_position += n;
309 
310  return ret_val;
311  }
312 
313  bool verify(const DynArray<T> & array) const
314  {
315  return &array == dyn_array_ptr;
316  }
317 
318  bool verify(const iterator & it) const
319  {
320  return dyn_array_ptr == it.dyn_array_ptr;
321  }
322  };
323 
325  vector() : array(0), num_elem(0) { /* empty */ }
326 
328  vector (const vector & c) : array(c.array), num_elem(c.num_elem)
329  {
330  // empty
331  }
332 
334  vector (const size_type & num) : array(num), num_elem(num)
335  {
336  array.reserve(0, num_elem - 1);
337  }
338 
341  template <typename Itor> explicit
342  vector (Itor beg, const Itor & end) : array(0), num_elem(0)
343  {
344  Aleph::verify_iterators(beg, end);
345 
346  while (beg != end)
347  array[num_elem++] = *beg++;
348 
349  assert(num_elem == array.size());
350  }
351 
353  vector (const size_type & num, const T & value) : array(num), num_elem(num)
354  {
355  array.reserve(0, num_elem - 1);
356 
357  for(size_type i = 0; i < num; i++)
358  array.access(i) = value;
359  }
360 
361  ~vector() { /* empty */ }
362 
364  const size_type & size() const { return num_elem; }
365 
367  bool empty() const { return num_elem == 0; }
368 
370  size_type max_size() const { return array.max_size(); }
371 
373  size_type capacity() const { return array.size(); }
374 
376  void reserve (const size_type & num)
377  {
378  if (num < array.size())
379  return;
380 
381  array.reserve(array.size(), array.size() + num);
382  }
383 
385  void resize (const size_type & num)
386  {
387  if (num < array.size())
388  {
389  num_elem = num;
390  return;
391  }
392 
393  reserve(num - array.size());
394  }
395 
398  void resize (const size_type & num, const T & value)
399  {
400  if (num < array.size())
401  {
402  num_elem = num;
403  return;
404  }
405 
406  reserve(num - array.size());
407 
408  for (/* nothing */; num_elem < num; num_elem++)
409  array.access(num_elem) = value;
410  }
411 
413  vector & operator = (const vector & c)
414  {
415  if (this == &c)
416  return *this;
417 
418  array = c.array;
419  num_elem = c.num_elem;
420 
421  return *this;
422  }
423 
425  void assign (const size_type & num, const T & value)
426  {
427  if (num > array.size())
428  array.reserve(0, num - 1);
429 
430  num_elem = num;
431 
432  for(size_type i = 0; i < num; i++)
433  array.access(i) = value;
434  }
435 
438  template <typename Itor>
439  void assign (Itor beg, const Itor & end)
440  {
441  Aleph::verify_iterators(beg, end);
442 
443  num_elem = 0;
444  while (beg < end)
445  array[num_elem++] = *beg++;
446  }
447 
450  void swap(vector & c)
451  {
452  std::swap(num_elem, c.num_elem);
453  array.swap(c.array);
454  }
455 
457  reference at(const size_type & idx)
458  {
459  return array[idx];
460  }
461 
464  const_reference at(const size_type & idx) const
465  {
466  return array[idx];
467  }
468 
470  reference operator [] (const size_type & idx)
471  {
472  return array.access(idx);
473  }
474 
476  const_reference operator [] (const size_type & idx) const
477  {
478  return array.access(idx);
479  }
480 
483  reference front() const
484  {
485  return array.access(0);
486  }
487 
490  reference back() const
491  {
492  return array.access(num_elem - 1);
493  }
494 
497  iterator begin() const
498  {
499  return iterator (*this);
500  }
501 
504  iterator end() const
505  {
506  return iterator (*this, num_elem);
507  }
508 
509 private:
510 
511  void open_gap(const size_t & position, const size_type & gap_len = 1)
512  {
513  const size_type old_size = array.size();
514  array.reserve(old_size, old_size + gap_len - 1);
515 
516  if (position >= old_size)
517  return;
518 
519  const size_t final_pos = position + gap_len;
520  for (int i = array.size() - 1; i > final_pos; i--)
521  array.access(i) = array.access(i - gap_len);
522  }
523 
524 public:
525 
527  iterator insert(const iterator & pos, const T & value)
528  {
529  Aleph::verify_container_and_iterator(array, pos);
530 
531  open_gap(pos.get_position());
532 
533  array.access(pos.get_position()) = value;
534 
535  num_elem++;
536 
537  return pos;
538  }
539 
542  void insert(iterator pos, const size_type & len, const T & value)
543  {
544  Aleph::verify_container_and_iterator(array, pos);
545 
546  open_gap(pos.get_position(), len);
547 
548  for (int i = 0; i < len; i++, pos++, num_elem++)
549  array.access(i) = value;
550  }
551 
554  template <class Itor>
555  void insert(const iterator & pos, Itor beg, const Itor & end)
556  {
557  Aleph::verify_container_and_iterators(array, pos, beg, end);
558 
559  size_type gap_len = Aleph::distance<T>(beg, end);
560 
561  open_gap(pos.get_position(), gap_len);
562 
563  num_elem += gap_len;
564 
565  for (int i = pos.get_position(); gap_len > 0; i++, gap_len--)
566  array.access(i) = *beg++;
567  }
568 
570  void push_back (const T & value)
571  {
572  array[num_elem] = value;
573  num_elem++;
574  }
575 
576 private:
577 
578  void close_gap(const size_t & position, const size_type & len = 1)
579  {
580  for (int i = position; i < num_elem - len; i++)
581  array.access(i) = array.access(i + len);
582 
583  num_elem -= len;
584  }
585 
586 public:
587 
589  iterator erase (const iterator & pos)
590  {
591  Aleph::verify_container_and_iterator(array, pos);
592 
593  close_gap(pos.get_position());
594 
595  return iterator(*this, pos.get_position());
596  }
597 
601  iterator erase (const iterator & beg, const iterator & end)
602  {
603  Aleph::verify_container_and_iterators(array, beg, end);
604 
605  const size_t gap_last =
606  end.get_position() <= num_elem ? end.get_position() : num_elem;
607  const size_t gap_start = beg.get_position();
608  const size_t gap_len = gap_last - gap_start;
609 
610  if (gap_start > gap_last)
611  return iterator(*this, num_elem);
612 
613  close_gap(gap_start, gap_len);
614 
615  return iterator(*this, gap_start);
616  }
617 
619  void pop_back() { num_elem--; }
620 
622  void clear() { num_elem = 0; }
623 
626  bool operator == (const vector & r) const
627  {
628  if (this == &r)
629  return true;
630 
631  if (num_elem != r.num_elem)
632  return false;
633 
634  const size_t len = std::min( num_elem, r.num_elem);
635 
636  for (size_t i = 0; i < len; i++)
637  if (array.access(i) != r.array.access(i))
638  return false;
639 
640  return true;
641  }
642 
644  bool operator != (const vector & r) const
645  {
646  return not (*this == r);
647  }
648 
651  bool operator < (const vector & r) const
652  {
653  if (this == &r)
654  return false;
655 
656  const bool l_smaller = num_elem < r.num_elem;
657 
658  const size_t len = l_smaller ? num_elem : r.num_elem;
659 
660  for (size_t i = 0; i < len; i++)
661  if (array.access(i) < r.array.access(i))
662  return true;
663  else if (r.array.access(i) < array.access(i))
664  return false; // ==> no son iguales
665 
666  return l_smaller;
667  }
668 
671  bool operator > (const vector & r) const
672  {
673  return r < *this;
674  }
675 
679  bool operator <= (const vector & r) const
680  {
681  return not (r > *this);
682  }
683 
687  bool operator >= (const vector & r) const
688  {
689  return not (*this < r);
690  }
691 };
692 
693 
694 
695  template <typename T>
696 typename iterator_traits<typename vector<T>::iterator>::difference_type
697 distance(typename vector<T>::iterator it1, typename vector<T>::iterator it2)
698 {
699  return it2 - it1;
700 }
701 
702 } // end namespace Aleph
703 
704 # endif // ALEPH_VECTOR_H
bool operator!=(const iterator &itor) const
Definition: Vector.H:290
bool operator>=(const iterator &itor) const
Definition: Vector.H:276
iterator operator+=(const size_type &n)
Avanza el iterador n posiciones hacia delante.
Definition: Vector.H:240
vector< T >::reference reference
Tipo referencia a un elemento dentro del vector.
Definition: Vector.H:148
iterator insert(const iterator &pos, const T &value)
Inserta value en la posición dada por el iterador pos.
Definition: Vector.H:527
void reserve(const size_t l, const size_t r)
Definition: tpl_dynArray.H:998
vector(const vector &c)
Instancia un vector copia de v.
Definition: Vector.H:328
iterator erase(const iterator &pos)
Borra el elemento de la posición pos.
Definition: Vector.H:589
bool empty() const
Retorna true si el vector está vacío.
Definition: Vector.H:367
const_reference at(const size_type &idx) const
Definition: Vector.H:464
T value_type
El tipo de dato que almacena el vector.
Definition: Vector.H:77
void pop_back()
Elimina el elemento situado al final del vector.
Definition: Vector.H:619
iterator operator++()
Definition: Vector.H:207
vector::value_type & reference
Tipo referencia a una entrada del vector.
Definition: Vector.H:80
void clear()
Elimina todos los elementos del vector.
Definition: Vector.H:622
T & operator*()
Retorna una referencia al elemento actual del iterador.
Definition: Vector.H:194
void assign(const size_type &num, const T &value)
Asigna al vector num entradas con valor value.
Definition: Vector.H:425
T & access(const size_t i) const noexcept
Definition: tpl_dynArray.H:874
iterator operator--()
Definition: Vector.H:224
size_t max_size() const noexcept
Definition: tpl_dynArray.H:647
reference front() const
Definition: Vector.H:483
void assign(Itor beg, const Itor &end)
Definition: Vector.H:439
size_t size_type
Tipo numérico utilizados para tamaños e índices del vector.
Definition: Vector.H:86
void swap(DynArray< T > &array) noexcept
Definition: tpl_dynArray.H:819
T & operator[](const size_type &index)
Acceso por posición; es equivalente al mismo acceso en el vector.
Definition: Vector.H:177
bool operator>(const iterator &itor) const
Definition: Vector.H:269
reference back() const
Definition: Vector.H:490
vector()
Instancia un vector vacío.
Definition: Vector.H:325
T * operator->()
Dereferencia el elemento actual del iterador.
Definition: Vector.H:200
iterator()
Instancia un iterador sin contenedor asociado.
Definition: Vector.H:151
int difference_type
Definition: Vector.H:142
vector< T >::value_type value_type
El tipo de dato que almacena el vector.
Definition: Vector.H:138
void resize(const size_type &num)
Reajusta la capacidad del vector a num entradas.
Definition: Vector.H:385
Definition: ah-comb.H:35
void resize(const size_type &num, const T &value)
Definition: Vector.H:398
void insert(iterator pos, const size_type &len, const T &value)
Definition: Vector.H:542
vector(Itor beg, const Itor &end)
Definition: Vector.H:342
size_type capacity() const
Retorna la capacidad (dimension actual) del vector.
Definition: Vector.H:373
void reserve(const size_type &num)
Aumenta la capacidad del vector en num entradas.
Definition: Vector.H:376
bool operator<(const iterator &itor) const
Definition: Vector.H:255
iterator erase(const iterator &beg, const iterator &end)
Definition: Vector.H:601
Definition: Vector.H:100
bool operator<=(const iterator &itor) const
Definition: Vector.H:262
int operator-(const iterator &itor) const
Definition: Vector.H:297
iterator operator-=(const size_type &n)
Retrocede el iterador n posiciones hacia atrás.
Definition: Vector.H:247
iterator(const iterator &itor)
Instancia un iterador copia de otro iterador.
Definition: Vector.H:157
const size_type & size() const
Retorna el número de elementos que tiene el vector.
Definition: Vector.H:364
size_t size() const noexcept
Definition: tpl_dynArray.H:641
Definition: Vector.H:42
Definition: tpl_dynArray.H:159
bool operator==(const iterator &itor) const
Definition: Vector.H:283
iterator & operator=(const iterator &itor)
Asigna un iterador.
Definition: Vector.H:165
iterator end() const
Definition: Vector.H:504
iterator operator+(const int &n) const
Definition: Vector.H:304
reference at(const size_type &idx)
Retorna una referencia al elemento idx del vector.
Definition: Vector.H:457
void swap(vector &c)
Definition: Vector.H:450
vector(const size_type &num, const T &value)
Instancia un nuevo vector de num elementos de valor value.
Definition: Vector.H:353
vector(const size_type &num)
Instancia un vector con capacidad inicial de num.
Definition: Vector.H:334
void insert(const iterator &pos, Itor beg, const Itor &end)
Definition: Vector.H:555
iterator begin() const
Definition: Vector.H:497
void push_back(const T &value)
Inserta value al final del vector.
Definition: Vector.H:570
const vector::value_type & const_reference
Tipo referencia constante a una entrada del vector.
Definition: Vector.H:83
size_type max_size() const
Retorna la máxima dimensión que puede tener el vector.
Definition: Vector.H:370
vector< T >::value_type * pointer
Tipo puntero a entrada dentro del vector.
Definition: Vector.H:145

Leandro Rabindranath León