STL泛型编程-map映照容器

map映照容器

    map映照容器的元素结构是由一个键值和一个映照数据组成,键值与映照数据之间具有一一映照的关系。map映照容器的数据结构也是采用红黑树来实现的,插入元素的键值不允许重复,比较函数只对元素的键值进行比较,元素各项数据通过键值检索出来。map和set的用法基本相似。

    使用map容器需要头文件"#include <map>"

  1. map创建、元素插入和遍历访问:创建map对象,键值与映照数据的类型由自己定义,在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中,这点和set一样。
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    int main(int argc,char* argv[])
    {
        //定义map对象,当前没有任何元素
        map<string,float> m;
        m["Jack"]=98.5;
        m.insert(pair<string,float>("Bomi",96.0));
        m["Kate"]=97.5;
        //前向遍历元素
        map<string,float>::iterator it;
        for(it=m.begin();it!=m.end();it++)
            cout<<(*it).first<<" : "<<(*it).second<<endl;
        return 0;
    }
    //运行结果:
    //Bomi : 96
    //Jack : 98.5
    //Kate : 97.5

  2. 删除元素:与set容器一样,map映照容器的erase()删除元素函数,可以删除某个迭代器位置上的元素,等于某个键值的元素,一个迭代器区间上的所有元素,也可使用clear()方法清空map映照容器。
    //下面程序演示删除map中键值为28的元素
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    int main(int argc,char* argv[])
    {
        //定义map对象,当前没有任何元素
        map<int,char> m;
        m[25]='m';
        m.insert(pair<int,char>(28,'k'));
        m[10]='x';
        m[30]='a';
        m.erase(28);
        //前向遍历元素
        map<int,char>::iterator it;
        for(it=m.begin();it!=m.end();it++)
            cout<<(*it).first<<" : "<<(*it).second<<endl;
        return 0;
    }
    //运行结果:
    //10 : x
    //25 : m
    //30 : a

  3. 反向遍历:与set容器相似,定义反向迭代器reverse_iterator
  4. 元素的搜索:使用find()方法来搜索,如果找到,返回键值所在的迭代器位置。否则,返回end()迭代器位置。
    #include <iostream>
    #include <map>
    using namespace std;
    int main ()
    {
        map<char,int> mymap;
        map<char,int>::iterator it;
    
        mymap['a']=50;
        mymap['b']=100;
        mymap['c']=150;
        mymap['d']=200;
    
        it=mymap.find('b');
        mymap.erase (it);
        mymap.erase (mymap.find('d'));
    
        // print content:
        cout << "elements in mymap:" << endl;
        cout << "a => " << mymap.find('a')->second << endl;
        cout << "c => " << mymap.find('c')->second << endl;
    
      return 0;
    }
    //运行结果
    //elements in mymap:
    //a => 50
    //c => 150

  5. 自定义比较函数:与set容器相似
  6. 用map实现数字分离:对数字的各位进行分离,采用取余等数字方法操作是很耗时的,而把数字当成字符串,使用map的映照功能,很方便地实现数字分离。
    //将一个字符串中的字符当成数字,并将各位的数值相加,最后输出各位的和。
    #pragma warning(disable:4786)//4786是标记符超长警告的代码,对程序正确性和运行无影响,可以忽略
    #include <string>
    #include <map>
    #include <iostream>
    using namespace std;
    
    int main(int argc,char*argv[])
    {
        //定义map对象,当前无任何元素
        map<char,int> m;
        //赋值:字符映射数字
        m['0']=0;
        m['1']=1;
        m['2']=2;
        m['3']=3;
        m['4']=4;
        m['5']=5;
        m['6']=6;
        m['7']=7;
        m['8']=8;
        m['9']=9;
        /*上面的10条赋值语句可采用下面的这个循环来简化代码编写
        for(int j=0;j<10;j++)
            m['0'+j]=j;
        */
        string sa;
        sa="6234";
        int i;
        int sum=0;
        for(i=0;i<sa.length();i++)
            sum+=m[sa[i]];
        cout<<"sum = "<<sum<<endl;
        return 0;
    }
    //运行结果
    //sum = 15

    数字映照字符的map写法
    #pragma warning(disable:4786)
    #include <string>
    #include <map>
    #include <iostream>
    using namespace std;
    
    int main(int argc,char*argv[])
    {
        //定义map对象,当前无任何元素
        map<int,char> m;
        //赋值:字符映射数字
        m[0]='0';
        m[1]='1';
        m[2]='2';
        m[3]='3';
        m[4]='4';
        m[5]='5';
        m[6]='6';
        m[7]='7';
        m[8]='8';
        m[9]='9';
        /*上面的10条赋值语句可采用下面的这个循环来简化代码编写
        for(int j=0;j<10;j++)
            m[j]='0'+j;
        */
        int n=7;
        string s="The number is ";
        cout<<s + m[n]<<endl;
        return 0;
    }
    //运行结果
    //The number is 7



你可能感兴趣的:(STL泛型编程-map映照容器)