[C con Clase] Array dinámico en C++ estándar

Steven Davidson srd4121 en njit.edu
Mar Mayo 1 21:47:59 CEST 2012


Hola User,

On 5/1/2012 2:21 PM, User wrote:
> Hola de nuevo,
>
> He realizado este pequeño programa para probar la alternativa que no
> usa clases plantillas:
>
> #include <iostream>
> #include <stdio.h>
> #include <stdlib.h>

Deberías acostumbrarte a los nombres correctos de estos ficheros 
estándares de cabecera de C++:

#include <cstdio>
#include <cstdlib>

Aunque creo que no necesitas <cstdio>.

> #include <fstream>
>
> using namespace std;
>
> int main()
> {

[CORTE]

Recuerda que debes liberar la memoria previamente adjudicada por 
'realloc()'. Escribe:

free( pDoubles );

>      return 0;
> }
>
> Imaginemos ahora que necesito que el array de doubles sea
> bidimensional, es decir, sabemos que va a tener dos columnas, pero un
> número indeterminado de filas.
>
> ¿Cómo podría implementarlo?
>

Si sabes que van a ser dos números por elemento, entonces tienes dos 
posibles soluciones:

1. Crea un array de 'double' con el doble de la cantidad de elementos 
que necesitas. Por ejemplo,

double *pDoubles = NULL;
int nCant = 0;

pDoubles = (double *) realloc( pDoubles, ++nCant * 2 * sizeof(double) );
...
Y luego, para acceder a un elemento, doblamos el índice:

pDoubles[2*5] = -1.023;
pDoubles[2*5+1] = 6.7031;

Se trata del 6º elemento - de índice 5, pero realmente se trata de los 
elementos de índices 10 y 11 en nuestro array.


2. Crea un array de un array de 'double'. Esto es,

typedef double coordenada[2];
...
coordenada *pDoubles = NULL;
int nCant = 0;

pDoubles = (coordenada *) realloc( pDoubles, ++nCant * sizeof(coordenada) );
...
Para acceder a un elemento, usamos el índice para 'pDoubles' y otro para 
la "columna":

pDoubles[5][0] = -1.023;
pDoubles[5][1] = 6.7031;

Como puedes ver, creamos un tipo que realmente es un array de 2 
'double', para usarlo en el array dinámico de 'coordenada'.


Si quieres, puedes crear un array dinámico de arrays dinámicos de 
'double'. Por ejemplo,

double **pDoubles = NULL;
int nCant = 0;

pDoubles = (double **) realloc( pDoubles, ++nCant * sizeof(double *) );
pDoubles[i] = (double *) realloc( pDoubles, 2 * sizeof(double) );

pDoubles = (double **) realloc( pDoubles, ++nCant * sizeof(double *) );
pDoubles[i] = (double *) realloc( pDoubles, 2 * sizeof(double) );
...
El acceso a un elemento es el de un array bidimensional:

pDoubles[5][0] = -1.023;
pDoubles[5][1] = 6.7031;


Espero que esto te oriente.

Steven





Más información sobre la lista de distribución Cconclase