我需要一个指针容器。您会推荐boost::ptr_vector<T>
还是std::vector<boost::shared_ptr<T> >
? (或其他什么?)
如果感兴趣,我的实际数据结构相对复杂(参见here)并且当前存储对象,而不是指针,但我想改变它(使用指针容器),以便摆脱不必要的复制:
typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;
答案 0 :(得分:31)
谁拥有该对象?如果容器拥有对象(意味着对象的寿命不应超过容器),请使用ptr_vector
。否则,使用shared_ptr
s的向量。标准库容器(例如std::vector
或std::list
)拥有它们包含的对象,因此ptr_vector
的语义更接近于此。
答案 1 :(得分:14)
shared_ptr<>
确实具有共享所有者语义,这是通过递增和递减引用计数来实现的。这带来了一些开销,特别是在启用多线程时(因为那些计数器必须被锁定)。
如果您的对象已共享,请使用shared_ptr<>
但是如果它们被容器有效拥有,并且应该与容器一起死亡,并且在容器死亡时分发的引用(指针)也可能会死亡,那么使用指针容器,因为它们的开销较小。
如果您不确定,请使用shared_ptr
以确保安全。如果结果表明您遇到了性能问题,可以随时进行优化。 (优化工作系统比使过早优化的系统更有效。)