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