2013-05-02 50 views
1

集合用於通過提供所有信息來獲取對象的信息,通常用於檢查數據是否存在。地圖用於通過使用密鑰(單個數據)來獲取對象的信息。糾正我,如果我錯了。現在的問題是爲什麼我們首先需要一個集合,我們不能用一張地圖來查看數據是否存在?爲什麼我們需要提供所有信息來查看它是否存在?爲什麼使用集合而不是地圖? C++

回答

0

Set包含一個唯一的有序值列表,但Map可以包含一組使用一個鍵訪問的非唯一無序值。

兩者都可以用來確定一個對象是否存在,它取決於您的用例以及您如何能夠訪問該對象 - 您可以測試以查看該Set是否包含您引用的對象,還是需要通過一個或多個鍵來查看它才能夠進行比較?

+0

所以一個集合總是有序的,而且一個地圖總是無序的? – FJam 2013-05-02 00:42:41

+4

一個'std :: set'包含一個唯一的有序值列表。一個'std :: multiset'可以有重複,但包含的對象仍然是有序的。一個'std :: map'包含一組唯一的有序鍵,每個鍵與一個值相關聯。一個'std :: multimap'可以包含重複鍵,但鍵仍然是有序的。 – 2013-05-02 00:44:37

+0

不正確 - 一個'std :: map'不能包含重複鍵,也不能'std :: set'。 'std :: multimap'和'std :: multiset'可能包含倍數。必須投票直到更正。 – 2013-05-02 01:16:47

2

有很多操作,你只需要一套。使用地圖只是額外的空間。

  1. 設置操作(聯合,交集等)。
  2. 從數字集合保持獨特的元素,對象等
+1

+1這是我看到的真正問題。在很多情況下,你根本不需要鑰匙 - 你爲什麼要使用地圖? – Luke 2013-05-02 01:15:55

+0

正確。當元素尺寸較小時,集合特別有用,因此插入+排序很快。此外,使用集合和地圖只有在元素數量很少時(在這裏相對較小)纔有用。你可能會發現這個演講很有用(http://www.youtube.com/watch?v=aIHAEYyoTUc),Alex說盡量使用數組/向量。 – 2013-05-02 01:32:23

1

set用於同一type的組項本身是(即,它們不是equal)之間不同。例如,數字12都是int類型,但是1!=2

set當您想要將同類事物的集合作爲一個組追蹤並對這些組進行數學運算(如交集,聯合,差異等)時,容器非常有用。例如,想象一下包含提及單詞catdog的所有文檔的搜索結果的set。然後另一個set包含提及單詞pet的所有文件。這兩組中的union會給你一組文件,其中包含文字catdogpet。請注意,這樣的組不會有重複(即,如果一個文檔最初處於兩個集合中,那麼它將只在第二組中出現一次)。

maps是肯定一個set,但它們可以被看作是它允許你的值與set的每個元素相關聯的安排。它們被用來表示關係。例如,在一家公司工作的人員的set有一個關聯的employee_number;在這種情況下,map將是代表這種關係的有用結構。回到前面的例子,如果你想知道每個頁面被訪問了多少次,你可以創建一個沿着std::map<Page, int>行的地圖,也就是頁面之間的關係,每次訪問過的次數。

注意地圖的鍵形成set(可能這是混淆了許多人),並且此屬性的含義是,你只能有一個給定的關鍵一次(也有一些深奧的集裝箱,其中一個鍵雖然可以映射到不同的值)。

因此,如果您需要作爲一個整體與組和集合進行交互,並且與組本身的成員進行交互,則可能需要set。如果您需要準會員某些事情與團體成員或集合,可能您需要一個map。如果該關聯跨越多個維度,則可能需要multi_map

重要通知,在C++ std::setstd::map有序。 C++ 11提供替代品無序容器,稱爲std::unordered_setstd::unordered_map

相關問題