map映照容器(常用的使用方法总结)

  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;
    }
}
原文地址:https://www.cnblogs.com/wenzhixin/p/8511142.html