2012-12-04 10 views
5

A quanto ho capito, un unique_ptr significa proprietà esclusiva. Una lista concatenata sembra adattarsi questo, con ogni nodo possedere il prossimo, come (avviso pseduocode)Implementazione di una lista con unique_ptr <>?

class node{ 
public: 
     unique_ptr<node> next; 
     int value; 
}; 

ma non capisco come eseguire le operazioni come attraversare la lista, in cui mi sono abituato a fare

here=here->next; 

Come è possibile realizzare strutture di dati utilizzando unique_ptr 's? Sono lo strumento giusto per il lavoro?

risposta

6

Quando si passa attraverso i nodi, non è necessario possedere il puntatore del nodo, il che significa che

qui = qui-> prossimo;

Non corretto se qui è un unique_ptr. Possedere un oggetto significa "essere responsabile per la sua vita e morte", il che significa che il proprietario è colui che possiede il codice che distruggerà l'oggetto. Se usi un'altra definizione di possedere, allora non è ciò che significa unique_ptr.

Nel codice del nodo dell'elenco, si presuppone che ciascun nodo sia responsabile del nodo successivo (se si distrugge un nodo, anche tutti i nodi successivi verranno distrutti). Può essere un comportamento valido, dipende dalle tue esigenze, ma sii sicuro che è ciò che vuoi veramente.

quello che vuoi è di leggere il puntatore, senza possederlo. La buona pratica corrente consiste nell'utilizzare un puntatore raw che indica un tipo di utilizzo "use but do not own" ad altri sviluppatori che guardano questo codice (unique_ptr significa "se muoio, anche l'oggetto appuntito muore"):

node* here = nullptr; // it will not own the pointed nodes (don't call delete with this pointer) 
here = &first_node(); // assuming first_node() returns a reference to the first node 
here = here->next.get(); // to get the next node without owning it: use get() - true in all smart pointers interface 
+0

Io non sono impegnato a che i nodi siano responsabili per il prossimo, sto solo cercando di capire come tradurre tra puntatori grezzi e puntatori intelligenti e questo mi è sembrato il più diretto. Qualche suggerimento sulle alternative? –

+1

Beh, credo che l'uso di shared_ptr sia più costoso ma più facile da gestire. Staccare i nodi sarebbe quindi molto facile. Detto questo, un'implementazione ottimizzata delle liste lo farebbe con i puntatori grezzi e l'assegnazione dei nodi personalizzati. – Klaim

+0

Non dimenticare di 'std :: swap'. –