2009-09-07 388 views
4

我很難概念化C++集,實際上一般設置。什麼是C++中的「set」?他們什麼時候有用?

它們是什麼?它們如何有用?

+1

http://www.google.com/search?q=c%2B%2B+sets – Aziz 2009-09-07 22:50:47

+3

是的感謝。我甚至閱讀了關於集合的維基百科文章,但是我發現的所有定義都是關於「抽象數據結構」和「有限集合」的定義。我想我只是希望得到一個「傻瓜式」簡單的英文解釋......所以我想我不能因爲暗示我愚蠢而不是真正的幫助而責怪你。 – 2009-09-07 22:59:51

+1

@Monte,如果我以任何方式冒犯了你,我表示歉意。我只是建議搜索谷歌,因爲有很多文章解釋有關的概念。 – Aziz 2009-09-07 23:32:29

回答

24

如果您在理解套件時一般不會感覺不好。大多數數學學位都花在即將與集合論方面:

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}

A C++集是這樣的一個實施數學對象,這是奇怪的功能是排序內部。但這只是實現的細節,與理解數據結構無關。排序只是爲了提高速度。

5

C++ STL集合是關聯映射,保證集合中元素的排序和唯一性(Multisets保證前者而不是後者)。

它們通常用作集合操作的一部分 - 諸如工會,交叉點以及涉及包含/排除集合中元素的其他交互。

3

「設置」是一種存儲多個但唯一對象的集合。當你想要收集物體時,它很有用,但是你不關心它們的順序或者它裏面有多少個同樣的物體。

更多細節請參見本:Set in C++

+0

「當你想要收集物體時,它很有用,但是你不關心它們的順序或者它裏面有多少個相同的物體。」當你不能/不想要使用一組時,這不正確嗎?當您關心訂單並且您不需要重複時,一個集合非常有用。 – DeusAduro 2009-09-07 23:10:58

+1

正如DeusAduro所說,一個C++ Set存儲排序的元素,並且只允許一個唯一的實例處於相同狀態。 – 2009-09-07 23:15:46

+0

你是正確的訂購!我與Java中的Set相混淆。抱歉。 – NawaMan 2009-09-08 00:02:44

0

Citing Wikipedia:

一組是不同 對象的集合,在 其本身視爲一個對象。集是 數學中最基本的概念之一 。雖然它在19世紀末被髮明爲 ,但現在理論是 數學中普遍存在的一部分,並且可以用作基礎,從中可以導出幾乎所有的數學。

3

Sets「一般」是數學中的一個(非常基本的)概念。

STL的set基於集合的數學概念:它是STL術語中唯一成員或「唯一關聯容器」的集合。有點奇怪的是它對元素進行排序(在數學集中,元素沒有「順序」)。

某些STL實現還支持hash_set,它與set非常相似,因爲它也是一個集合的數學概念的模擬。集和hash_set之間最大的區別是hash_sets做排序它們的元素,它們具有不同的性能特點(O(1)而不是O(log n)的查找窗口,假設一個好的哈希函數),當然他們不是標準的。

0

STL seta red-black tree(至少這是我怎麼想它的實現)

看它的另一種方式。

因此,性能,快速的元素的搜索,排序元素,元素的獨特性,有序橫向等等。

當您想要跟蹤唯一元素(例如唯一字符串或整數列表)時,它非常有用,但您也可以存儲更復雜的結構。

2

它們是什麼?

一組是一個集合。

一組就像是一個字典或鍵/值對的'映射',除了它只存儲(是一組鍵)而沒有相關聯的值。

一組任一或不包含每個可能的密鑰值的一個實例。例如,一組整數可能包含值{0,1,5}。一個值(例如5)不能在集合中被多次包含(如果你對一個給定的鍵值多次調用集合的插入方法,集合仍然只包含該鍵值的一個實例)。

它們的用法?

我幾乎不會像地圖一樣頻繁地使用它們。

有一次我用一組是,如果我這就給遠三分球這一個客戶端使用作爲手柄庫。我將保留一個包含我創建的所有有效句柄值的私有集合。當客戶端給我一個句柄時,我會通過測試該值是否包含在我的集合中來測試句柄是否爲有效句柄。

+0

讓我感到困惑的設置代碼正是像跟蹤手柄一樣使用它們。 – 2009-09-08 02:04:29

0

對於C++的無序執行的套,檢查出Boost.Unordered。在許多情況下,這是比STL集合更好的選擇,我個人或多或少地用它來逐步構建排序列表。

相關問題