集合用於通過提供所有信息來獲取對象的信息,通常用於檢查數據是否存在。地圖用於通過使用密鑰(單個數據)來獲取對象的信息。糾正我,如果我錯了。現在的問題是爲什麼我們首先需要一個集合,我們不能用一張地圖來查看數據是否存在?爲什麼我們需要提供所有信息來查看它是否存在?爲什麼使用集合而不是地圖? C++
回答
Set包含一個唯一的有序值列表,但Map可以包含一組使用一個鍵訪問的非唯一無序值。
兩者都可以用來確定一個對象是否存在,它取決於您的用例以及您如何能夠訪問該對象 - 您可以測試以查看該Set是否包含您引用的對象,還是需要通過一個或多個鍵來查看它才能夠進行比較?
有很多操作,你只需要一套。使用地圖只是額外的空間。
- 設置操作(聯合,交集等)。
- 從數字集合保持獨特的元素,對象等
+1這是我看到的真正問題。在很多情況下,你根本不需要鑰匙 - 你爲什麼要使用地圖? – Luke 2013-05-02 01:15:55
正確。當元素尺寸較小時,集合特別有用,因此插入+排序很快。此外,使用集合和地圖只有在元素數量很少時(在這裏相對較小)纔有用。你可能會發現這個演講很有用(http://www.youtube.com/watch?v=aIHAEYyoTUc),Alex說盡量使用數組/向量。 – 2013-05-02 01:32:23
甲set
用於同一type
的組項本身是(即,它們不是equal
)之間不同。例如,數字1
和2
都是int
類型,但是1!=2
。
set
當您想要將同類事物的集合作爲一個組追蹤並對這些組進行數學運算(如交集,聯合,差異等)時,容器非常有用。例如,想象一下包含提及單詞cat
和dog
的所有文檔的搜索結果的set
。然後另一個set
包含提及單詞pet
的所有文件。這兩組中的union
會給你一組文件,其中包含文字cat
,dog
和pet
。請注意,這樣的組不會有重複(即,如果一個文檔最初處於兩個集合中,那麼它將只在第二組中出現一次)。
maps
是肯定不一個set
,但它們可以被看作是它允許你的值與set
的每個元素相關聯的安排。它們被用來表示關係。例如,在一家公司工作的人員的set
有一個關聯的employee_number
;在這種情況下,map
將是代表這種關係的有用結構。回到前面的例子,如果你想知道每個頁面被訪問了多少次,你可以創建一個沿着std::map<Page, int>
行的地圖,也就是頁面之間的關係,每次訪問過的次數。
注意地圖的鍵形成set
(可能這是混淆了許多人),並且此屬性的含義是,你只能有一個給定的關鍵一次(也有一些深奧的集裝箱,其中一個鍵雖然可以映射到不同的值)。
因此,如果您需要作爲一個整體與組和集合進行交互,並且與組本身的成員進行交互,則可能需要set
。如果您需要準會員某些事情與團體成員或集合,可能您需要一個map
。如果該關聯跨越多個維度,則可能需要multi_map
。
重要通知,在C++ std::set
和std::map
被有序。 C++ 11提供替代品無序容器,稱爲std::unordered_set
和std::unordered_map
。
- 1. 爲什麼我會使用白色屏幕而不是地圖?
- 2. 爲什麼ItemCollection.Groups是對象的集合而不是CollectionViewGroups的集合?
- 3. 爲什麼我用C++代碼獲取地址而不是值?
- 4. 爲什麼合併而不是快進?
- 5. 爲什麼BCL集合使用結構枚舉器而不是類?
- 6. 爲什麼使用HTML而不是HAML?
- 7. 爲什麼,而不是使用回調
- 8. 爲什麼使用classmethod而不是staticmethod?
- 9. 爲什麼使用TCPDF而不是mpdf
- 10. 爲什麼使用leal而不是incq?
- 11. 爲什麼使用iconv_strpos而不是strpos?
- 12. 爲什麼使用s:Line而不是mx:HRule?
- 13. 爲什麼使用uImage而不是zImage
- 14. 爲什麼使用DataSource而不是XADataSource?
- 15. 爲什麼使用char []而不是String?
- 16. 爲什麼使用結構,而不是
- 17. 爲什麼使用registerDefaults:而不是setValue:forKey:?
- 18. 爲什麼使用追加()而不是+
- 19. 爲什麼使用Number.parseInt而不是parseInt()?
- 20. 爲什麼使用TagBuilder而不是StringBuilder?
- 21. 什麼時候應該使用消息合約而不是DataContract,爲什麼?
- 22. 爲什麼人們在C++中使用`main()`而不是`int main()`?
- 23. 爲什麼函數在Obj-C中使用 - (void)而不是 - (nil)?
- 24. 爲什麼C++引入duration_cast而不是使用static_cast?
- 25. 爲什麼使用C typedefs而不是#defines?
- 26. 使用集合 - 地圖
- 27. 谷歌地圖爲什麼使用Canvas進行距離測量而不是SVG?
- 28. 什麼在使用地圖時返回一個集合
- 29. 什麼是當前在C++中使用最廣泛的集合集合
- 30. 爲什麼Facebook使用圖片精靈而不是基礎64?
所以一個集合總是有序的,而且一個地圖總是無序的? – FJam 2013-05-02 00:42:41
一個'std :: set'包含一個唯一的有序值列表。一個'std :: multiset'可以有重複,但包含的對象仍然是有序的。一個'std :: map'包含一組唯一的有序鍵,每個鍵與一個值相關聯。一個'std :: multimap'可以包含重複鍵,但鍵仍然是有序的。 – 2013-05-02 00:44:37
不正確 - 一個'std :: map'不能包含重複鍵,也不能'std :: set'。 'std :: multimap'和'std :: multiset'可能包含倍數。必須投票直到更正。 – 2013-05-02 01:16:47