2010-07-13 38 views
5

我最初開始時使用std::multimap來存儲具有相同鍵的許多值,但後來我發現它並不保留具有相同鍵的值之間的插入順序。 This answer聲稱可以用boost::multi_index::multi_index_container完成,但沒有舉例。仔細看看這些文檔,沒有這種用法的例子,我不能讓你知道如何使用這個東西。我期望來自使用較少的增強庫的較差的文檔,但這需要蛋糕。任何人都可以向我指出一個教程或示例,它顯示它以我想要的方式使用,或者甚至可以自己提供一個示例?使用boost multi_index_container來保留插入順序

+0

你需要這是一個多地圖嗎? – doublep 2010-07-13 19:45:51

+0

是的,我喜歡。我有相同的鍵的多個值。 – rmeador 2010-07-13 19:53:03

回答

6

您可以通過使用boost::multi_index以及兩個索引:ordered_non_unique(允許具有相同鍵的值)和random_access(它將保留插入順序)來實現此目的。

struct some { 
    long key; 
    int data; 
    int more_data; 
    // etc. 
}; 

typedef multi_index_container< 
    some, 
    indexed_by<  
    random_access<>, // keep insertion order 
    ordered_non_unique< member<some, long, &some::key> > 
    > 
> some_mic_t; 
+1

支持這個答案,從boost文檔:**隨機訪問索引是自由順序序列與恆定時間位置訪問和隨機訪問迭代器。隨機訪問索引中的元素默認按其插入順序排序** – 2014-04-16 00:30:29

0

怎麼樣

map<int, vector<string> > 

map<int, list<string> > 

@Kirill:很好的回答。我懷疑Boost的random_access可能會很慢,因爲它會強制所有鍵的所有字符串保持在一個連續的結構中。而提問者只是希望將訂單保存在每個鍵的映射值集合中。

+0

'random_access'是一個附加索引。您使用'ordered_non_unique'進行搜索,然後使用'random_access'來遍歷結果範圍。這並不慢。 – 2010-07-14 04:39:50

+0

(我使用了multi_index很多,但不是random_index,所以我不太確定任何這個) @Kirill:兩點: @rmeador希望能夠「保留值之間的插入順序用同樣的鑰匙「。給定一個關鍵碼,整個隨機索引如何用於快速實現?我懷疑我建議的結構可能是做到這一點的唯一方法。 和 我的意思是插入新元素可能會比必要的慢,因爲整個隨機索引可能會過時。 – 2010-07-14 17:11:03

+1

@Kirill:澄清一下,一旦ordered_non_unique已經確定了與單個鍵相對應的(未排序)值範圍,那麼您如何(快速)使用random_access對該組值進行排序?這組值可能會均勻分佈在一個大的random_access索引中。遍歷random_access範圍將不會保持按鍵順序。 – 2010-07-14 17:14:47