zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    《梦断代码》阅读笔记01
    linux c netcdf 安装
    Windows CE中的进程和线程
    VC做任务管理器涉及到的函数
    curl_easy_getinfo() -- 从 curl 句柄里获得附加信息
    libcurl programming
    动态内存申请函数选择(realloc、malloc 、alloca、 calloc)
    C++: byte和int的相互转化
    8位灰度图像BMP的保存
    BMP图像的结构及读写和灰度化
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8511142.html
Copyright © 2011-2022 走看看