[C con Clase] Duda con array

Steven Davidson srd4121 en njit.edu
Mar Nov 15 13:18:35 CET 2011


Hola Guillermo,

2011/11/15 Guillermo Rolando Roig Carralero <grroig en estudiantes.uci.cu>:
> Saludos a todos
> La duda que tengo es si existe alguna manera de crear un array sin conocer
> la cantidad de elementos que este va a tener, por ejemplo, que el usuario
> comience a entrar numeros y pare cuando quiera.
>

En cuanto quieras cambiar algo en tiempo de ejecución, ya estamos
hablando de algo dinámico. En el caso de los arrays, podrías usar un
array dinámico, como por ejemplo,

int nCant = 0;
int *pLista = new int[++nCant];

El problema es que cada vez que quieras agregar un nuevo elemento,
tendrás que gestionar tú mismo este array dinámico. Esto es,
1) crear otro array con la nueva cantidad de elementos,
2) copiar todos los elementos del array anterior al nuevo,
3) borrar/liberar el array antiguo, y
4) asignar el nuevo array al puntero 'pLista'.

En código C++, sería algo así,

int *pAux = pLista;

pLista = new int[++nCant];

memcpy( pLista, pAux, nCant-1 );

delete[] pAux;

Es algo engorroso, pero te servirá. También podríamos usar la función
'realloc()', declarada en <cstdlib>, pero entonces no podríamos usar
un array de objetos con sus constructores por defecto. La ventaja de
'realloc()' es que no necesitamos hacer una copia, ni siquiera tenemos
que crear otro array, ya que esta función garantiza los valores de los
elementos del array "antiguo". Por ejemplo,

// Al principio: un elemento
int *pLista = (int *) malloc( sizeof(int) );

// Posteriormente: más de un elemento
pLista = (int *) realloc( pLista, sizeof(int) * ++nCant );

Claro está, podemos usar las clases estándares (STL) de ANSI C++.
Concretamente, 'vector' te servirá para representar un array dinámico
mientras que 'string' representa una cadena de caracteres dinámica.
Por ejemplo,

vector< int > iLista;

iLista.push_back( 10 );
iLista.push_back( 20 );
iLista.push_back( 30 );
iLista.push_back( 40 );

Agregamos al final, los elementos: 10, 20, 30, 40


La otra solución es usar otra estructura que no sea el array como por
ejemplo la lista dinámicamente enlazada. Puedes consultar el capítulo
1 de nuestro curso de EDD en nuestra página:
http://c.conclase.net/edd/index.php?cap=001#inicio  O también puedes
usar las STL, que en este caso puede ser 'list' o 'deque'; por
ejemplo,

list< int > iLista;

iLista.push_back( 10 );
iLista.push_back( 20 );
iLista.push_back( 30 );
iLista.push_back( 40 );


Espero que todo esto te oriente.

Steven




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