2010-09-29 58 views
16

我需要一个指针的容器。您会推荐boost::ptr_vector<T>std::vector<boost::shared_ptr<T> >? (或其他东西?)我应该使用boost :: ptr_vector <T>还是vector <boost :: shared_ptr <T>>?

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

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

这种不必要的复制发生在哪里? – 2010-09-29 14:34:20

+0

@Idan:任何时候你从上面插入东西到vector或multimap中。 – Frank 2010-09-29 14:40:40

+3

@Idan:当你有一个存储指针的容器时,当添加数据时只有指针会被复制,当你存储对象时,实际的对象将被复制。当处理昂贵的对象时,这是一个问题。 – sbi 2010-09-29 15:46:42

回答

30

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

+0

Add'l question:是'unique_ptr'的'vector'与'ptr_vector'相同吗? – 2010-09-29 14:36:34

+0

@Didier:我不太了解'unique_ptr'来回答这个问题。然而,'ptr_vector'开销较小(因为@sbi指出他的答案)。 – 2010-09-29 14:40:09

+8

@Didier:不,''ptr_vector'允许拷贝'vector',它可以深度复制内容(使用'new_clone'自由函数),从而允许多态容器。它也有更好的接口(取消引用迭代器产生对象的引用,而不是对该对象的指针的引用)和其他好东西。 – 2010-09-29 15:29:28

13

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

如果您的对象是共享的,请使用shared_ptr<>
但是,如果它们实际上由容器拥有,并且应该与容器一起死掉,并且在容器死亡时分发的引用(指针)也可能会死掉,然后使用指针容器,因为它们的开销较小。
如果您不确定,请使用shared_ptr以保证安全。如果事实证明你有性能问题,你可以随时进行优化。 (优化工作系统比获得过早优化的系统工作更容易。)

+6

+1对于优化工作系统更容易,然后得到过早优化的系统工作。' – balki 2012-08-16 10:14:16

+0

对于_的+1应该与容器一起死亡_。 – mskfisher 2013-08-08 12:39:20

相关问题