集合和容器之间的区别

问题描述:

我对容器和集合之间的区别有点困惑。我在*上阅读了他们,这是我所了解的。集合和容器之间的区别

作品集:Stores可变物体数量。防爆。列表,集...

容器:DataStructures?防爆。出队,堆栈..

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

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

+0

我怀疑是否有实际区别。大多数人似乎交替使用它们。尽管如此,面向对象的层次结构可能会有一些奇怪的地方。我记得,Java有一个用于容器的类(或者可能是接口),但是你认为容器的一些东西不适合这个名称,所以在Java的讨论中,我可以想象使用其他术语来引用另一个术语容器类的类(警告:我有一段时间没有用过Java,所以我可能会记住错误的名字)。 – 2012-03-04 06:33:32

Java没有真正使用的术语‘容器’,除了在AWT GUI组件的情况下,其中Container代表一个GUI组件,可以含有其他成分。

Collection在Java中使用的包含对象,你描述的数据结构。一般

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

C++语言标准(ISO/IEC 14882-1998 [E])按照上款23说,容器是 ”即C++程序可用于组织的信息的集合的部件,“ 并增加了:” 集装箱是存储其他对象的对象。他们控制通过构造函数分配和这些对象的释放,析构函数,插入和删除操作“它接着列举了两种一般类型的容器:序列和关联容器

的C++标准说,”一个序列是一种容器的,组织的有限集合的对象,所有相同类型的,成严格的线性布置。”这三个类型的序列是矢量,列表和双端队列。

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

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

采取从http://soa.sys-con.com/node/39460,你可以阅读这篇文章很好理解的集装箱和集概念。

+6

'C#数组比C++数组强大得多'是的,苹果不是橙子。 – 2012-03-04 07:45:14

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

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

...但它提供了收集没有这种正式的定义和使用该术语多一点一般。它描述元组,例如,作为对象的集合,尽管通过上面的定义,它也是容器

作品集:Stores可变数量的对象。防爆。列表,集...

容器:DataStructures?防爆。出队,堆栈..

但我认为像列表,树等集合是数据结构,然后什么是容器。这又是什么意思..

就我所见,并且标准没有指定任何相反的内容,这些都是集合和容器。它们也恰好是数据结构,但“数据结构”是任何以某种方式组织数据的聚合的非常普遍的计算机科学术语。

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

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

以上描述的容器如listdequevector

Sorted Associative Container是一种关联容器。 Sorted Associative Containers在其关键字上使用排序关系; 两个键被认为是等效的,如果其中一个小于 另一个。 (如果排序关系是不区分大小写的字符串 比较,例如,然后将键“ABCDE”和“ABCDE”是 当量。)

以上描述类似setmap容器。

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

以上描述的容器如map

至于方面在这个问题上进一步阅读的细微语义差别:OOP Terminology: "Container" & "Collection"

的区别更多的是味道比物质,但感觉听完这两个术语时,我有是

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

这显然是主观的,但考虑如何C++容器实现(值语义),以及如何Java的colloection的行为(对象的多态性),什么Java变量在技术上是(autodereferenced指针)这也许是所有因值/指针语义。

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