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 }