C++ STL map(映射)

頭文件#include<map>,固然,萬能庫就不用我多說了吧。。算法

介紹:map容器是一個鍵 (key) 到值 (value) 的映射。由於重載了 [ ] 運算符,map像是數組的「高級版」。map的key和value能夠是任意類型,其中key必須定義「小於號」運算符。例如能夠用一個map <string,int> month_name 來表示「月份名字到月份編號」的映射,而後用month_name["July"]=7;這樣的方式來賦值。數組

聲明函數

map<key_type,value_type>name;

例如:code

map<long long,bool>vis;
map<string,int>hash;
map<pair<int,int>,vector<int>>test;

在不少時候,map容器被看成Hash表使用,創建從複雜信息key(如字符串)到簡單信息 value(如必定範圍內的整數)的映射。 由於map基於平衡樹實現,因此它的大部分操做的時間複雜度都在$O(log n)$級別,略慢於使用 Hash函數實現的傳統Hash表。從C++11開始,STL中新增了 unordered_map 等基於Hash的容器,但部分算法競賽並不支持C++11標準,這裏就再也不介紹這些新容器。rem

size/empty/clear/begin/end 與set相似,分別爲元素個數、是否爲空、清空、首迭代器、尾迭代器。字符串

迭代器 map 的迭代器和 set 同樣,也是「雙向訪問迭代器」。對 map 的迭代器解除引用後,將獲得一個二元組 pair<key_type,value_type>string

insert/erase 與set相似,分別爲插入、刪除。insert的參數是pair<key_type,value_type> ,erase的參數能夠是pair或者迭代器。hash

map<int,int > h;
h.insert(make_pair(1,2)),h.insert(make_pair(2,3));
map<int,int > :: iterator it=h.begin();
pair<int,int > p=*it;
h.erase(it),h.erase(make_pair(2,3));
cout<<p.first<<' '<<p.second<<endl;

find h.find(x) 在變量名爲h 的map 中查找key 爲 x 的二元組,並返回指向改二元組的迭代器。若不存在,返回h.end()。時間複雜度爲 $O(log n)$。it

[ ] 操做符 h[key]返回key映射到的value的引用,時間複雜度爲$O(log n)$。 [ ]操做符是map最吸引人的地方。咱們能夠很方便地經過 h[key] 來獲得 key 對應的value,還能夠對 h[key] 進行賦值操做,改變key對應的value。 須要特別注意的是,若查找的key不存在,則執行 h[key] 後,h會自動新建一個二元組(key,zero),並返回zero的引用。這裏zero表示一個廣義「零值」,如整數0、空字符串等。若是查找後不對 h[key] 進行賦值,那麼時間一長,h 會包含不少無用的「零值二元組」,白白地佔用了空間,下降了程序運行效率。強烈建議讀者在用 [ ] 操做符查詢以前,先用 find 方法檢查 key 的存在性。class

[實例] 用map統計字符串出現的次數 給定 n 個字符串,m 個問題,每一個問題詢問一個字符串出現的次數。 n<=20000,m<=20000,每一個字符串的長度都不超過20.

map<string,int> h;
char str[25];
for(int i=1;i<=n;i++){
	scanf("%s",str);
	h[str]++;
}
for(int i=1;i<=m;i++){
	scanf("%s",str);
	if(h.find(str)==h.end())puts("0");
	else printf("%d\n",h[str]);
}

提示: set頭文件中的set和map頭文件中的map分別是集合和映射。兩者都支持insert、find、count和remove操做,而且能夠按照從小到大的順序循環遍歷其中的元素。map還提供了「[ ]」運算符,使得 map 能夠像數組同樣使用。事實上,map 也稱爲「關聯數組」。

相關文章
相關標籤/搜索