map映照容器
map映照容的元素數據是由一個鍵值和一個映照數據組成的,鍵值與映照數據之間具有一一映照的關系。
map映照容器的數據結構也是采用紅黑樹來實現的,插入元素的鍵值不允許重復,比較函數只對元素的鍵值進行比較,元素的各項數據可通過鍵值檢索出來。由於map與set采用的都是紅黑樹的數據結構,所以,用法基本相似。
映照數據 |
鍵值 |
Name Score
Jack 98.5
Bomi 96.0
Kate 97.5
使用map容器需要頭文件包含語句"#include<map>"
一.map創建、元素插入與遍歷訪問
創建map對象,鍵值與映照數據的類型由自己定義。在沒有指定比較函數時,元素的插入位置是按鍵值由大到小插入到黑白樹中去的,這點與set一樣。
1 #include<iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 map<string,float> m; 8 m["Jack"]=98.5; 9 m["Bomi"]=96.0; 10 m["Kate"]=97.5; 11 map<string,float>::iterator it; 12 for(it=m.begin();it!=m.end();it++) 13 { 14 cout<<(*it).first<<":"<<(*it).second<<endl; 15 } 16 return 0; 17 }
運行結果
Bomi:96 Jack:98.5 Kate:97.5
二.(1)刪除元素:與set容器一樣,map映照容器的erase()刪除元素函數,可以刪除某個叠代器位置上的元素、等於某個鍵值的元素、一個叠代器區間上的所有元素,當然,也可以使用clear()方法清空map映照容器。
刪除鍵值為28的元素。
1 #include<iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 map<int,char> m; 8 m[25]=‘m‘; 9 m[28]=‘k‘; 10 m[10]=‘x‘; 11 m[30]=‘a‘; 12 m.erase(28); 13 map<int,char>::iterator it; 14 for(it=m.begin();it!=m.end();it++) 15 { 16 cout<<(*it).first<<":"<<(*it).second<<endl; 17 } 18 return 0; 19 }
運行結果
10:x 25:m 30:a
(2)元素反向遍歷:可以使用反向叠代器reverse_iterator反向遍歷map映照容器中的數據,它需要rbegin()方法和rend()方法指出反向遍歷的起始位置和終止位置。
三.自定義比較函數
(1)如果元素不是結構體,其編寫比較函數的方法與set一樣;
(2)如果元素結構體,直接把比較函數寫在結構體內
1 #include<iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 struct Info 6 { 7 string name; 8 float score; 9 bool operator<(const Info &a)const 10 { 11 return a.score<score; //按score由小到大排序,如果要由大到小,使用“>”號即可 12 } 13 }; 14 int main() 15 { 16 map<Info,int> m; 17 Info info; 18 info.name="Jack"; //插入元素,按鍵值的由小到大放進黑白樹 19 info.score=60; 20 m[info]=25; 21 info.name="Bomi"; 22 info.score=80; 23 m[info]=10; 24 info.name="Peti"; 25 info.score=66.5; 26 m[info]=30; 27 map<Info,int>::iterator it; 28 for(it=m.begin();it!=m.end();it++) 29 { 30 cout<<(*it).second<<":"; 31 cout<<((*it).first).name<<" "<<((*it).first).score<<endl; 32 } 33 return 0; 34 }
運行結果
10:Bomi 80 30:Peti 66.5 25:Jack 60
四.用map實現數字分離
對數字的各位進行分離,采用取余等數學方法操作是很耗時的。而把數字當成字符串,使用map的映照功能,很方便地實現了數字分離。下面這個程序將一個字符串中的字符當成數字,並將各位的數值相加,最後輸出各位的和。
1 #include<iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 map<char,int> m; 8 m[‘0‘]=0; //賦值:字符映照數字,字符只能為一位 9 m[‘1‘]=1; 10 m[‘2‘]=2; 11 m[‘3‘]=3; 12 m[‘4‘]=4; 13 m[‘5‘]=5; 14 m[‘6‘]=6; 15 m[‘7‘]=7; 16 m[‘8‘]=8; 17 m[‘9‘]=9; 18 /*上面的10條賦值語句可采用下面這個循環來簡化代碼編寫 19 for(int j=0;j<10;j++) 20 { 21 m[‘0‘+j]=j; 22 } 23 */ 24 string sa; 25 sa="6234"; 26 int sum=0; 27 for(int i=0;i<sa.length();i++) 28 { 29 sum+=m[sa[i]]; 30 } 31 cout<<sum<<endl; 32 return 0; 33 }
運行結果
15
五.數字映照字符的map方法
1 #include<iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 map<int,char> m; 8 m[0]=‘0‘; //賦值:字符映照數字 9 m[1]=‘1‘; 10 m[2]=‘2‘; 11 m[3]=‘3‘; 12 m[4]=‘4‘; 13 m[5]=‘5‘; 14 m[6]=‘6‘; 15 m[7]=‘7‘; 16 m[8]=‘8‘; 17 m[9]=‘9‘; 18 /*上面的10條賦值語句可采用下面這個循環來簡化代碼編寫 19 for(int j=0;j<10;j++) 20 { 21 m[‘0‘+j]=j; 22 } 23 */ 24 int n=7; 25 cout<<m[n]<<endl; 26 return 0; 27 }
運行結果
7
multimap多重映照容器
multimap與map基本相同,唯獨不同的是,multimap允許插入重復鍵值的元素。由於允許重復鍵值的存在,所以,multimap的元素插入,刪除,查找與map不同。
multimap對象創建、元素插入
可以重復插入元素,插入元素需要使用insert()方法
1 #include<iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 multimap<string,double> m; 8 m.insert(pair<string,double>("Jack",300.5)); 9 m.insert(pair<string,double>("Kity",200)); 10 m.insert(pair<string,double>("Memi",500)); 11 m.insert(pair<string,double>("Jack",306)); 12 multimap<string,double>::iterator it; 13 for(it=m.begin();it!=m.end();it++) 14 { 15 cout<<(*it).first<<":"<<(*it).second<<endl; 16 } 17 return 0; 18 }
運行結果
Jack:300.5 Jack:306 Kity:200 Memi:500
map映照容器