index > STL > map
細緻的介紹還是前人做的好,我自愧不如。
https://blog.csdn.net/fhb1922702569/article/details/80984774
https://blog.csdn.net/sevenjoin/article/details/81943864
列幾點我常忽視的細節:
- 用
mp.insert()
函數插入已有key的數據時,不能插入數據。而mp[key]
引用可改寫key對應的value。 - map內部的實現自建一顆紅黑樹,這顆樹具有對數據自動排序的功能。(面試可能也會見到相關的提問)
部分應用
離散化
單純利用一一對應的特性。
打標記
雖然說用 []
很方便,但是如果就是二元的標記,還是巧用insert/erase/find/count 比較穩妥。(原因有待解釋,可能打臉)
特殊二叉搜索樹(類紅黑樹)
——“你其實有一棵隨叫隨到的紅黑樹。”
須知:
-
map是有序容器。
-
mp.begin()
可訪問第一個鍵值對(最值)。 -
mp[key]
修改某個key的權值,而且改完保持有序。 -
mp.insert() mp.erase() mp.find()
增刪改查都有。 -
甚至還能自行
mp.lower_bound() mp.upper_bound()
-
默認
lesser<int>
升序,想要降序也可以(如果不是原生類型得另外寫比較類): -
map<int, int, greater<int> > cnts;
有了上面這些領悟,你這可以解決某些特定的情況:
比如有一羣人,每個人的分數不同,找一下最高分的人有幾個。
或者,要輸出,第一/第二/第三的分數,和對應的人數。
如果嫌簡單,再難一點,修改m次分數,每次修改就再求一次答案。
1e6的人數,1e9的分數,可有負分,修改/詢問1e6。
可能以上這個題目比較拙劣,如果以後有更好的會再放進來。簡單地說,充分利用key排序和修改方便的特性。