我不太明白這個數據結構的用途。 std::multimap<K, V>
和std::map<K, std::vector<V>>
之間有什麼區別。 std::multiset
也是如此 - 它可能只是std::map<K, int>
,其中int計算了K的出現次數。我是否錯過了這些結構的用法?std :: multimap的用例
回答
反例似乎是爲了。
考慮按名稱分組的AdressList中的PhoneEntry。
int AdressListCompare(const PhoneEntry& p1, const PhoneEntry& p2){
return p1.name<p2.name;
}
multiset<PhoneEntry, AdressListCompare> adressList;
adressList.insert(PhoneEntry("Cpt.G", "123-456", "Cellular"));
adressList.insert(PhoneEntry("Cpt.G", "234-567", "Work"));
// Getting the entries
addressList.equal_range(PhoneENtry("Cpt.G")); // All numbers
這對set + count不可行。如果不需要這種行爲,則您的對象+計數方法似乎更快。例如multiset :: count()成員狀態
「複雜性:對數大小+ 線性計數」。
+1使用自定義謂詞來良好使用STL容器的好例子。 –
這似乎與'map
@DeadMG誠然,但正如Alan所指出的,迭代器對於多重集的行爲與向量組合的行爲非常不同。 AdressListCompare也不一定只需要比較一個成員。 –
您可以使用make建議替換,並提取類似的行爲。但接口與處理常規標準容器時會有很大的不同。這些容器的主要設計主題是它們共享盡可能多的接口,使它們儘可能互換,以便可以選擇適當的容器而無需更改使用它的代碼。
例如,std::map<K, std::vector<V>>
將有迭代器取消引用std::pair<K, std::vector<V>>
而不是std::pair<K, V>
。 std::map<K, std::vector<V>>::Count()
將不會返回正確的結果,無法解釋向量中的重複項。當然,你可以改變你的代碼來完成糾正這個所需的額外步驟,但是現在你以一種完全不同的方式與容器接口了。你不能在unordered_map
或其他一些地圖實現中看到它的性能更好。
從更廣泛的意義上講,您通過處理代碼中的容器實現細節而不是具有處理它自己的業務的容器來打破容器抽象。
完全有可能您的編譯器的實現std::multimap
實際上只是一個圍繞std::map<K, std::vector<V>>
的包裝。或者它可能不是。對象池分配可能更高效和更友好(哪些向量不是)。
使用std::map<K, int>
而不是std::multiset
是相同的情況。 Count()
不會返回期望值,迭代器不會迭代重複,迭代器將取消引用std::pair<k, int>
而不是直接到`K.
- 1. std :: multimap和equal_range
- 2. 插入std :: Map(C++)的std :: Multimap
- 3. 有問題的std :: multimap中
- 4. Std :: multimap等效於delphi
- 5. Multimap以std :: function作爲值
- 6. 將值添加到std :: multimap
- 7. 調用結束時std :: multimap錯誤()
- 8. 我可以使用std :: pair作爲std :: multimap中的鍵嗎?
- 9. 使用set實例化Multimap?
- 10. std :: multimap :: emplace覆蓋舊的密鑰嗎?
- 11. 關鍵在std :: multimap的要求
- 12. multimap
- 13. std :: multimap獲取兩個範圍
- 14. C++從std :: multimap中找到多個鍵
- 15. 將數組值添加到std :: multimap
- 16. Multimap之插入鑰匙所屬類別用的std :: make_pair VS的std ::對構造
- 17. C++:在std :: map中引用計數值;是std :: multimap更好的選擇?
- 18. 如何在QtCreator的調試器中顯示std :: multimap和std :: multiset的內容?
- 19. 訪問由嵌套multimap中的multimap :: equal_range返回的所有值
- 20. 計數出現的對象ID的std :: multimap中
- 21. 是std :: multimap真的只是嵌套的向量
- 22. 問題的計數()和find()中的std :: multimap中
- 23. print multique包含multimap
- 24. `std :: timed_mutex`的有效用例?
- 25. std :: unordered_multiset的使用案例
- 26. 遍歷的std :: multimap中刪除某些條目
- 27. std :: multimap :: equal_range是否有可能返回不正確的結果?
- 28. multimap的錯誤(密鑰類型是std :: string)
- 29. std map和multimap迭代器是一樣的嗎?
- 30. 如何爲std :: multimap中的元素設計句柄/標識符
我相信'multimap'在結構上等同於'map >'但功能更豐富。我不能保證這一點,所以我會讓它作爲評論。 –