我应该使用boost :: ptr_vector <t>还是vector <boost :: shared_ptr <t>&gt;?</boost :: shared_ptr <t> </t>

时间:2010-09-29 14:31:49

标签: c++ pointers boost stl containers

我需要一个指针容器。您会推荐boost::ptr_vector<T>还是std::vector<boost::shared_ptr<T> >? (或其他什么?)

如果感兴趣,我的实际数据结构相对复杂(参见here)并且当前存储对象,而不是指针,但我想改变它(使用指针容器),以便摆脱不必要的复制:

typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;

2 个答案:

答案 0 :(得分:31)

谁拥有该对象?如果容器拥有对象(意味着对象的寿命不应超过容器),请使用ptr_vector。否则,使用shared_ptr s的向量。标准库容器(例如std::vectorstd::list)拥有它们包含的对象,因此ptr_vector的语义更接近于此。

答案 1 :(得分:14)

shared_ptr<>确实具有共享所有者语义,这是通过递增和递减引用计数来实现的。这带来了一些开销,特别是在启用多线程时(因为那些计数器必须被锁定)。

如果您的对象已共享,请使用shared_ptr<> 但是如果它们被容器有效拥有,并且应该与容器一起死亡,并且在容器死亡时分发的引用(指针)也可能会死亡,那么使用指针容器,因为它们的开销较小。
如果您不确定,请使用shared_ptr以确保安全。如果结果表明您遇到了性能问题,可以随时进行优化。 (优化工作系统比使过早优化的系统更有效。)