“multiset”和“multimap” - 有啥意义?

Posted

技术标签:

【中文标题】“multiset”和“multimap” - 有啥意义?【英文标题】:"multiset" & "multimap" - What's the point?“multiset”和“multimap” - 有什么意义? 【发布时间】:2011-02-20 22:27:36 【问题描述】:

正如问题所述......我不明白multisets / multimaps 的意思。

那么,目的是什么?

【问题讨论】:

【参考方案1】:

http://www.cplusplus.com/reference/stl/multimap/

地图是一种联想 存储形成的元素的容器 通过键值的组合和 映射值,很像 map 容器,但允许不同 元素具有相同的键值。

这是一种元素可以共享密钥的注册表。你可以想到公司和员工。街道地址是关键,员工是价值。

【讨论】:

【参考方案2】:

这是Wikipedia 所说的关于用途的内容:

在学生注册系统中,学生可以注册 多个班同时,有 可能是每个人的关联 学生注册课程, 其中关键是学生证和 该值是课程 ID。如果一个 学生参加了三门课程, 将有三个协会 包含相同的密钥。 一本书的索引可以报告给定索引的任意数量的参考文献 术语,因此可以编码为 从索引词到任何的多重映射 参考地点的数量

【讨论】:

你能举个例子吗【参考方案3】:

如果您遇到的情况是,在大多数情况下键是唯一的,但有时它们不是唯一的,那么多映射将很有用。

例如,如果您正在创建一个使用哈希作为键的缓存类。大多数情况下,两个不同的对象不会有相同的散列,所以键是唯一的。但是您可能会遇到不同对象的哈希冲突,因此您需要一个多重映射来涵盖这种情况。

另一个例子是任何类型的非唯一索引(例如在数据库中)。

至于多重集合——我认为那些用处不大。我唯一能想到的就是将它用作一种自动排序的列表。

【讨论】:

【参考方案4】:

多重集或多重映射仅适用于可能存在多个特定项目的情况。例如,假设您想为一本书创建索引。你会浏览文本,扔掉所有真正常见的无意义单词(“a”、“an”、“the”等),然后列出所有其他单词,以及每个单词在书中的位置发生了。

相当多的单词会出现在多个页面上,在这种情况下,您将有多个条目从一个单词映射到不同的页面。一种处理方法是使用从单词到页码的多重映射。

【讨论】:

【参考方案5】:

一些用例:

多地图

以邮政编码为密钥,所有拥有该邮政编码的人 以账户 ID 为键,该人/账户的所有未结订单 字典,每个关键字都有各种解释

多组

本质上是一个带有键和整数计数的映射。

一个店铺的库存,所有产品都有自己的key和数量 仍然可用的是价值 某店铺累计销售数据,每卖出一件商品 产品 ID 被添加到多组中,从而增加了销售量

【讨论】:

【参考方案6】:

使用多图,无论您想在何处使用树状结构。

【讨论】:

[此答案被自动标记为“新用户提供的旧问题的迟到答案。此评论是在这种情况下。]此答案似乎没有给出任何理由或有任何研究价值。因此,请考虑大幅扩展答案或完全删除它。谢谢!【参考方案7】:

在向量/列表(或任何其他容器)上使用多重集的最重要的好处是查找操作的时间复杂度。 multiset 的平均情况时间复杂度为 O(logn),unordered_multiset 为 O(1)。 multimap 和 ordered_multimap 也是如此。

【讨论】:

以上是关于“multiset”和“multimap” - 有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

std::multimap::find 将返回哪个元素,类似地 std::multiset::find?

第十三篇:multimap容器和multiset容器中的find操作

C++ 关联容器set | map | multiset | multimap

强大的Guava中的新集合类型: Multiset, Multimap, BiMap, Table, ClassToInstanceMap, RangeSet, RangeMap等

在multimap或multiset中查找元素

C++进阶第二十篇——map和set(map和set的用法+multimap+multiset+map和set代码实现)