map常用用法詳解
map翻譯為對映,也是常見的STL容器
在定義陣列時(如int array[100]),其實是定義了一個從int型到int型的對映
比如array[0]=25、array[4]=36就分別是將0對映到25、將4對映到36
一個double型陣列則是將int型對映到double型,
如db[0]=3.14,double[1]=0.01
但是,無論是什麼型別
它總是將int型對映到其他型別
這似乎表現出一個弊端:
當需要以其他型別為關鍵字來做對映時,
會顯得不太方便
例如有一本字典,
上面提供了很多的字串和對應的頁碼,如果要用陣列來表示“字串——>頁碼”這樣的對應關係
就會感覺不太好操作
這時,就可以用到map,因為map可以將任何基本型別
(包括STL容器)對映到任何基本型別(包括STL容器)
也就可以建立string型到int型的對映
【另一種情況】
需要判斷給定的一些數字在某個檔案中是否出現過
按照正常的思路,可以開一個bool 型hashTable[max_size]
通過判斷hashTable[x]為true還是false來確定x是否在檔案中出現
但是這會碰到一種問題:
如果這些數字很大(例如有幾千位)那麼這個數字就會開不了
而這時map就可以派上用場
因為可以把這些數字當成一些字串
然後建立至int的對映(或者直接建立int至int的對映)
【標頭檔案】
#include<map>
using namespace std;
1、map的定義
map<typename1,typename2>mp;
與其他STL容器在定義上不一樣,因為map需要確定對映前型別(鍵key)和對映後型別(值value)
所以需要在<>內填寫兩個型別
其中一個是鍵的型別
第二個是值得型別
如果是int型對映到int型,就相當於是普通的int型陣列
但是如果是字串到整型的對映,必須是string而不是char陣列
map<string,int>mp
這時因為char陣列作為陣列是不能被作為鍵值的。所以字串作對映,只能用string
而map的劍河之也可以是STL容器
map<set<int>,string>mp
2、map容器內元素的訪問
①通過下標訪問
【注意】map的鍵是唯一的
mp['c']=20;
②通過迭代器訪問
定義方式與其他STL容器迭代器相同
【不同】
map迭代器的使用方式和其他STL容器的迭代器不同
因為map的每一對對映都有兩個typename
這決定了必須通過一個it來同時訪問鍵和值
事實上,map可以使用it->first來訪問鍵
使用it->second來訪問值
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
using namespace std;
int main()
{
map<char,int>mp;
mp['m']=20;
mp['r']=30;
mp['a']=40;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
{
printf("%c %d\n",it->first,it->second);
}
return 0;
}
map會以鍵的大小從小到大的順序自動排序
即按照a<m<r的順序排列這三對對映
這是因為map內部是使用紅黑樹(set也是)
在建立對映的過程中會自動實現從小到大的排序功能
3、map常用函式
①find()
find(key)返回鍵是key的對映的迭代器
②erase()
(1)刪除單個元素
a.mp.erase(it),it為需要刪除的元素的迭代器
b.mp.erase(key),key為欲刪除的對映的鍵
e.g.mp.erase('c');
(2)刪除一個區間內的所有元素
還是左閉右開
(3)size()
用來獲得map中對映的次數
(4)clear()
清空
4、常見用途
①需要建立字元(或字串)與整數之間影射的題目,使用map可以減少程式碼量
②判斷大整數或者其他型別資料是否存在的題目,可以把map當bool陣列使用
③字串和字串的對映也有可能會遇到
延伸:
map的鍵和值是唯一的,而如果一個鍵需要對應多個值
就只能用multimap
知識點來自於《演算法筆記》