map映照容器

  map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。
  map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。
  使用map容器需要头文件包含语句“#include<map>”。

 

1.map创建、元素插入、和遍历访问:

创建map对象,键值与映照数据的类型由自己定义。在没有指定比较函数时,元素的插入位置是按照值由小到大插入到红黑树中去的,这点和我们之前讲的set一样。

 1 #include<iostream>
 2 #include<cstring> 
 3 #include<map> 
 4 using namespace std;
 5 
 6 int main(){
 7     map<string,float> m;//定义map对象,当前没有任何元素 
 8     m["Jack"]=98.5;//插入元素,按键值由小到大放入 
 9     m["Bomi"]=96.0;
10     m["Kate"]=97.5;
11     
12     map<string,float>::iterator it;//定义前向迭代器 
13     for(it=m.begin();it!=m.end();it++){//遍历输出键值与映照数据 
14         cout<<(*it).first<<" : "<<(*it).second<<endl;
15     }
16     return 0;
17 }

运行结果:

Bomi : 96

Jack  : 98.5

Kate :97.5

 

2.删除元素:

与set一样,map映照容器的erase()函数可以删除某个迭代器位置上的元素、等于某个键值的元素、一个迭代器区间上的所有元素,当然,也可以使用clear()方法清空map映照容器。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<map>
 4 using namespace std;
 5 
 6 int main(){
 7     map<int,char> m;
 8     map[25]='m';
 9     map[28]='k';
10     map[10]='x';
11     map[30]='a';
12     
13     m.erase(28);//删除键值为28的元素 
14     map<int,char>::iterator it;
15     for(it=m.begin();it!=m.end();it++){
16         cout<<(*it).first<<" : "<<(*it).second<<endl;
17     } 
18     return 0;
19 } 

运行结果:

10 : x

25 : m

30 : a

 

3.元素反向遍历:

与set一样,我们可以使用反向迭代器reverse_iterator反向遍历map映照容器中的数据,它需要rbegin()和rend()来指出反省遍历的起始位置和终止位置。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<map>
 4 using namespace std;
 5 
 6 int main(){
 7     map<int,char> m;
 8     map[25]='m';
 9     map[28]='k';
10     map[10]='x';
11     map[30]='a';
12     
13     map<int,char>::reverse_iterator it;//定义反向迭代器 
14     fro(it=m.rbegin();it!=m.rend();it++){//反向遍历 
15         cout<<(*it).first<<" : "<<(*it).second<<endl; 
16     }
17     return 0;
18 } 

运行结果:

30 : a

28 : k

25 : m

10 : x

 

4.元素的搜索:

 依旧与set一样,使用find()来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。

 1 #include<iosteram>
 2 #include<cstring>
 3 #include<map>
 4 using namespace std;
 5 
 6 int main(){
 7     map<int,char> m;
 8     m[25]='m';
 9     m[28]='k';
10     m[10]='x';
11     m[30]='a';
12     
13     map<int,char>::iterator it;
14     it=find(28);//搜索键值为28的元素 
15     if(it!=m.end()){//找到 
16         cout<<(*it).first<<" : "<<(*it).second<<endl;
17     }
18     else{ 
19         cout<<"not found it"<<endl;
20     }
21     return 0;
22 }

运行结果:

28 : k

 

  直观来说,map 容器区别于 set 容器的一个主要特性在于,map 是处理带有键值的记录型元素数据的快速插入、删除 和检索,而 set 则可看成是对单一数据的处理。map 将一个元素划分出键值部分,并按这个局部的键值指定整个元素的函数比较规则,来建立容器的数据分布。map 的元素键值是唯一的,不允许重复的元素键值插入。 set 和 map 都是泛型库对二叉树的一个泛化。
    
    map 缺点:map是比较高级的用法了,适合用 list , vector 就能完成的操作,就不需要用到 map 。
    map 优点:相比 set ,map 可处理带有键值的记录型数据的快速插入、删除和检索。检索的速度也是非常快的。

 

posted @ 2016-05-30 20:34  Kiven#5197  阅读(420)  评论(3编辑  收藏  举报