2012-03-04 147 views
5

我對容器和集合之間的區別有點困惑。我在維基百科上閱讀了他們,這是我所瞭解的。集合和容器之間的區別

作品集:Stores可變物體數量。防爆。列表,集...

容器:DataStructures?防爆。出隊,堆棧..

但我認爲像列表,樹等集合是數據結構,那麼什麼是容器。這又是什麼意思..

實現容器的數據結構包括數組,列表,映射,隊列,集合,堆棧,表,樹和向量。

+0

我懷疑是否有實際區別。大多數人似乎交替使用它們。儘管如此,面向對象的層次結構可能會有一些奇怪的地方。我記得,Java有一個用於容器的類(或者可能是接口),但是你認爲容器的一些東西不適合這個名稱,所以在Java的討論中,我可以想象使用其他術語來引用另一個術語容器類的類(警告:我有一段時間沒有用過Java,所以我可能會記住錯誤的名字)。 – 2012-03-04 06:33:32

回答

6

Java沒有真正使用的術語‘容器’,除了在AWT GUI組件的情況下,其中Container代表一個GUI組件,可以含有其他成分。

Collection在Java中使用的包含對象,你描述的數據結構。一般

計算機科學傾向於將它們視爲或多或少的同義詞。

8

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

5

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"

2

的區別更多的是味道比物質,但感覺聽完這兩個術語時,我有是

  • 容器「具有」它包含的值
  • 集合「擁有」它引用的對象。

這顯然是主觀的,但考慮如何C++容器實現(值語義),以及如何Java的colloection的行爲(對象的多態性),什麼Java變量在技術上是(autodereferenced指針)這也許是所有因值/指針語義。

A C++容器不能在值多態的,但也可以是同態的指針多態值,所以C++ collection<T>可以只是一個container<unique_ptr<T> >(選擇要具體化的容器),其中container<T>有沒有嚴格的Java的對應關係。