Dois-je utiliser boost::ptr_vector<T> vector<boost::shared_ptr<T> >?
J'ai besoin d'un conteneur de pointeurs. Recommanderiez-vous boost::ptr_vector<T>
ou std::vector<boost::shared_ptr<T> >
? (Ou quelque chose d'autre?)
Si c'est de l'intérêt, mes données réelles de la structure est relativement complexe (voir ici) et, actuellement, de magasins des objets, pas des pointeurs, mais je voudrais changer cela (à l'aide du pointeur de conteneurs), afin de se débarrasser de copie inutile:
typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;
d'où vient cette copie inutile de se produire?
Quand vous insérer quelque chose dans le vecteur ou le multimap à partir de ci-dessus.
Quand vous avez un conteneur qui stocke des pointeurs, seul le pointeur sera copié lors de l'ajout de données, lorsque vous stockez des objets, ces objets seront copiés. C'est un problème lorsque vous avez affaire à des objets qui sont coûteux à copier.
Quand vous insérer quelque chose dans le vecteur ou le multimap à partir de ci-dessus.
Quand vous avez un conteneur qui stocke des pointeurs, seul le pointeur sera copié lors de l'ajout de données, lorsque vous stockez des objets, ces objets seront copiés. C'est un problème lorsque vous avez affaire à des objets qui sont coûteux à copier.
OriginalL'auteur Frank | 2010-09-29
Vous devez vous connecter pour publier un commentaire.
Qui est propriétaire de l'objet? Si le conteneur possède les objets (ce qui signifie que les objets ne doivent pas vivre plus longtemps que le conteneur), utiliser un
ptr_vector
. Sinon, utilisez un vecteur deshared_ptr
s. Les conteneurs de la bibliothèque Standard (commestd::vector
oustd::list
) propre les objets qu'elles contiennent, de sorte que la sémantique d'unptr_vector
est plus proche.vector
deunique_ptr
la même chose qu'unptr_vector
?Je ne sais pas assez sur
unique_ptr
de répondre à cette question. Cependant, laptr_vector
aura moins de frais généraux (comme @sbi le souligne dans sa réponse).non,
ptr_vector
permet de copier de lavector
, profond copies le contenu (à l'aide denew_clone
fonction libre) et permettre ainsi polymorphes conteneurs. Il a également la plus belle interface (référence à l'itérateur donne une référence à l'objet, pas une référence pour le pointeur vers l'objet) et d'autres goodies.OriginalL'auteur
shared_ptr<>
ne partagent propriétaire sémantique, qui est mis en œuvre par le biais de l'incrémentation et la décrémentation du nombre de références. Qui vient avec des frais généraux, en particulier lorsque le multi-threading est activé (car ces compteurs doivent ensuite être verrouillé).Si vos objets sont partagés, utilisez
shared_ptr<>
.Mais si elles sont effectivement détenus par le conteneur, et devrait mourir avec le conteneur, et les références (pointeurs) remis pourrait aller morts aussi bien lorsque le conteneur meurt, puis utilisez le pointeur de conteneurs, parce qu'ils ont moins de frais généraux.
Si vous n'êtes pas sûr, utilisez
shared_ptr
pour être sur le côté sécuritaire. Si il s'avère que vous avez un problème de performance, vous pouvez toujours optimiser plus tard. (Il est plus facile d'optimiser un système de travail que pour obtenir une prématurément le système optimisé de travail.)It's easier to optimize a working system then to get a prematurely optimized system working.
+1 pour "doit mourir avec le conteneur".
OriginalL'auteur