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