我应该使用boost :: ptr_vector <T>还是vector <boost :: shared_ptr <T >>?

Fra*_*ank 17 c++ containers boost pointers stl

我需要一个容器指针.你会推荐boost::ptr_vector<T>还是std::vector<boost::shared_ptr<T> >?(或者是其他东西?)

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

typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 32

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

  • @Didier:不,`ptr_vector`允许复制`vector`,它深层复制内容(使用`new_clone`自由函数),从而允许多态容器.它还具有更好的接口(解除引用迭代器产生对象的引用,而不是对指向对象的指针)和其他好东西. (9认同)

sbi*_*sbi 14

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

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

  • +1表示"优化工作系统然后过早优化系统工作更容易." (6认同)