1

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

4

3 回答 3

2

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

  1. 集合操作(​​联合、交叉等)。
  2. 从数字、对象等的集合中保留独特的元素。
于 2013-05-02T00:59:48.060 回答
1

Aset用于对彼此不同的相同项目进行分组type(即它们不是equal)。例如,数字12都是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_setstd::unordered_map

于 2013-05-02T01:21:01.883 回答
0

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

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

于 2013-05-02T00:38:18.343 回答