[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