【问题标题】:What is a "set" in C++? When are they useful?什么是 C++ 中的“集合”?它们什么时候有用?
【发布时间】:2010-11-26 08:21:06
【问题描述】:

我很难概念化 c++ 集合,实际上是一般集合。

它们是什么?它们有什么用处?

【问题讨论】:

  • 是的,谢谢。我什至读过关于集合的维基百科文章,但我发现的所有定义都在谈论“抽象数据结构”和“有限集合”。我想我只是希望有一个“傻瓜”简单的英文解释......所以我想我不能真的责怪你暗示我很愚蠢而不是真正帮助。
  • @Monte,如果我以任何方式冒犯了你,我深表歉意。我只是建议搜索谷歌,因为有很多文章解释了有问题的概念。
  • @Aziz 不用担心!我看到你已经回答了很多问题。我应该不那么刻薄。

标签: c++ set computer-science


【解决方案1】:

有关 C++ 中集合的无序实现,请查看 Boost.Unordered。在许多情况下,这比 STL 集更好,我个人或多或少地只使用它来逐步构建排序列表。

【讨论】:

    【解决方案2】:

    它们是什么?

    集合就是集合。

    一个集合就像一个字典或键/值对的“映射”,除了它只存储(是一个集合)没有关联值的键。

    一个集合要么包含或不包含每个可能的键值的实例。例如,一组整数可能包含值 {0, 1, 5}。一个值(例如 5)不能在集合中多次包含(如果您为给定的键值多次调用集合的插入方法,则集合仍将仅包含该键值的一个实例)。

    它们有什么用处?

    我几乎不像地图那样经常使用它们。

    如果我是一个库,它会提供客户端用作句柄的指针。我将保留一个私有集,其中包含我创建的所有有效句柄值。当客户端给我一个句柄时,我将通过测试该值是否包含在我的集合中来测试该句柄是否为有效句柄。

    【讨论】:

    • 让我感到困惑的设置代码正在使用它们,就像您跟踪句柄一样。
    【解决方案3】:

    STL seta red-black tree(至少我认为它是这样实现的)

    另一种看待它的方式。

    因此属性、快速元素搜索、元素排序、元素唯一性、有序遍历等等。

    当您想要跟踪唯一元素(例如唯一字符串或整数列表)时很有用,但您也可以存储更复杂的结构。

    【讨论】:

      【解决方案4】:

      Sets“一般”是数学中的一个(非常基本的)概念。

      STL 的set 基于集合的数学概念:它是唯一成员的集合,或 STL 术语中的“唯一关联容器”。有点奇怪的是它对元素进行排序(在数学集合中,元素没有“顺序”)。

      一些 STL 实现还支持hash_set,它与set 非常相似,因为它也是集合的数学概念的模拟。 set 和 hash_set 之间的最大区别在于 hash_sets 对它们的元素进行排序,它们具有不同的性能特征(O(1) 而不是 O(log n) 查找,假设一个好的哈希函数),当然它们不是标准的。

      【讨论】:

        【解决方案5】:

        如果您在总体上无法理解集合,请不要难过。数学学位的大部分时间都花在了解集合论上:

        http://en.wikipedia.org/wiki/Set_theory

        将集合视为唯一的、无序对象的集合。在许多方面它看起来像一个列表:

        { 1, 2, 3, 4 }

        但顺序并不重要:

        { 4, 3, 2, 1} = { 1, 2, 3, 4}

        并且重复被忽略:

        { 1, 1, 2, 3, 4 } = { 1, 2, 3, 4}

        C++ 集合是这个数学对象的实现,具有内部排序的奇数特征。但这只是实现的一个细节,与理解数据结构无关。排序只是为了速度。

        【讨论】:

          【解决方案6】:

          Citing Wikipedia:

          集合是不同的集合 对象,被认为是一个对象 自己的权利。套装是其中之一 中最基本的概念 数学。虽然是发明的 在 19 世纪末,设置 理论现在是无处不在的一部分 数学,并且可以用作 几乎所有的基础 数学可以推导出来。

          【讨论】:

            【解决方案7】:

            “Set”是一种存储多个但唯一对象的集合。当您想收集对象但不关心它们的顺序或同一对象在其中的次数时,它很有用。

            查看更多详情:Set in C++

            【讨论】:

            • "当您想收集对象但不关心它们的顺序或同一对象在其中的多少次时,它很有用。"当您不能/不想使用集合时,这不正是这种情况吗?当您确实关心订单并且不想重复时,一套非常有用。
            • 正如 DeusAduro 所说,一个 c++ Set 存储排序的元素,并且只允许一个唯一的实例。
            • 你说得对!我与 Java 中的 Set 混淆了。对不起。
            【解决方案8】:

            C++ STL 集是保证集合内元素的排序和唯一性的关联映射(多重集保证前者但不保证后者)。

            它们通常用作集合操作的一部分,例如联合、交集和其他涉及包含/排除集合中元素的交互。

            【讨论】:

              猜你喜欢
              • 2011-03-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多