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_ptr
s 的向量.标准库容器(例如std::vector
或std::list
)拥有它们包含的对象,因此a的语义ptr_vector
更接近于它.
sbi*_*sbi 14
shared_ptr<>
确实有共享所有者语义,这是通过递增和递减引用计数来实现的.这带来了一些开销,特别是在启用多线程时(因为那些计数器必须被锁定).
如果您的对象是共享的,请使用shared_ptr<>
.
但是如果它们被容器有效地拥有,并且应该与容器一起死亡,并且当容器死亡时分发的引用(指针)也可能会死亡,那么使用指针容器,因为它们具有较少的开销.
如果您不确定,请使用shared_ptr
安全的一面.如果结果表明您遇到了性能问题,可以随时进行优化.(优化工作系统比使过早优化的系统更有效.)