2010-07-13 36 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