map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系。map与
set集合容器一样,不允许插入的元素的键值重复。
/*关于C++STL中map映照容器的学习,看别人的代码一百遍,不如自己动手写一遍。*/ #include <map> #include <string> #include <iostream> using namespace std; struct myComp{ bool operator () (const int &a,const int &b){ return a>b; } }; struct STUDENT{ string name; float score; //重载“<”操作符,自定义排序规则 bool operator < (const STUDENT &a) const{ //按照score由大到小排列。从小到大,则使用>号 return a.score<score; } }; void print(map<string,float> m); void rprint(map<string,float> m); int main() { //map映照容器的创建 map<string,float> m;//定义map对象,<>中前面是键值后面是映照数据,当前没有任何元素 //插入元素,按键值的由小到大放入黑白树中 m["Jack"]=98.5; m["Bomi"]=96.0; m["Kate"]=97.5; //前向遍历元素 cout<<"前向遍历元素: "; print(m); //反向遍历元素 cout<<"后向遍历元素: "; rprint(m); /*运行结果 前向遍历元素: Bomi:96 Jack:98.5 Kate:97.5 后向遍历元素: Kate:97.5 Jack:98.5 Bomi:96 */ //元素的检索 map<string,float>:: iterator it1;//定义一个同类型的迭代器来接受find()方法的返回值 it1=m.find("Jack"); if(it1 != m.end()) cout<<"找到键值为Jack的元素 "; it1=m.find("Mark"); if(it1 == m.end()) cout<<"找不到键值为Mark的元素 "; /*运行结果 找到键值为Jack的元素 找不到键值为Mark的元素 */ //按照键值删除某一个等于该键值的元素 cout<<"删除键值为Bomi的元素 "; m.erase("Bomi"); print(m); /*运行结果 删除键值为Bomi的元素 Jack:98.5 Kate:97.5 */ //清空map映照容器 m.clear(); if(m.empty()) cout<<"该映照容器为空 "; /*运行结果 该映照容器为空 */ /*同set一样,在使用insert()方法将元素插入到映照容器中的时候,会根据设定的比较规则进行排序,默认情况下 按键值从小到大的顺序插入,但很多情况下,需要自己编写比较函数*/ //如果不是结构体,则直接定义比较函数,重载"()"运算符,见main函数之前 map<int,char,myComp> mm;//使用自定义比较函数的时候记得在这进<>中 mm[25]='m'; mm[28]='k'; mm[10]='x'; mm[30]='a'; map<int,char>::iterator it2; for(it2=mm.begin(); it2 != mm.end(); it2 ++){ cout<<(*it2).first<<":"<<(*it2).second<<endl; } /*运行结果 30:a 28:k 25:m 10:x */ //如果是结构体,则直接把比较函数写在结构体内,见main函数之前 STUDENT student; map<STUDENT,int> students; student.name="Jack"; student.score=60; students[student]=25; student.name="Bimi"; student.score=80; students[student]=10; student.name="Peti"; student.score=66; students[student]=30; map<STUDENT,int>::iterator it3;//定义相应类型的迭代器遍历映照容器 for(it3=students.begin(); it3 != students.end(); it3 ++){ cout<<((*it3).first).name<<" "<<((*it3).first).score<<" : "<<(*it3).second<<endl; } /*运行结果 Bimi 80 : 10 Peti 66 : 30 Jack 60 : 25 */ return 0; } void print(map<string,float> m) { map<string,float>::iterator it; for(it=m.begin(); it != m.end(); it++){ cout<<(*it).first<<":"<<(*it).second<<endl; } } void rprint(map<string,float> m) { map<string,float>::reverse_iterator rit; for(rit=m.rbegin(); rit != m.rend();rit++){ cout<<(*rit).first<<":"<<(*rit).second<<endl; } }