【问题标题】:Why is a set used instead of a map? C++为什么使用集合而不是地图? C++
【发布时间】:2013-05-02 00:34:45
【问题描述】:

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

【问题讨论】:

    标签: c++ map set


    【解决方案1】:

    有很多操作只需要一个集合。使用地图只是额外的空间。

    1. 设置操作(联合、交叉等)。
    2. 保留数字、对象等集合中的唯一元素。

    【讨论】:

    • +1 这是我看到的真正问题。在许多情况下,您根本不需要键 - 为什么要使用地图?
    • 正确。当元素尺寸较小时,集合特别有用,因此插入+排序很快。此外,仅在元素数量较少时使用集合和映射才有效(此处较小是相对的)。你可能会发现这个讲座很有用 (youtube.com/watch?v=aIHAEYyoTUc),Alex 说尽可能多地使用数组/向量。
    【解决方案2】:

    set 用于将同一 type 的但彼此不同的项目分组(即,它们不是 equal)。比如数字12都是int类型,但是1!=2

    set 容器在您想要跟踪同质事物的集合作为一个组并对这些组执行数学运算(如交集、联合、差异等)时很有用。例如,假设搜索结果中的set 包含所有提及单词catdog 的文档。然后另一个set 包含所有提到单词pet 的文档。这两组中的union 将为您提供包含单词catdogpet 的文档组。请注意,这样的组不会有重复(即,如果一个文档最初在两个集合中,那么它只会在第二个集合中出现一次)。

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

    回到前面的例子,如果你想知道每个页面被访问了多少次,你可能可以沿着std::map<Page, int>的线创建一个映射,即页面之间的关系,以及数量每个人都被访问过的次数。

    请注意,地图的键形成set(可能这让很多人感到困惑),并且此属性的含义是您只能拥有给定的键一次(那里是一些深奥的容器,其中一个键可以映射到不同的值)。

    因此,如果您需要与整个群组和集合以及群组本身的成员进行交互,您可能需要set。如果您需要将某些事物与组或集合的成员关联,您可能需要map。如果关联跨越多个维度,您可能需要multi_map

    重要请注意,在 C++ 中,std::setstd::map有序的。 C++11 提供了替代的无序容器,称为std::unordered_setstd::unordered_map

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 所以集合总是有序的,而地图总是无序的?
      • A std::set 包含一个唯一的有序值列表。 std::multiset 可以有重复项,但包含的对象仍然是有序的。一个std::map 包含一组唯一的有序键,每个键都与一个值相关联。 std::multimap 可以包含重复的键,但键仍然是有序的。
      • 不正确 - std::map 不能包含重复的键,std::set 也不能。 std::multimapstd::multiset 可能包含多个。在纠正之前必须投反对票。
      • @NathanErnst 你误读了答案。答案指出 map 中的值可以是非唯一的,但没有说明键的唯一性——除了隐含的。
      • 鉴于措辞,我支持我的反对意见,直到澄清,或说明意图的实际代码示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多