Página principal   Lista alfabética   Lista de componentes   Lista de archivos   Miembros de las clases   Archivos de los miembros   Páginas relacionadas  

vector_disperso.cpp

Ir a la documentación de este archivo.
00001 
00006 #include <cassert>
00007 #include <vector_disperso.h>
00008 
00009 /* _________________________________________________________________________ */
00010 
00011 bool Vector_Disperso::posicion_indice(int& pos, int i) const
00012 {
00013     int izq=0, der=nelementos-1,centro;
00014 
00015     while (der-izq>=0) {
00016         centro=(izq+der)/2;
00017         if (i<datos[centro].indice)
00018         der=centro-1;
00019         else if (i>datos[centro].indice)
00020                 izq=centro+1;
00021                 else {
00022                 pos=centro;
00023                 return true;
00024                 }
00025     }
00026     pos=izq;
00027 
00028     return false;
00029 }
00030 
00031 
00032 /* _________________________________________________________________________ */
00033 
00034 void Vector_Disperso::expandir() 
00035 { 
00036   reservados= (nelementos==0)?1:nelementos*2;
00037   Elemento * nuevos_datos= new Elemento[reservados];
00038   for (int j= 0; j<nelementos ;++j)
00039     nuevos_datos[j]= datos[j];
00040   delete[] datos;
00041   datos= nuevos_datos;
00042 }
00043 
00044 /* _________________________________________________________________________ */
00045 
00046 void Vector_Disperso::contraer() 
00047 { 
00048   assert(nelementos<=reservados/2);
00049   reservados= reservados/2;
00050   Elemento * nuevos_datos= new Elemento[reservados];
00051   for (int j= 0; j<nelementos ;++j)
00052     nuevos_datos[j]= datos[j];
00053   delete[] datos;
00054   datos= nuevos_datos;
00055 }
00056 
00057 /* _________________________________________________________________________ */
00058 
00059 Vector_Disperso::Vector_Disperso()
00060 {
00061   datos=0;
00062   nelementos=reservados=0;
00063   valor_por_defecto= 0.0;
00064 }
00065     
00066 /* _________________________________________________________________________ */
00067 
00068 Vector_Disperso::Vector_Disperso(const Vector_Disperso& orig) 
00069 {
00070   valor_por_defecto= orig.valor_por_defecto;
00071   reservados= nelementos= orig.nelementos;
00072   if (nelementos>0) {
00073     datos= new Elemento[nelementos];
00074     for (int i=0; i<nelementos;++i)
00075       datos[i]= orig.datos[i];
00076   }
00077   else datos=0;
00078 }
00079 
00080 /* _________________________________________________________________________ */
00081 
00082 Vector_Disperso::~Vector_Disperso() 
00083 {
00084   if (reservados>0)
00085     delete[] datos;
00086 }
00087 
00088 /* _________________________________________________________________________ */
00089 
00090 Vector_Disperso& Vector_Disperso::operator= (const Vector_Disperso& orig) 
00091 {
00092   if (this!= &orig) {
00093     if (reservados>0)
00094       delete[] datos;
00095     valor_por_defecto= orig.valor_por_defecto;
00096     reservados= nelementos= orig.nelementos;
00097     if (nelementos>0) {
00098       datos= new Elemento[nelementos];
00099       for (int i=0; i<nelementos;++i)
00100         datos[i]= orig.datos[i];
00101     }
00102     else datos=0;
00103   }
00104   return *this;
00105 }
00106 
00107 
00108 
00109 /* _________________________________________________________________________ */
00110 
00111 float Vector_Disperso::get_default() const 
00112 {
00113   return valor_por_defecto;
00114 }
00115 
00116 /* _________________________________________________________________________ */
00117 
00118 void Vector_Disperso::set_default(float f) 
00119 {
00120   assert (nelementos==0);
00121   valor_por_defecto= f;
00122 }
00123 
00124 /* _________________________________________________________________________ */
00125 
00126 float Vector_Disperso::get(int i) const 
00127 {
00128   int pos;
00129   if (posicion_indice(pos,i))
00130     return datos[pos].valor;
00131   else return valor_por_defecto;
00132 }
00133 
00134 /* _________________________________________________________________________ */
00135 
00136 void Vector_Disperso::set(int i, float f)
00137 {
00138   int pos;
00139   
00140   if (posicion_indice(pos,i)){ // Está en pos
00141     if (f!=valor_por_defecto)
00142       datos[pos].valor= f;
00143     else { // hay que eliminarlo
00144       nelementos= nelementos-1;
00145       for (int j=pos;j<nelementos;++j)
00146          datos[j]=datos[j+1];
00147       if (nelementos<reservados/4)
00148          contraer();
00149     }
00150   }
00151   else { // No está en el vector (estaría en pos)
00152     if (f!=valor_por_defecto) {
00153       if (nelementos==reservados)
00154          expandir();
00155       for (int j=nelementos; j>pos; --j)
00156          datos[j]= datos[j-1];
00157       datos[pos].indice= i;
00158       datos[pos].valor= f;
00159       ++nelementos;
00160     }
00161   }
00162 }
00163 
00164 /* _________________________________________________________________________ */
00165 
00166 int Vector_Disperso::num_elementos() const
00167 {
00168   return nelementos;
00169 }
00170 
00171 /* _________________________________________________________________________ */
00172 
00173 void Vector_Disperso::datos_posicion(int i, int& indice, float& valor) const
00174 {
00175   assert (0<=i && i<nelementos);
00176   indice= datos[i].indice;
00177   valor= datos[i].valor;
00178 }

Programación en C++. Desarrollado por Antonio Garrido, © 2003