2010-12-14 106 views
54

我不明白爲什麼multimap存在,如果我們可以創建矢量地圖或集地圖。 對我來說,唯一的區別是:多映射與矢量映射的優點是什麼?

  • 在多重映射使用equal_range爲獲得一個關鍵的元素和載體的地圖,我們簡單地使用[]運營商和擁有的元素載體。
  • 在多圖中使用multimap.insert(make_pair(key,value))在矢量圖中添加元素和map_of_vectors[key].push_back(value)

那麼爲什麼要使用multimap?對我來說,最好有一個向量比兩個迭代器來獲得一個鍵的所有值。

這個問題也適用於矢量和unordered_multimap的unordered_map。

+6

我必須承認,我從來沒有完全理解'multimap'的目的:/ – 2010-12-14 12:13:55

+0

我稍微晚了一點,但由於額外的指針,multimap比矢量地圖消耗更多的內存。我使用它們的唯一原因是如果我想保留每個元素的關鍵(做'push_back',你不會保留它) – Jcao02 2014-08-05 14:08:39

+0

如果你不僅想跟蹤不同值的重複鍵,但您也想要立即刪除任何鍵/值對。矢量地圖不適合這種情況,雖然您可以使用列表地圖,但使用多地圖更爲方便。 – richizy 2016-07-11 17:27:58

回答

42

我想說這取決於是否所有具有相同鍵的值都有您想要解決的關係。

因此,例如,你是否經常瀏覽所有使用關鍵字X的元素,或將它們傳遞給函數,等等?然後將它們放在單獨的容器中更方便,以便您可以直接處理。

但是,如果您只有一個項目集合,它們可能共享相同的鍵值,爲什麼要在兩者之間使用向量?使用迭代器運行multimap比在map,vector情況下使用嵌套循環更方便。

查看此問題的另一種方法:如果每個鍵的多個條目非常常見,那麼您的結構在映射矢量的情況下效率更高。如果他們很少發生,則情況正好相反。

+2

謝謝。你和Artyom的回答讓我看到了更多的差異。但是我仍然不相信multimap在實際生活中與矢量地圖一樣有用。但這是我個人的看法;) – 2010-12-15 18:36:00

-1

兩個迭代器???我認爲你錯了。當我使用std :: for_each()或其他算法的多圖我只使用一個迭代器範圍,它是該死的簡單得多,擔心與每個關鍵的向量。

40

multimap<x, y>map<x, vector<y>>

一旦你已經插入一個值多重映射之間,你知道迭代器將保持 有效,直到您刪除了很多重要的區別,這是非常強大的屬性,你可以沒有矢量地圖。直到它被從地圖上抹去

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b)); 

迭代器仍然有效,而在第二種情況下, 將它每次無效,你的新條目添加到載體。

另請注意,map<x, vector<y>>可能有一個用現有密鑰設置的空值,而multimap不可以。

這些行爲有所不同。

說實話,我錯過了一些語言中的multimap,它們沒有在他們的庫中提供它。