¿Cómo eliminar un array estático en c++?

varuk

Buenas.

No sé si esta pregunta la hago cegado por las horas delante de la pantalla y con la cabeza embotada o no pero... Llegado a un momento del programa necesito doblar el tamaño de un array que tengo establecido en la clase, como atributo private++ (estoy trabajando siempre dentro de la clase).

Entonces cuando ese array, llamémosle "arrayMV", inicializado con 100 posiciones, alcance un tamaño, que le digo yo, tiene que doblar su tamaño. Y como hago uso de una función de dispersión, tendré que aplicar la función que tengo a los elementos para copiarlos al nuevo array de tamaño 200.

Es decir, si en arrayMV hay X porcentaje de llenado, necesito (he pensado en hacerlo así, pero no sé si es correcto):

1º crear arrayAUX del mismo tamaño del que ya tengo (arrayMV).
2º Copiar los valores de arrayMV a arrayAUX
3º Eliminar arrayMV
4º Crear arrayMV con el nuevo tamaño y pasarle los valores de arrayAUX

Claro, el array, es la cuestión, debe mantener el mismo nombre que el original. Otra cosa que había pensado es llamar a los arrays con la palabra "array" seguido del tamaño actual de la variable "sizeArray". Es decir, si un array tiene tamaño 100 se llamaria "array100" y así en en el resto de funciones manejarían el array con el nombre array+VariablesizeArray y no tendría que pasar por arrayAux.

No sé si me entendéis o no. Creo que no xD.

LOc0

Antes de nada, ¿qué entiendes por array "estático"?

Suponiendo que sea:

private:

<tipo> vector[100];

¿No te "chirría" usar memoria "estática" (en realidad es automática) para algo que puede aumentar de tamaño? Lo suyo en estos casos es que declares un puntero y reserves memoria con http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

private:

<tipo> *vector;
int tam_vector;

Si el array tiene que ser el mismo para todos los objetos de la clase, decláralo así:

private:

static <tipo> *vector;
static int tam_vector;

...
<tipo> clase::vector=NULL; //No te olvides de inicializar la variable static
int clase::tam_vector=0;

Salu2 ;)

1 respuesta
varuk

#2 Pero de la forma que tu dices... Para acceder a un elemento del vector debería ir recorriéndolo hasta encontrarlo ¿no? Yo busco un sistema que al acceder al elemento del vector sea de tiempo O(1), es decir, vaya directo sin buscar.

1 respuesta
LOc0

#3 Se accede exactamente igual. Sólo cambia la fase de reservar memoria para el array con malloc (o realloc) y el free para liberarla. Tu función de hash te dará un número y tú accedes a vector[numero] como antes.

Salu2 ;)

2 respuestas
varuk

#4 Mañana lo veré. Muchas gracias LOc0.

Buffoncete

#4 Antes de nada, el chaval está hablando de C++ y tú estás hablando de Ansi-C

para trabajar con vectores en C++ usar mejor la STL, en concreto la clase vector.

vector<tipo> miArray(3); //3 elementos

y se accede exactamente igual que el otro, pero con memoria dinámica.

miArray.push(4); //Añado el elemento 4
2 respuestas
varuk

#6 Pero el caso es que... mi vector contiene punteros a listas. Es decir, cada posición del vector contiene un puntero a una lista. Entonces la tabla de dispersión recibe un dato, calcula la posición del vector y mete ese dato al principio de la lista, o final, de esa posición del vector.

Llegado un momento, cuando haya X datos repartidos por esas listas, aunque estén todas en la lista de la misma posición del vector (el reparto de posiciones ya lo hace la función de dispersión), quiero hacer que ese vector aumente su tamaño al doble y los datos de la listas vuelvan a calcular reorganizarse en el nuevo vector de tamaño doble según la función de dispersión.

¿Se entiende? Y así pueden haber 1 millon, o los que sean, de datos que cada X datos tendré que doblar el vector para que las listas no sean muy grandes por colisión.

1 respuesta
LOc0

#6 +1

Intenté que aprendiera a reservar memoria al "estilo C" ya de paso, pero siendo formales (que a la larga es lo mejor), usar la STL es lo más recomendable.

#7
Se entiende y lo puedes hacer con lo que yo te dije o usando la clase vector que comenta #6 (método recomendado).


vector<lista*> mi_vector(100);

mi_vector[7]=loquesea; //Para asignar de forma "directa"

mi_vector.resize(200); //Aumentas a 200 (conservando los valores antiguos al principio).

Después de aumentar el tamaño, tendrás que recalcular las posiciones nuevas de los elementos antiguos llamando otra vez a tu función de hash pero con un espacio de direccionamiento mayor. (Utiliza el espacio nuevo como auxiliar para ir recolocando los elementos antiguos en sus posiciones nuevas sin machacar ninguno).

Salu2 ;)

varuk

Muchas gracias a ambos ^^

Usuarios habituales

  • varuk
  • LOc0
  • Buffoncete