32 # ifndef ALEPH_VECTOR_H 33 # define ALEPH_VECTOR_H 35 # include <tpl_dynArray.H> 36 # include <ahIterator.H> 37 # include <ah_stdc++_utils.H> 45 typename iterator_traits<typename vector<T>::iterator>::difference_type
92 mutable size_type num_elem;
104 static const int Invalid_Position = -1;
108 mutable size_type current_position;
113 : dyn_array_ptr(&vec.array), current_position(pos)
118 void set_pos(
const size_t &)
120 current_position = this->num_elem;
123 int get_position()
const {
return current_position; }
125 DynArray<T> * get_dyn_array_ptr() {
return dyn_array_ptr; }
127 T & access(
const size_type & i)
129 if (i >= dyn_array_ptr->
size())
132 return dyn_array_ptr->
access(i);
151 iterator() : dyn_array_ptr(nullptr), current_position(Invalid_Position)
158 : dyn_array_ptr(itor.dyn_array_ptr),
159 current_position(itor.current_position)
170 dyn_array_ptr = itor.dyn_array_ptr;
171 current_position = itor.current_position;
179 current_position = index;
181 return access(index);
188 access(current_position) = key;
196 return dyn_array_ptr->
access(current_position);
202 return & dyn_array_ptr->
access(current_position);
242 current_position += n;
249 current_position -= n;
257 return current_position < itor.current_position;
264 return current_position <= itor.current_position;
271 return current_position > itor.current_position;
278 return current_position >= itor.current_position;
285 return current_position == itor.current_position;
292 return current_position != itor.current_position;
299 return current_position - itor.current_position;
308 ret_val.current_position += n;
315 return &array == dyn_array_ptr;
318 bool verify(
const iterator & it)
const 320 return dyn_array_ptr == it.dyn_array_ptr;
334 vector (
const size_type & num) : array(num), num_elem(num)
336 array.
reserve(0, num_elem - 1);
341 template <
typename Itor>
explicit 342 vector (Itor beg,
const Itor &
end) : array(0), num_elem(0)
344 Aleph::verify_iterators(beg, end);
347 array[num_elem++] = *beg++;
349 assert(num_elem == array.
size());
353 vector (
const size_type & num,
const T & value) : array(num), num_elem(num)
355 array.
reserve(0, num_elem - 1);
357 for(size_type i = 0; i < num; i++)
364 const size_type &
size()
const {
return num_elem; }
367 bool empty()
const {
return num_elem == 0; }
378 if (num < array.
size())
387 if (num < array.
size())
398 void resize (
const size_type & num,
const T & value)
400 if (num < array.
size())
408 for (; num_elem < num; num_elem++)
409 array.
access(num_elem) = value;
419 num_elem = c.num_elem;
425 void assign (
const size_type & num,
const T & value)
427 if (num > array.
size())
432 for(size_type i = 0; i < num; i++)
438 template <
typename Itor>
441 Aleph::verify_iterators(beg, end);
445 array[num_elem++] = *beg++;
452 std::swap(num_elem, c.num_elem);
457 reference
at(
const size_type & idx)
464 const_reference
at(
const size_type & idx)
const 492 return array.
access(num_elem - 1);
511 void open_gap(
const size_t & position,
const size_type & gap_len = 1)
513 const size_type old_size = array.
size();
514 array.
reserve(old_size, old_size + gap_len - 1);
516 if (position >= old_size)
519 const size_t final_pos = position + gap_len;
520 for (
int i = array.
size() - 1; i > final_pos; i--)
529 Aleph::verify_container_and_iterator(array, pos);
531 open_gap(pos.get_position());
533 array.
access(pos.get_position()) = value;
544 Aleph::verify_container_and_iterator(array, pos);
546 open_gap(pos.get_position(), len);
548 for (
int i = 0; i < len; i++, pos++, num_elem++)
554 template <
class Itor>
557 Aleph::verify_container_and_iterators(array, pos, beg, end);
559 size_type gap_len = Aleph::distance<T>(beg,
end);
561 open_gap(pos.get_position(), gap_len);
565 for (
int i = pos.get_position(); gap_len > 0; i++, gap_len--)
572 array[num_elem] = value;
578 void close_gap(
const size_t & position,
const size_type & len = 1)
580 for (
int i = position; i < num_elem - len; i++)
591 Aleph::verify_container_and_iterator(array, pos);
593 close_gap(pos.get_position());
595 return iterator(*
this, pos.get_position());
603 Aleph::verify_container_and_iterators(array, beg, end);
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;
610 if (gap_start > gap_last)
613 close_gap(gap_start, gap_len);
631 if (num_elem != r.num_elem)
634 const size_t len = std::min( num_elem, r.num_elem);
636 for (
size_t i = 0; i < len; i++)
637 if (array.
access(i) != r.array.access(i))
646 return not (*
this == r);
656 const bool l_smaller = num_elem < r.num_elem;
658 const size_t len = l_smaller ? num_elem : r.num_elem;
660 for (
size_t i = 0; i < len; i++)
661 if (array.
access(i) < r.array.access(i))
663 else if (r.array.access(i) < array.
access(i))
681 return not (r > *
this);
689 return not (*
this < r);
695 template <
typename T>
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
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
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: 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