是std :: multimap真的只是嵌套的矢量

时间:2014-04-04 11:48:11

标签: c++ vector stl multimap

我想使用std::multimap容器,但我需要知道它将始终保持顺序,因为第一个元素将是迭代的第一个元素,第二个元素将始终是第二个。<登记/> 我问的是这个:

std::multimap< key, value >是否等同于std::vector< std::pair< const key, std::vector< value > > >

4 个答案:

答案 0 :(得分:4)

多图不等同于矢量,而不是实现方面。 Multimaps通常实现为二叉搜索树。根据比较对象指示的严格弱顺序标准,多重映射的元素始终按其排序顺序保存。

因此,当您迭代多图的元素时,它们的顺序是比较对象提供的排序顺序。

答案 1 :(得分:2)

  

是std :: multimap&lt;键,值&gt;相当于std :: vector&lt;的std ::对&LT;   const key,std :: vector&lt;值&gt; &GT; &GT; ?

不,这是两个不同的容器,它们在存储底层数据,如何管理内存,如何访问这些数据以及存储数据的顺序方面表现出很多差异。在vector中,数据会按照您的推送顺序进行存储,但在multimap数据中始终会对数据进行排序,例如您插入multimap的最后一个值实际上可以通过multimap.begin()multimap.begin() + 10进行访问。

您可以在multimap中使用整数键,并使用递增键插入以强制排序顺序与插入顺序相同。

答案 2 :(得分:1)

虽然它们在实施方面不尽相同,但您的问题表明您真的只关心订购。我找到了与订购相关的以下信息:

  

Multimaps是关联容器,用于存储由a形成的元素   键值和映射值的组合,遵循特定的值   订单,以及多个元素可以拥有等效键的位置。

     

在内部,多图中的元素始终按其键排序   遵循由其指示的特定严格的弱排序标准   内部比较对象(比较类型)。

来源,cplusplus.com

答案 3 :(得分:1)

std::vector< std::pair< const key, std::vector< value > > >允许您对key元素进行任何排序,而std::multimap<key, value>则没有。

来自cppreference

  

Multimap是一个关联容器,其中包含键-值对的排序列表,同时允许使用同一键的多个条目。排序是根据应用于键的比较函数Compare完成的。

听起来您在问等效条目中的顺序是什么。

  

键值相等的键值对的顺序是插入顺序,并且不会更改。 (自C ++ 11起)

可以通过确保在所有现有的等价条目之后但所有键的条目都位于后面的新条目之前插入新条目,来保持矢量与多图提供的顺序相同。订购。一种简单的方法将限制所有插入操作

vec.insert(std::upper_bound(vec.begin(), vec.end(), to_insert, key_compare), to_insert);