// vector.cpp (C) 2000 ci1101@anubis.ecci.ucr.ac.cr
#include "vector.h"
/* requiere
El tipo de valor almacenado en el vector es "T", por lo que
para usar la clase el programador usuario debe definirlo
cambiando el "typedef" que se encuentra al principio del
archivo de encabezado "vector.h". */
/* implementación
_izq_primero-----+
|
_vp:[*]--->[?][?][?][*][*][*][*]
[*]--->[*][*][*][*][*][*][*]
V [*]--->[*][*][*][*][*][*][*]
d [*]--->[*][*][*][*][*][*][*]
i [*]--->[*][*][?][?][?][?][?] <--- _der
m [.] | VPdim
[.] |
+---_der_ultimo
El vector completo está formado por varias partes (en el diagrama
"[?][?][?][*][*][*][*]"), de tipo "vector::Pata", que contiene
cada una la misma cantidad "VPdim" de valores. Estas partes o
"patas" del vector se obtienen dinámicamente, conforme el
programador usuario agrega nuevos valores al vector al invocar
los métodos vector::Agregar_Final() y vector::Agregar_Principio().
En el vector de punteros "_vp[]" hay "Vdim" punteros hacia un
máximo de "Vdim" patas del vector. Por eso, la capacidad máxima
del vector es "VPdim*Vdim". El campo "_der" indica cuántas partes
o "patas" tiene el vector; es un índice para el vector "_vp[]".
Los campos "_izq_primero" y "_der_ultimo" son índice que indican,
para la primera y última de las partes del vector, cuántos campos
están vacíos (en el diagrama "[?][?][?]").
- En el caso de la primera parte, "_izq_primero" indica que los
campos que están vaciós son:
_vp[0]->_v[0] ===> _vp[0]->_v[_izq_primero-1]
- En el caso de la última pata, "_der_ultimo" indica que los
campos que están vaciós son:
_vp[_der]->_v[_der_ultimo] ===> _vp[_der]->_v[VPdim]
- Todos los campos intermedios ("[*][*][*][*][*][*][*]" en el
diagrama) contienen los valores almacenados en el vector.
Para encontrar el sitio (índice) en que está almacenado uno
de los elementos del vector, hay que localizar primero en qué
pata se encuentra, y luego, dentro de la pata, en qué entrada
está el valor.
*/
vector::vector(size_t n) { // Contructor
/* resultado
Inicializa el vector "*this" para que su dimensión sea "n".‡
- Si "n" excede la capacidad máxima de un vector, la
dimensión del vector se ajusta para que sea la de la
capacidad máxima.
*/
if (n > Capacidad()) { // ajusta hasta a la capacidad máxima
n = Capacidad();
}
// calcula la cantidad de patas para el vector
_izq_primero = 0;
_der = (n / VPdim) + 1;
_der_ultimo = (n % VPdim);
size_t i;
// crea las "_der" patas
for (i = 0; i<_der; ++i) {
_vp[i] = new vector::Pata;
// pone ceros en cada parte del vector
for (size_t j = 0; j<VPdim; ++j) {
_vp[i]->_v[j] = 0;
}
}
// pone punteros nulos en todo el resto de _vp[]
for (i = _der; i<Vdim; ++i) {
_vp[i] = 0;
}
}
vector::~vector() { // Destructor
// basta destruir las "_der" patas de _vp[]
for (size_t i = 0; i<_der; ++i) {
delete _vp[i]; // destruye cada vector::Pata
}
}
// EOF: vector.cpp
|