Newsgroup: it.comp.lang.c++
Titolo: Liste vettori... array dinamici

Salve di nuovo...
Domanda:
ho bisogno di utilizzare degli array dinamici e liste ma non so come
implementarli o meglio:
usando le classi vector e list delle STL è possibile creare degli array
dinamici?
oppure dovrei implementarlo io utilizzando gli operatori new e delete per
avere come risultato quello che faceva (e fa) la funzione C realloc.
Scusate se sono stato confuso.
Grazie. Ciao.
--
Alberto

 ha scritto nel messaggio
news:avn3du$erh$1...@lacerta.tiscalinet.it...


 wrote in message
news:avn3du$erh$1...@lacerta.tiscalinet.it...

Piu' che array dinamici magari volevi dire memoria dinamica?
Puoi utilizzare vector, list, queue, dequeue ecc.. utilizzando in modo
complementare l'allocazione dinamica della memoria.
In sostanza tu hai la tua classe con la quale instanzi i tuoi oggetti da
mettere in questi contenitori, ad esempio vuoi gestire un vettore di animali
o una lista di persone dove animale e persona sono 2 classi.
Ora non e' che ogni volta che vuoi inserire un leone nel vettore o Mario
Rossi nella lista tu ci inserisci direttamente l'istanza. Puoi farlo si', ma
a quel punto conviene che nei contenitori ci metti il puntatore al tuo
oggetto che ti sei creato per mezzo di una new.
Questo perche' l'oggetto puo' essere anche bello grosso ed ogni inserimento
in un contenitore comporta una copia ( e quindi in certi casi bisognerebbe
anche implementare il copy constructor della classe il cui oggetto volesse
essere messo nel contenitore).
Per cui si taglia la testa al toro, si fa una bella new, si assegna
l'indirizzo al puntatore all'oggetto (animale o persona designato),
inizializzandone i valori e poi si inserisce il puntatore nel vettore o
nella lista con un push_back o simili.
Il vettore o la lista crescono automaticamente con gli inserimenti per cui
non bisogna preoccuparsi di allocare memoria per loro (giusto fare una
reserve all'inizio per questioni di ottimizzazione, senno' le prime
push_back causerebbero autodimensionamenti del contenitore che in teoria
farebbero perdere tempo).
Alla fine bisogna solo fare attenzione di non perdere i puntatori messi nel
contenitore, con la distruzione automatica (alla fine di un blocco) del
contenitore stesso.
Altrimenti non potremmo liberare la memoria allocata precedentemente per gli
oggetti.
Per cui, prima che un contenitore si distrugga, va fatta una scansione per
trovare tutti i puntatori memorizzati e farne le delete.
So che sono stato un po' confusionario e se vuoi ti portero' qualche
esempio.
Maurus

 dinamici?
E' molto piů che "dinamico"... supponi che v sia un vettore vector<type>
puoi aggiungere elementi col metodo push_back(typeid x) senza preoccuparti
di altro.
Questo se ho inteso la tua domanda, altrimenti spiega meglio cosa intendi
fare.

 se devi creare array dinamici perchè non usare le liste
E perché non usare vector?


Se hai qualche esempio o qualche link per documentarmi meglio ti ringrazio.
Ciao.
--
Alberto


Leggendo meglio... se non sbaglio mi consigli di inizializzare gli oggetti
con la classica new e poi di creare tramite vector o list un array (o una
lista) di puntatori in modo da non sprecare memoria e incasinarmi con il
copy constructor. Infine prima di eliminare l'array devo prima fare il
delete dei miei oggetti contenuti nell'array. Ok. Penso di aver capito...
Ciao
--
Alberto

 Alberto
Esatto!
Se vuoi un link alla STL per meglio usare vector, list, queue e algoritmi
vari, oltre alle MSDN ci sono sul web anche queste informazioni:
http://www.sgi.com/tech/stl/table_of_contents.html
Non ti far tentare dalla possibilita' di crearti degli auto puntatori
auto_ptr, che non necessitano della delete, in quanto non puoi metterli nei
contenitori della STL, altrimenti succederebbe il patatrac.
In caso di difficolta', posta un esempio del tuo codice.
Maurus