2014-07-09 45 views
0

我有一個unordered_map<int, custom_object* >並有各種共享指針指向unordered_map中的每個條目。這個想法是這樣的,一旦所有的共享指針被破壞,該條目將被從unordered_map中刪除。 custom_object當前包含密鑰,以便它可以在銷燬時從unordered_map中刪除相應的條目。我想有一個更優雅的設計,也許實現unordered_map<int, shared_ptr<custom_object>>。對此有何想法?std :: unordered_map與共享指針自動銷燬條目

+0

您可以使用Boost Intrusive的auto_unlink功能。你必須切換到基於樹的(有序)映射,否則它可能會做你所需要的。更具體的細節將有所幫助,也許一些示例代碼完全顯示您的類型。 –

+0

這是朝正確方向邁出的一步。但是,您必須找出另一個從'unordered_map'中移除'custom_object *'的觸發器。你用來將它們從'unordered_map'中移除的觸發器將會消失。 –

+0

在你的unordered_map <>中使用weak_ptr <>。當一個條目的最後一個shared_ptr <>消失時,weak_ptr <>會告訴你該對象已經消失。缺點是物品停留在地圖上。 –

回答

3

您可以使用該刪除對象的shared_ptr一個定製刪除,並從地圖中刪除:當您創建一個custom_object做到這一點

class custom_object_deleter 
{ 
public: 
    custom_object_deleter(unordered_map<int, custom_object*>* map) : 
     map(map) 
    { 
    } 

    void operator()(custom_object* object) 
    { 
     // Remove object from map. 
     delete object; 
    } 

private: 
    unordered_map<int, custom_object*>* map 
}; 

然後:

shared_ptr<custom_object> my_custom_object(new custom_object, custom_object_deleter(&map)); 

對不起我只是匆匆這個快速,並沒有測試它的編譯錯誤...

但是,這仍然不是一個非常優雅的解決方案。您可能需要退一步,檢查需要的設計是否真的是最好的(也是最簡單的)。