【问题标题】:Difference between Collection and Container集合和容器之间的区别
【发布时间】:2012-03-04 06:27:23
【问题描述】:

我对容器和集合之间的区别有点困惑。我在维基百科上读到了它们,这就是我所理解的..

集合:存储可变数量的对象。前任。列表,设置...

容器:数据结构?前任。出队,堆栈..

但我认为列表、树等集合是数据结构,那么什么是容器。还有什么意思。。

实现容器的数据结构包括数组、列表、映射、 队列、集合、堆栈、表、树和向量。

【问题讨论】:

  • 我怀疑是否存在实际差异。大多数人似乎可以互换使用它们。不过,OO 层次结构中可能有一些奇怪之处。我记得,Java 有一个用于容器的类(或者可能是接口),但是您认为容器的某些东西不符合该名称,因此在讨论 Java 时,我可以想象使用其他术语来指代另一个类似容器的类(警告:我有一段时间没有使用 Java,所以我可能记错了名称)。

标签: java c++ collections containers


【解决方案1】:

Java 并没有真正使用术语“容器”,除非是在 AWT GUI 组件的上下文中,其中 Container 表示可以包含其他组件的 GUI 组件。

Collection 在 Java 中用于包含对象的数据结构,如您所描述的。

一般来说,计算机科学倾向于将它们视为或多或少的同义词。

【讨论】:

    【解决方案2】:

    " C++ 语言标准 (ISO/IEC 14882-1998[E]) 在第 23 条中说容器是“C++ 程序可以用来组织信息集合的组件”,并补充说:“容器是存储其他对象的对象. 它们通过构造函数、析构函数、插入和擦除操作来控制这些对象的分配和释放。”它继续列出了两种通用类型的容器:序列容器和关联容器。

    C++ 标准说:“序列是一种容器,它将一组有限的对象(所有类型相同)组织成严格的线性排列。”序列的三种类型是向量、列表和双端队列。

    C++ 容器不能包含混合类型!

    也许最有用的 C# 集合根本不被视为集合。 C# 数组比 C++ 数组强大得多,并且它们本身支持许多需要 C++ 中的类的操作。例如,Length 属性告诉您数组中元素的数量,就像 C++ 容器中的 size() 方法一样。 "

    取自http://soa.sys-con.com/node/39460,你可以阅读这篇文章来更好地理解容器和集合的概念。

    【讨论】:

    • C# arrays are much more powerful than C++ arrays 是的,苹果不是橙子。
    【解决方案3】:

    ISO C++ 标准确实没有建立非常明确的区别。它确实为容器(23.2.1)提供了正式定义:

    容器是存储其他对象的对象。

    ...但它没有为 collection 提供这样的正式定义,并且更普遍地使用了该术语。例如,它将元组描述为对象的集合,即使按照上面的定义,它也是一个容器

    集合:存储可变数量的对象。前任。列表,设置...

    容器:数据结构?前任。出队,堆栈..

    但我认为列表、树等集合是数据结构, 那么什么是容器。还有什么意思..

    在我看来,标准并没有相反的规定,它们既是集合又是容器。它们也恰好是数据结构,但“数据结构”是一个非常通用的计算机科学术语,用于以某种方式组织数据的任何类型的聚合。

    对于 C++,您会发现一个更有用的区别在于由 Stephanov 构想的原始 STL 定义的概念。

    序列是一个可变大小的容器,其元素被排列 以严格的线性顺序。它支持插入和删除 元素。

    上面描述了listdequevector等容器。

    排序关联容器是关联容器的一种。 排序关联容器在其键上使用排序关系; 如果两个键都不小于 另一个。 (如果排序关系是不区分大小写的字符串 比较,例如,那么键“abcde”和“aBcDe”是 等价的。)

    上面描述了像setmap这样的容器。

    一对关联容器是一个关联容器, 将键与其他对象相关联。 Pair 的值类型 关联容器是对的。 [1]

    上面描述了像map这样的容器。

    关于这个主题的进一步阅读,关于细微的语义差异:OOP Terminology: "Container" & "Collection"

    【讨论】:

      【解决方案4】:

      区别更多的是味道而不是实质,但是我听这两个术语时的感觉是

      • 容器“具有”它所包含的值
      • 集合“拥有”它所引用的对象。

      这显然是主观的,但考虑到 C++ 容器的实现方式(值语义)和 Java 集合的行为方式(对象的多态性),以及 Java 变量在技术上是什么(自动解引用指针),这可能都是由于 value/指针语义。

      C++ 容器的值不能是多态的,但在指向多态值的指针中可以是同态的,因此 C++ collection<T> 可以只是 container<unique_ptr<T> >(选择要具体化的容器),其中 container<T> 有没有严格的 java 对应关系。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 2018-10-23
        • 1970-01-01
        • 2020-10-03
        • 2010-11-01
        • 2016-07-23
        相关资源
        最近更新 更多