为什么使用集合代替地图? C ++

时间:2013-05-02 00:34:46

标签: c++ map set

集合用于通过提供通常用于检查数据是否存在的所有信息来获取对象的信息。地图用于通过使用密钥(单个数据)获取对象的信息。如果我错了,请纠正我。现在问题是为什么我们首先需要一个集合,我们不能用地图来查看数据是否存在?为什么我们需要提供所有信息才能看出它是否存在?

3 个答案:

答案 0 :(得分:2)

有许多操作只需要一套。使用地图只是额外的空间。

  1. 设置操作(Union,Intersection等)。
  2. 从数字,对象等集合中保留独特元素。

答案 1 :(得分:1)

set用于对相互之间不同的type项目进行分组(即,它们不是equal)。例如,数字12均为int类型,但1!=2

当您想要将同类事物的集合作为一组跟踪时,

set容器非常有用,并对这些组执行数学运算(如交集,并集,差异等)。例如,假设set个搜索结果包含提及单词catdog的所有文档。然后是另一个set,其中包含提及单词pet的所有文档。这两个集合中的union会为您提供包含catdogpet字样的文档组。请注意,这样的组不会重复(即,如果文档最初在两个集合中,则在第二个集合中只有一次)。

maps肯定是一个set,但可以将它们视为一种允许您将值与{{1}的每个元素相关联的排列}。它们用于表示关系。例如,为公司工作的set人员具有相关联的set;在这种情况下,employee_number将是表示这种关系的有用结构。

回到上一个示例,如果您想知道每个页面被访问了多少次,您可能会创建一个map行的地图,即页面之间的关系,以及每次访问的次数。

请注意,地图的键形成std::map<Page, int>(可能这会让很多人感到困惑),这个属性的含义是你只能拥有一个给定的键一次 (有一些深奥的容器,其中一个键可以映射到不同的值)。

因此,如果您需要与组和集合作为一个整体进行交互,并且与组本身的成员进行交互,则可能需要set。如果您需要关联某些内容与某个群组或某个集合的成员,可能您需要set。如果关联跨越多个维度,则可能需要map

重要请注意,在C ++中multi_mapstd::set 已订购。 C ++ 11提供了名为std::mapstd::unordered_set的替代无序容器。

答案 2 :(得分:0)

Set包含唯一的有序值列表,但Map可以包含使用密钥访问的一组非唯一的无序值。

可以用来确定某个对象是否存在,它取决于您的用例以及您需要如何访问该对象 - 您是否可以测试该Set是否包含您引用的对象,或者您需要通过一个或多个键来查找它才能进行比较?