多映射与矢量映射的优点是什么?
我不明白为什么multimap存在,如果我们可以创建矢量地图或集地图。 对我来说,唯一的区别是:多映射与矢量映射的优点是什么?
- 在多重映射使用
equal_range
为获得一个关键的元素和载体的地图,我们简单地使用[]
运营商和拥有的元素载体。 - 在多图中使用
multimap.insert(make_pair(key,value))
在矢量图中添加元素和map_of_vectors[key].push_back(value)
。
那么为什么要使用multimap?对我来说,最好有一个向量比两个迭代器来获得一个键的所有值。
这个问题也适用于矢量和unordered_multimap的unordered_map。
我想说这取决于是否所有具有相同键的值都有您想要解决的关系。
因此,例如,你是否经常浏览所有使用关键字X的元素,或将它们传递给函数,等等?然后将它们放在单独的容器中更方便,以便您可以直接处理。
但是,如果您只有一个项目集合,它们可能共享相同的键值,为什么要在两者之间使用向量?使用迭代器运行multimap比在map,vector情况下使用嵌套循环更方便。
查看此问题的另一种方法:如果每个键的多个条目非常常见,那么您的结构在映射矢量的情况下效率更高。如果他们很少发生,则情况正好相反。
谢谢。你和Artyom的回答让我看到了更多的差异。但是我仍然不相信multimap在实际生活中与矢量地图一样有用。但这是我个人的看法;) – 2010-12-15 18:36:00
两个迭代器???我认为你错了。当我使用std :: for_each()或其他算法的多图我只使用一个迭代器范围,它是该死的简单得多,担心与每个关键的向量。
有multimap<x, y>
和map<x, vector<y>>
一旦你已经插入一个值多重映射之间,你知道迭代器将保持 有效,直到您删除了很多重要的区别,这是非常强大的属性,你可以没有矢量地图。直到它被从地图上抹去
multimap<x,y>::iterator p=mymap.insert(make_pair(a,b));
迭代器仍然有效,而在第二种情况下, 将它每次无效,你的新条目添加到载体。
另请注意,map<x, vector<y>>
可能有一个用现有密钥设置的空值,而multimap不可以。
这些行为有所不同。
说实话,我错过了一些语言中的multimap,它们没有在他们的库中提供它。
我必须承认,我从来没有完全理解'multimap'的目的:/ – 2010-12-14 12:13:55
我稍微晚了一点,但由于额外的指针,multimap比矢量地图消耗更多的内存。我使用它们的唯一原因是如果我想保留每个元素的关键(做'push_back',你不会保留它) – Jcao02 2014-08-05 14:08:39
如果你不仅想跟踪不同值的重复键,但您也想要立即删除任何键/值对。矢量地图不适合这种情况,虽然您可以使用列表地图,但使用多地图更为方便。 – richizy 2016-07-11 17:27:58