2010-12-14 236 views
54

我不明白为什么multimap存在,如果我们可以创建矢量地图或集地图。 对我来说,唯一的区别是:多映射与矢量映射的优点是什么?

  • 在多重映射使用equal_range为获得一个关键的元素和载体的地图,我们简单地使用[]运营商和拥有的元素载体。
  • 在多图中使用multimap.insert(make_pair(key,value))在矢量图中添加元素和map_of_vectors[key].push_back(value)

那么为什么要使用multimap?对我来说,最好有一个向量比两个迭代器来获得一个键的所有值。

这个问题也适用于矢量和unordered_multimap的unordered_map。

+6

我必须承认,我从来没有完全理解'multimap'的目的:/ – 2010-12-14 12:13:55

+0

我稍微晚了一点,但由于额外的指针,multimap比矢量地图消耗更多的内存。我使用它们的唯一原因是如果我想保留每个元素的关键(做'push_back',你不会保留它) – Jcao02 2014-08-05 14:08:39

+0

如果你不仅想跟踪不同值的重复键,但您也想要立即删除任何键/值对。矢量地图不适合这种情况,虽然您可以使用列表地图,但使用多地图更为方便。 – richizy 2016-07-11 17:27:58

回答

42

我想说这取决于是否所有具有相同键的值都有您想要解决的关系。

因此,例如,你是否经常浏览所有使用关键字X的元素,或将它们传递给函数,等等?然后将它们放在单独的容器中更方便,以便您可以直接处理。

但是,如果您只有一个项目集合,它们可能共享相同的键值,为什么要在两者之间使用向量?使用迭代器运行multimap比在map,vector情况下使用嵌套循环更方便。

查看此问题的另一种方法:如果每个键的多个条目非常常见,那么您的结构在映射矢量的情况下效率更高。如果他们很少发生,则情况正好相反。

+2

谢谢。你和Artyom的回答让我看到了更多的差异。但是我仍然不相信multimap在实际生活中与矢量地图一样有用。但这是我个人的看法;) – 2010-12-15 18:36:00

-1

两个迭代器???我认为你错了。当我使用std :: for_each()或其他算法的多图我只使用一个迭代器范围,它是该死的简单得多,担心与每个关键的向量。

40

multimap<x, y>map<x, vector<y>>

一旦你已经插入一个值多重映射之间,你知道迭代器将保持 有效,直到您删除了很多重要的区别,这是非常强大的属性,你可以没有矢量地图。直到它被从地图上抹去

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b)); 

迭代器仍然有效,而在第二种情况下, 将它每次无效,你的新条目添加到载体。

另请注意,map<x, vector<y>>可能有一个用现有密钥设置的空值,而multimap不可以。

这些行为有所不同。

说实话,我错过了一些语言中的multimap,它们没有在他们的库中提供它。