Dois-je utiliser boost::ptr vector ou vector?
j'ai besoin d'un conteneur de pointeurs. Voulez-vous recommander boost::ptr_vector<T>
ou std::vector<boost::shared_ptr<T> >
? (Ou quelque chose d'autre?)
si cela vous intéresse, ma structure de données actuelle est relativement compliquée (voir ici) et stocke actuellement des objets, pas des pointeurs, mais j'aimerais changer cela( en utilisant des conteneurs pointeurs), afin de se débarrasser de la copie inutile:
typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;
2 réponses
à qui appartient l'objet? si le conteneur possède les objets (ce qui signifie que les objets ne doivent pas vivre plus longtemps que le conteneur), utilisez un ptr_vector
. Sinon, utilisez un vecteur de shared_ptr
S. Les conteneurs de bibliothèque Standard (tels que std::vector
ou std::list
) posséder les objets qu'ils contiennent, donc la sémantique d'un ptr_vector
est plus proche.
shared_ptr<>
possède une sémantique de propriétaire partagé, qui est mis en œuvre par incrémentation et Décrémentation des comptes de référence. Cela vient avec un peu de sur-place, surtout quand le multi-threading est activé (parce que ces compteurs doivent alors être verrouillés).
Si vos objets sont partagés, utilisez shared_ptr<>
.
Mais s'ils sont effectivement possédés par le conteneur, et devraient mourir avec le conteneur, et les références (pointeurs) distribués pourrait être mort 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 fonctionnel que de faire fonctionner un système optimisé prématurément.)