[C con Clase] Redefinir un arreglo dinamico

Programante programante en gmail.com
Jue Mayo 28 23:44:03 CEST 2009


David fire escribió:
> Hola
> no se para que haces lo del arreglo dinamico si es para una clase o
> para un trabajo o por gusto.
> pero la realidad es que no hay arreglos dinamicos y "hacer" uno
> copiando y borrando no es lo mejor, el coste en performance es
> altisimo. cada vez que queres agregar tenes que crear un nuevo arreglo
> en el heap copiar el viejo y borrar el viejo la parte de copiar es
> costosa en tiempo de pc.
> si lo vas a hacer asi al menos crealo con espacio extra.
>  
> si prefiers hacerlo bien la forma es una lista.
> con una lista lo que haces es tenes cada elemento apunta al siguiente
> y el ultimo apunta a null cuando queres agregar un elemento lo pones
> al final y el que apuntaba a null ahora apunta al nuevo elemento. por
> una cuestion de velocidad siempre guardas un puntero al al ultimo
> elemento.
> y para notener que apuntar al anterior y al siguiente tambien guardas
> un puntero al primero.
>  
> aparte de la ventaja de no tener que copiar todo el arreglo podes
> sacar elementos del medio sin problema o podes agregar en el medio sin
> tener que copiar todo el arreglo.
>  
> como lo estas haciendo con C++ podes sobre cargar los [] y el = y etc
> para recorrerlo como un arreglo como a tu objeto lista.
>  
> Saludos
> David

En realidad, como se están usando cadenas en C++, lo mejor (EMHO) sería
utilizar la clase stl::string, que ya se encarga de todo.

#include <iostream>

#include <string>

using namespace std;

int main(void)

{

int n, i;
string Caracteres;

cout << "Ingrese: ";

cin >> n;


Caracteres.resize(n);

for(i=0; i < n; i++)

  Caracteres[i] = 'a';


Caracteres.resize(n + 1);

Caracteres[i] = 'b';

cout << Caracteres << endl;

}



O si preferimos usar más a fondo las posibilidades de la STL:


#include <algorithm>

#include <iostream>

#include <string>

using namespace std;

int main(void)

{

int n, i = 0;
string Caracteres;

cout << "Ingrese: ";

cin >> n;


Caracteres.resize(n);

fill(Caracteres.begin (), Caracteres.end (), 'a');

Caracteres.push_back('b');

cout << Caracteres << endl;


}


Para este ejemplo se podría simplemente reservar los n+1 al principio,
pero supongo que es la simplificación de algún otro.





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