2013-03-03 27 views
0

我對STL並不太熟悉,所以我不確定這裏最好的方法。STL Vectorised Map - 尋找最佳實踐

我有一組操作,每個操作綁定到一個唯一的ID。爲了確保我不重複這些行爲,我最初認爲將它們存儲在一個std::map中,並在ID上鍵入。但是,我需要在內部保留嚴格的排序a lastd::vector,這樣當我展開我的動作時,它們會按照相反的順序顯示它們的添加。

任何給定的操作列表可以是從一個或兩個項目到幾千個任意位置。如果我切換到手動檢查vector是否有重複項(即迭代和識別ID),我會失去任何東西嗎?或者是否有某種形式的map或我可以使用的其他容器,可以通過ID進行查找,但是不會在內部對我的元素進行排序或重新排序?

+2

一個原油選項只是使用兩者;) – 2013-03-03 21:54:27

回答

2

您可能想要使用boost:multi_index地圖,該地圖可以支持地圖的插入順序。

struct Item 
{ 
     string name; 
     int data; 
}; 
struct ItemTag {}; 
typedef multi_index_container< 
    Item, 
    indexed_by< 
     random_access<>, // this index represents insertion order 
     hashed_unique< tag<ItemTag>, member<Item, string, &Item::name> > 
    > 
> ItemsMap; 
+0

謝謝,這看起來像一個解決方案。然而(它可能是異端!),我目前沒有使用Boost,它看起來像一個相當重量級的庫來解決這個問題(這是一個主要是MFC應用程序,我試圖帶入STL與更新的補充,但我不改造現有的'CArray'和'CMap'的東西)。 – Kyudos 2013-03-03 22:10:21

+0

然後我會建議同時使用兩個集合(map + vector)。地圖會給你快速查找,矢量將保持順序。 – nogard 2013-03-03 22:13:00

+0

請原諒我的密集程度,但是你的意思是純粹使用'map'來進行查找/重複檢查,並使用'vector'來存儲(或者[deque])(http://www.linuxsoftware.co.nz/ containerchoice.png)是我需要遵循的)?所以我的權衡是通過我的'int' ID映射稍微增加存儲空間(可能)? – Kyudos 2013-03-03 22:32:43

2

聲音對我說,你需要Boost.MultiIndex

升壓多指標集裝箱庫提供了一個類模板命名的multi_index_container使容器保持與不同的排序和訪問語義一個或多個索引的建設。索引提供的接口類似於STL容器的接口,使用它們很熟悉。在相同元素集合上進行多索引的概念是從關係數據庫術語中借鑑的,並且允許根據乘法索引關係表的精神指定複雜的數據結構,其中簡單集合和映射不夠。提供了廣泛的索引選擇,模仿類似的STL容器,如std :: set,std :: list和hashed sets。