PDA

View Full Version : [c++] Stl: come fare?


stdecden
19-01-2008, 14:44
Salve a tutti,

Volevo chiedervi come si utilizzano esattamente (anche dal punto di vista della memoria...). Qualcuno conosce delle guide in rete. Io ne ho trovate qualcune ma fanno tutte degli esempi con int, ma a me interesserebbero gli oggetti....

71104
19-01-2008, 15:09
che vuol dire "dal punto di vista della memoria"...? :mbe:
comunque vedi se ti è d'aiuto www.cplusplus.com

stdecden
19-01-2008, 15:34
che vuol dire "dal punto di vista della memoria"...?

Intendevo dire: se il contenitore si occupa della deallocazione dell'oggetto o no.
Un altra domanda... conviene usare:
std::vector<Oggetto> array;
o
std::vector<Oggetto *> array;
:confused:

71104
19-01-2008, 21:00
ovviamente la prima, in quanto non devi preoccuparti di gestire l'allocazione e deallocazione; però non sempre è attuabile perché gli oggetti in questione potrebbero occupare molto spazio ed essere tanti, e perdipiù le locazioni del vettore spesso sono allocate in numero maggiore di quelle effettivamente utilizzate (vedi vector::capacity()), quindi non è difficile che capiti di dover preferire la seconda.

cionci
20-01-2008, 08:22
Intendevo dire: se il contenitore si occupa della deallocazione dell'oggetto o no.
Se ci metti il puntatore no.

Un altra domanda... conviene usare:
std::vector<Oggetto> array;
o
std::vector<Oggetto *> array;
:confused:
Dipende da quello che devi fare.
Se il vector è una collection di oggetti dichiarati staticamente e che possono essere passati tramite il costruttore di copia allora il primo.
Se invece bisogna inserire un dato oggetto passato per puntatore al tuo metodo allora il secondo.
Ovviamente dovrai stabilire anche chi e come distrugge gli oggetti contenuti: se l'oggetto esiste anche al di fuori della tuo collection probabilmente non tocca alla classe che contiene la tua collection a distruggerlo. Se l'oggetto esiste solo in quanto contenuto nella collection allora deve distruggerlo al classe che contiene la collection.

fek
20-01-2008, 11:28
In generale se l'oggetto ha semantica di valore (in pratica puo' essere copiato ed ha un costruttore che non accetta parametri) puoi memorizzare gli oggetti in un container STL.
Se una di queste condizioni non e' valida, devi memorizzare puntatori e occuparti tu della deallocazione, oppure scriverti qualche template che te lo automatizza (non e' difficilissimo ma neppure banale).
Non puoi usare auto_ptr nelle collezioni STL, e' illegale, perche' pur avendo un costruttore di copia, non ha semantica di valore.

fek
20-01-2008, 11:30
Se l'oggetto esiste solo in quanto contenuto nella collection allora deve distruggerlo al classe che contiene la collection.

Solo una piccola precisazione, in C++ e' importantissimo ricordarsi che il compito di distruggere un oggetto e' dell'entita' che lo ha creato, non di quella che ha in un dato momento il possesso dell'oggetto.

http://blogs.ugidotnet.org/Franny/archive/2007/09/21/88478.aspx

cionci
20-01-2008, 11:33
Non è quello che ho scritto io ?

fek
20-01-2008, 11:46
Non è quello che ho scritto io ?

Non necessariamente cionci. Immagina di scrivere un Observer Pattern, dove la classe Observer tiene una lista STL di oggetti in ascolto su un evento. Li terra' ovviamente sotto forma di puntatori perche' i Listener in generale non hanno semantica di valore. Ora, quando l'oggetto Observer finisce il suo compito, distrugge la lista di Listener, ma NON e' sua responsabilita' distruggere anche i Listener. La responsabilita' e' di chi ha il possesso di questi oggetti, ovvero chi li ha creati.
Quindi in generale la mia risposta e' no: non e' chi possiede la collezione che deve distruggere gli oggetti contenuti, ma chi ha creato gli oggetti stessi.

Edit. Correzione: se per "esiste solo nella collezione" implichi che chi possiede la collezione ha creato anche l'oggetto si', e' la stessa cosa che ho detto io :)

cionci
20-01-2008, 13:16
Edit. Correzione: se per "esiste solo nella collezione" implichi che chi possiede la collezione ha creato anche l'oggetto si', e' la stessa cosa che ho detto io :)
Intendevo proprio che è puntato solo dal puntatore all'interno della collezione :D

fek
20-01-2008, 13:17
Intendevo proprio che è puntato solo dal puntatore all'interno della collezione :D

Allora e' ok, alla prima lettura non mi era chiaro :)