多图比矢量图有什么优势?


75

我不明白,如果我们可以创建向量图或集合图,为什么存在多图。对我而言,唯一的区别是:

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

那么为什么要使用多图呢?对我来说,拥有一个向量要好于两个迭代器来获取键的所有值。

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


9
我必须承认,我从未完全理解以下目的multimap:/
Matthieu M. 2010年

我的问题有点晚了,但是由于额外的指针,多图比矢量图消耗更多的内存。我会使用它们的唯一原因是,如果我想保留每个元素的键(这样做push_back就不会保留)
Jcao02 2014年

如果不仅要跟踪具有不同值的重复键,而且还想立即删除任何键/值对,则Multimap非常有用。向量图不适合这种情况,虽然您可以使用列表图,但仅使用多图更为方便。
richizy 2016年

1
虽然我明白您的意思(而且我也不倾向于使用多图),但是map<K, V>set<pair<K, V>, cmp_first<K, V>>cmp_first比较.first成员的情况大致相同。
洛罗

Answers:


60

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

因此,例如,您是否经常使用键X遍历所有元素,或将它们传递给函数,依此类推?然后,将它们直接放在单独的容器中会更方便。

但是,如果您只有一个项目集合,这些项目可能共享或不共享相同的键值,为什么还要在两者之间使用向量?与使用嵌套的for循环的地图矢量案例相比,使用迭代器遍历多地图更为方便。

另一种看待这种情况的方式是:如果每个键有多个条目是很常见的,那么在map和vector情况下,您的结构会更有效。如果它们很少发生,则相反。


3
谢谢。您和Artyom的回答向我展示了更多差异。但是,我仍然不相信多图在现实生活中像矢量图一样有用。但这是我个人的看法;)
Mariusz Pawelski 2010年

我从这个答案中得到的实际摘录是:multimap可以使迭代器范围覆盖整个结构,但是这样的begin / end迭代器将迭代键和值对(可能不方便)。通过map<...,vector>迭代,整个结构会更加复杂,但是您可以具有相等值的正义序列的开始/结束迭代器。
Jarek C

56

multimap<x, y>和之间有许多重要区别map<x, vector<y>>

一旦将值插入到multimap中,便知道迭代器将保持有效,直到您将其删除为止,并且这是非常强大的属性,因此无法将其用于向量映射。

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

迭代器在从地图中删除之前一直保持有效,而在第二种情况下,每次向向量添加新条目时,迭代器都会失效。

另请注意,map<x, vector<y>>可能使用现有键设置了空值,而multimap没有。

这些是行为不同的不同事物。

老实说,我想念某些未在其库中提供的语言的multimap。


2
尽管迭代器失效的角度很有趣,但是您的语句每次向向量添加新条目时,它都会失效”。实际上是不正确的。仅当向量调整大小时,迭代器才会失效,否则不会……尽管由于您通常不知道/关心向量的调整大小,所以我们不应该围绕调整大小来设计代码,而只是假设迭代器在插入时变得无效!
纳瓦兹

@Nawaz考虑插入(添加新内容)并删除
Dawid Drozd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.