Sollte ich die Verwendung von boost::ptr_vector<T> oder vector<boost::shared_ptr<T> >?
Ich brauche einen container von Zeigern. Würden Sie empfehlen boost::ptr_vector<T>
oder std::vector<boost::shared_ptr<T> >
? (Oder etwas anderes?)
Wenn das von Interesse ist, meine tatsächlichen Daten, die Struktur ist relativ kompliziert (siehe hier) und derzeit speichert Objekte, keine Zeiger, aber ich würde gerne, das zu ändern (mit Mauszeiger Container), um loszuwerden, unnötige kopieren:
typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;
Woher kommt dieser unnötige kopieren auftreten?
Wenn Sie etwas einfügen in den Vektor oder die multimap von oben.
Wenn Sie einen container, speichert Zeiger, nur die Zeiger kopiert werden, wenn Sie Daten hinzufügen, wenn Sie Objekte speichern, die eigentlichen Objekte werden kopiert. Dies ist ein problem, wenn Sie den Umgang mit Objekten, die teuer sind, zu kopieren.
Wenn Sie etwas einfügen in den Vektor oder die multimap von oben.
Wenn Sie einen container, speichert Zeiger, nur die Zeiger kopiert werden, wenn Sie Daten hinzufügen, wenn Sie Objekte speichern, die eigentlichen Objekte werden kopiert. Dies ist ein problem, wenn Sie den Umgang mit Objekten, die teuer sind, zu kopieren.
InformationsquelleAutor Frank | 2010-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wem gehört das Objekt? Wenn der container besitzt die Objekte (d.h. die Objekte sollten nicht länger Leben als der container), verwenden Sie eine
ptr_vector
. Andernfalls verwenden Sie einen Vektor, dershared_ptr
s. Standard-Bibliothek Container (wiestd::vector
oderstd::list
) eigene Objekte, die Sie enthalten, so dass die Semantik einerptr_vector
näher an.vector
vonunique_ptr
das gleiche wie einptr_vector
?Ich weiß nicht genug über
unique_ptr
um diese Frage zu beantworten. Jedoch, dieptr_vector
haben weniger overhead (wie @sbi weist in seiner Antwort).Nein,
ptr_vector
ermöglicht Kopie dervector
deep kopiert den Inhalt (mitnew_clone
free-Funktion) und damit für polymorphe Container. Es hat auch schönere Oberfläche (die Dereferenzierung der iterator liefert eine Referenz auf das Objekt, nicht eine Referenz auf den Zeiger auf das Objekt) und andere leckereien.InformationsquelleAutor Björn Pollex
shared_ptr<>
hat eine gemeinsame Besitzer semantische, die implementiert wird durch Inkrementieren und Dekrementieren der Referenz zählt. Das kommt mit einigen Aufwand, vor allem, wenn multi-threading aktiviert ist (denn diese Zähler müssen dann gesperrt werden).Wenn Ihr Objekte freigegeben sind, verwenden Sie
shared_ptr<>
.Aber wenn Sie sich effektiv im Besitz der container, und sterben sollte, mit dem container, und Referenzen (Zeiger) übergeben kann gehen tot, wenn der container stirbt, dann verwenden Sie Zeiger-Container, denn Sie haben weniger Aufwand.
Wenn Sie unsicher sind, verwenden Sie
shared_ptr
auf der sicheren Seite. Wenn es sich herausstellt, Sie haben ein performance-problem, Sie können jederzeit optimieren Sie später. (Es ist einfacher zu optimieren, ein funktionierendes system als ein vorzeitig optimierten system arbeiten.)It's easier to optimize a working system then to get a prematurely optimized system working.
+1 für "sollte der Würfel mit dem container".
InformationsquelleAutor sbi