2016-03-15 49 views
0

比方說,我有課,看起來像這樣:unique_ptrs,shared_ptrs或ID的商店列表?

class Foo 
{ 
public: 
    Foo(); 
private: 
    int id; 
    //Other data... 
    std::list<???> connected_foo; 
} 

class Bar 
{ 
public: 
    Bar(); 
private: 
    std::list<std::unique_ptr<Foo> > all_foo; 
} 

Foo類,我創建一個圖表狀結構,使得一些Foo對象鏈接到其他Foo對象。

在C++ 11,這是最 「正確」?具體來說,???應該是什麼? unique_ptr的列表? shared_ptr的列表?或者是一個int的列表,帶有一個遍歷all_foo並查找特定對象的函數?

或者我應該使用不同的數據結構一起(即,map)?我知道Boost庫提供了圖表,但這比我在這裏尋找的要多一點(a.k.a.想堅持C++標準庫)。

如果「正確」的說法太含糊(可能是),假設的重點是可讀性,最低可能到因果內存泄漏,易於理解,在這個順序。

有兩點要注意:我是相當新的C++(由C來),所以我試圖不使用C++爲「C與OO」。在C中,我會使用一個指針數組,最有可能稱它爲一天(特別是因爲我知道在程序結束之前對象不會被釋放)。無法創建unique_ptr的副本正在讓我有點沮喪。我在這裏瞄準的具體應用是用邏輯門創建一個電路(使用OO)。這是一個(畢業)學校項目。

+1

請不要使用'std :: list',除非你知道你爲什麼要特意使用它。它通常是所有標準容器中性能最差的。如果你只需要一個「列表」,你的第一個選擇應該是'std :: vector'。 –

+0

@RobK - 我用'std :: list'去了,因爲我只需要在一個方向上(從前到後)遍歷它,而且我永遠不需要通過索引來訪問。在這種情況下它仍然是性能最差的嗎? – tonysdg

+0

@RobK - 沒關係。剛剛閱讀這個問題:http://programmers.stackexchange.com/questions/185222/what-is-the-point-of-using-lists-over-vectors-in-c 'std :: vector'它是!:) – tonysdg

回答

1

也許不可能給出答案不知道您的完整的用例。但是,如果真的Bar擁有所有Foo S和會活得比他們的一切(正如你在你的問題說出)我建議:

std::vector<Foo*> connected_foo; 

沒有錯,原始指針 - 我們不使用它們來傳達任何所有權語義,只是觀察。

具有unique_ptr<Foo>容器是錯誤的 - Bar已經擁有獨特的所有權。你可以讓他們shared_ptr<Foo>(和更改Bar分享所有權)。這將是正確的,但如果Bar真的擁有它們,這是沒有必要的。存儲ID代表意味着查找更昂貴,所以我不確定這會帶來什麼好處。

+0

聽起來不錯 - 對問題的普遍性表示歉意,但增加一個完整的用例可能會使問題的大小增加兩倍(對其他用戶而言,這比其他用戶更少)。很高興知道當所有權不被傳達時,C++中的原始指針仍然可以使用(儘管顯然我需要確保它們指向的活躍性,或者包括檢查它們在哪裏使用)。 – tonysdg

0

如果您不打算遍歷all_foo並在每次刪除對象時清除所有對象中的引用,則可以使用std::list<std:weak_ptr<Foo>> connected_foo;並根據需要檢查並更新connected_foo。然後,當你想在節點中使用連接的foo時,首先將其鎖定爲共享並檢查它是否存在,如果不存在,則將其從連接列表中刪除。請注意,您必須將std::list<std::shared_ptr<Foo>>保留在all_foo中。