這個問題在這里已經有了答案: std::multimap 的用例 3 個答案 6 小時前關閉。
我剛開始學習 STL 容器,我不明白為什么std::multimap
存在。使用std::map
,我們可以通過用戶定義的鍵訪問值,但是std::multimap
我們不能這樣做,因為后者甚至沒有多載operator[]
,并且同一個鍵可以映射到多個不同的值。對我來說,這看起來std::multimap
本質上就像std::multiset<std::pair<K, V>>
在Compare
函式上運行的一樣K
,我們失去了地圖的主要特征,即通過鍵訪問元素的能力(如我所見)。我找到了這篇文章,但仍然無法理解這里給出的用例。有人可以給我幾個我們會使用的例子std::multimap
嗎?
uj5u.com熱心網友回復:
首先請注意,std::map::operator[]
這有點古怪。這不是訪問地圖中元素的方式。相反std::map::operator[]
,可能會在地圖中插入一個元素,然后回傳對之前已經存在的元素或新插入的元素的參考。這可能看起來像分裂頭發,但區別很重要。給定 a 中的鍵訪問 mapped_value 的方法std::map
是std::map::find
. std::multimap
也有find
。沒有什么大的區別。
std::map::at
沒有對應項,std::multimap
因為std::map::at
回傳給定鍵的映射值的參考,但是在多映射中,同一個鍵可以有多個映射值,因此std::multimap::at
如果存在 a 應該回傳什么并不明顯。可以find
對這兩個地圖進行查找和訪問元素。
Astd::multimap<K,V>
可以與 a 進行比較,std::map<K,std::vector<V>>
但是當您想要將多個單個值映射到同一個鍵時,您會使用您期望的介面。例如std::multimap
,迭代器讓您一次性迭代多圖中的所有鍵值對。使用向量映射,您必須使用映射迭代器和向量迭代器。使用帶有標準演算法的向量圖相當麻煩。此外,std::multimap::count
回傳給定鍵的元素數。使用向量圖,您必須首先找到給定鍵的向量并呼叫它的size
. 此串列不完整,但我希望區別清晰。
多地圖的一個例子可能是房屋的居民。在同一所房子里住著不止一個人。如果您想將街道號碼映射到人,您可以使用多重映射。
更一般地說,如果你有一個元素的集合/容器,并且你想將它們分成不同的組,你可以使用多圖。std::map
(or )的一個常見用途std::unordered_map
是計算頻率,例如:
std::map<int,int> freq;
for (const auto& x : some_container) {
freq[ x % 3 ];
}
這計算有多少個元素some_container
可以被 3 整除,沒有余數,余數為 1,或余數為 2。如果您想知道元素而不是只計算它們,可以使用 a std::multimap
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504897.html