2010-09-29 57 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

相關問題