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 可处理带有键值的记录型数据的快速插入、删除和检索。检索的速度也是非常快的。