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....
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:
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.
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.
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.
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
Non è quello che ho scritto io ?
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 :)
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
Intendevo proprio che è puntato solo dal puntatore all'interno della collezione :D
Allora e' ok, alla prima lettura non mi era chiaro :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.