集合用于通过提供通常用于检查数据是否存在的所有信息来获取对象的信息。地图用于通过使用密钥(单个数据)获取对象的信息。如果我错了,请纠正我。现在问题是为什么我们首先需要一个集合,我们不能用地图来查看数据是否存在?为什么我们需要提供所有信息才能看出它是否存在?
答案 0 :(得分:2)
有许多操作只需要一套。使用地图只是额外的空间。
答案 1 :(得分:1)
set
用于对相互之间不同的type
项目进行分组(即,它们不是equal
)。例如,数字1
和2
均为int
类型,但1!=2
。
set
容器非常有用,并对这些组执行数学运算(如交集,并集,差异等)。例如,假设set
个搜索结果包含提及单词cat
和dog
的所有文档。然后是另一个set
,其中包含提及单词pet
的所有文档。这两个集合中的union
会为您提供包含cat
,dog
和pet
字样的文档组。请注意,这样的组不会重复(即,如果文档最初在两个集合中,则在第二个集合中只有一次)。
maps
肯定是不一个set
,但可以将它们视为一种允许您将值与{{1}的每个元素相关联的排列}。它们用于表示关系。例如,为公司工作的set
人员具有相关联的set
;在这种情况下,employee_number
将是表示这种关系的有用结构。
回到上一个示例,如果您想知道每个页面被访问了多少次,您可能会创建一个map
行的地图,即页面之间的关系,以及每次访问的次数。
请注意,地图的键形成std::map<Page, int>
(可能这会让很多人感到困惑),这个属性的含义是你只能拥有一个给定的键一次 (有一些深奥的容器,其中一个键可以映射到不同的值)。
因此,如果您需要与组和集合作为一个整体进行交互,并且与组本身的成员进行交互,则可能需要set
。如果您需要关联某些内容与某个群组或某个集合的成员,可能您需要set
。如果关联跨越多个维度,则可能需要map
。
重要请注意,在C ++中multi_map
和std::set
已订购。 C ++ 11提供了名为std::map
和std::unordered_set
的替代无序容器。
答案 2 :(得分:0)
Set包含唯一的有序值列表,但Map可以包含使用密钥访问的一组非唯一的无序值。
可以用来确定某个对象是否存在,它取决于您的用例以及您需要如何访问该对象 - 您是否可以测试该Set是否包含您引用的对象,或者您需要通过一个或多个键来查找它才能进行比较?