85

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

  • 在 multimap 中使用equal_range来获取键的元素,在向量的映射中,我们只需使用[]运算符并拥有元素向量。
  • multimap.insert(make_pair(key,value))在 multimap 中用于添加元素和map_of_vectors[key].push_back(value)在向量图中使用。

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

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

4

2 回答 2

65

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

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

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

另一种看待这个问题的方式:如果每个键有多个条目很常见,那么您的结构在映射、向量情况下更有效。如果它们很少发生,则相反。

于 2010-12-14T10:07:08.100 回答
61

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。

于 2010-12-14T12:34:24.550 回答