map映照容器
- map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。
- map映照容器的数据结构也是采用红黑树来实现的,插入元素的键值不允许重复
- 比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。
- map映照容器元素的数据构成示意图。
- 需要包含头文件“#include ”
map文件也包含了对multimap多重映照容器的定义。
使用
map创建、元素插入和遍历访问
- 创建map对象,键值与映照数据的类型由自己定义。
- 在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,这点和set一样。
#include<iostream> #include<map> using namespace std; int main(){ //定义map对象,目前没有任何对象 map<string,float> m; //插入元素,按键值的由小到大放入黑白树中 m["jack"] =80; m["marry"] = 81; //前向遍历 map<string,float>::iterator it; for(it = m.begin();it!=m.end();it++){ //输出键值与映照数据 cout<<(*it).first<<" : "<<(*it).second<<endl; } return 0; }
程序编译时,可能会产生代号为“warning C4786”的警告,“4786”是标记符超长警告的代号。
可以在程序的头文件包含代码的前面使用“#pragma warning(disable:4786)”宏语句,强制编译器忽略该警告。
4786号警告对程序的正确性和运行并无影响。
删除元素
- map映照容器的erase()删除元素函数,可以删除某个迭代器位置上的元素、等于某个键值的元素、一个迭代器区间上的所有元素。
- 也可使用clear()方法清空map映照容器。
//删除"jack" m.erase("jack");
元素反向遍历
可以使用反向迭代器reverse_iterator反向遍历map照映容器中的数据,它需要rbegin()方法和rend()方法指出反向遍历的起始位置和终止位置。
//反向遍历 map<string,float>::reverse_iterator rit; for(rit = m.rbegin();rit != m.rend();rit++) { //输出键值与映照数据 cout<<(*rit).first<<"\t"<<(*rit).second<<endl; }
元素的搜索
使用find()方法来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。
map<string,float>::iterator it; it = m.find("jack"); if(it != m.end()){ cout<<"find it"<<endl; }else{ cout<<"can not find it"<<endl; }
自定义比较函数
- 将元素插入到map中去的时候,map会根据设定的比较函数将该元素放到该放的节点上去。
- 在定义map的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。
- 编写比较函数与set比较函数是一致的,因为它们的内部数据结构都是红黑树。编写方法有两种。
- 如果元素不是结构体,那么,可以编写比较类。
//由大到小 struct myComp{ //重载()操作符 bool operator() (const string& a, const string& b){ return a>b; } }; //定义map对象,采用自定义比较函数 map<string,float,myComp> m;
- 如果元素是结构体,那么,可以直接把比较函数写在结构体内。
#include<iostream> #include<map> using namespace std; //由大到小 struct info{ float score; //重载 < 操作符,自定义排序规则 bool operator < (const info& b) const { return score > b.score; } }; int main(){ //定义map对象,目前没有任何对象 map<info,string> m; info a ={80}; m[a] = "jack"; a.score = 90; m[a] = "marry"; map<info,string>::iterator it; for(it = m.begin();it!=m.end();it++){ //输出键值与映照数据 cout<<(*it).second<<"\t"<<(*it).first.score<<endl; } cout<<endl; return 0; }
用map实现数字分离
对数字的各位进行分离,采用取余等数学方法操作是很耗时的。
把数字当成字符串,使用map的映照功能,很方便地实现了数字分离。
字符到数字的映射
map<char,int> m; /* m['0'] =0; m['1'] =1; ... */ for(int i =0 ;i<10;i++){ m['0'+i] = i; }
数字映照字符的map写法
实现将数字映射为相应的字符
map<int,char> m; /* m[0] ='0'; m[1] ='1'; ... */ for(int i =0 ;i<10;i++){ m[i] = i+'0'; }