集合和容器之间的区别

时间:2012-03-04 06:27:24

标签: java c++ collections containers

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

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

容器:DataStructures?防爆。 dequeue,stack ..

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

  

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

4 个答案:

答案 0 :(得分:9)

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

C ++标准说:“序列是一种容器,它将所有相同类型的有限对象组织成严格的线性排列。”三种类型的序列是vector,list和deque。

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

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

http://soa.sys-con.com/node/39460获取,您可以阅读本文,以便更好地理解容器和集合概念。

答案 1 :(得分:9)

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

如您所述,

Collection在Java中用于包含对象的数据结构。

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

答案 2 :(得分:6)

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

  

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

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

  

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

     

容器:DataStructures?防爆。 dequeue,stack ..

     

但我认为像list,tree等的集合是数据结构,   什么是容器。这又是什么意思..

据我所知,标准没有相反指定任何内容,这些都是集合和容器。它们也恰好是数据结构,但“数据结构”是一种非常通用的计算机科学术语,适用于以某种方式组织数据的任何类型的聚合。

使用C ++,你会发现一个更有用的区别在于Stephanov设想的原始STL定义的概念。

  

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

上面介绍了listdequevector等容器。

  

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

以上介绍了setmap等容器。

  

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

以上描述了map等容器。

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

答案 3 :(得分:3)

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

  • container“拥有”它包含的值
  • collection“拥有”它所引用的对象。

这显然是主观的,但考虑到如何实现C ++容器(值语义)以及Java colloection的行为(对象的多态性),以及技术上的Java变量(自动引用指针),可能都是由于值/指针语义。

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