1. 程式人生 > >map映照容器

map映照容器

lin 數字 黑白 位置 重復 相同 宋體 code target

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映照容器