zoukankan      html  css  js  c++  java
  • STL中map的用法

      mapSTL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

      下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,很明显学号用int描述,姓名用字符串描述,下面给出map描述代码:

      map<int, string> mapStudent;

    1.   map的构造函数

      map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表,在下面我们将接触到一些map的构造方法,这里要说下的就是,我们通常用如下方法构造map

      map<int, string> mapStudent;

      map<string, int> month_name;

    2.    数据的插入与遍历

      在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:

      (1)用数组方式插入数据,下面举例说明:

     map<int, string>:

     1 #include <map>
     2 #include <string>
     3 #include <iostream>
     4 using namespace std;
     5 int main()
     6 {
     7        map<int, string> mapStudent;
     8        mapStudent[1] =  “student_one”;
     9        mapStudent[2] =  “student_two”;
    10        mapStudent[3] =  “student_three”;
    11        map<int, string>::iterator  iter;
    12        for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    13     {
    14          cout<<iter->first<<”   ”<<iter->second<<end;
    15     }
    16 }

     map<string, int> :

     1 #include <map>
     2 #include <string>
     3 #include <iostream>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8        map<string , int>  month_name;
     9     
    10        month_name["January] = 1;
    11        month_name["February"] = 2;
    12        month_name["July"] = 7;
    13 
    14        map<string , int>::iterator  it;
    15        for(it = month_name.begin(); it != month_name.end(); it++)
    16        {
    17            cout<<it->first<<”   ”<<it->second<<end;
    18        }
    19        return 0;
    20 }    

       (2)用insert函数插入pair数据,下面举例说明

     1 #include <map>
     2 #include <string>
     3 #include <iostream>
     4 using namespace std;
     5 int main()
     6 {
     7        map<int, string> mapStudent;
     8        mapStudent.insert(pair<int, string>(1, “student_one”));
     9        mapStudent.insert(pair<int, string>(2, “student_two”));
    10        mapStudent.insert(pair<int, string>(3, “student_three”));
    11        map<int, string>::iterator  iter;
    12        for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    13        {
    14            cout<<iter->first<<”   ”<<iter->second<<end;
    15        }
    16        return 0;
    View Code

      (3)insert函数插入value_type数据,下面举例说明

     1 #include <map>
     2 #include <string>
     3 #include <iostream>
     4 using namespace std;
     5 int main()
     6 {
     7        map<int, string> mapStudent;
     8        mapStudent.insert(map<int, string>::value_type (1, “student_one”));
     9        mapStudent.insert(map<int, string>::value_type (2, “student_two”));
    10        mapStudent.insert(map<int, string>::value_type (3, “student_three”));
    11        map<int, string>::iterator  iter;
    12        for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    13        {
    14            cout<<iter->first<<”   ”<<iter->second<<end;
    15        }
    16        return 0;
    17 }    
    View Code

    3.       map的大小

      在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:

       int size = mapStudent.size();

    4.       数据的查找(包括判定这个关键字是否在map中出现)

       在这里我们将体会,map在数据插入时保证有序的好处。

      要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。

      第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1 

      第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器 

     1 #include <map>
     2 #include <string>
     3 #include <iostream>
     4 using namespace std;
     5 int main()
     6 {
     7        map<int, string> mapStudent;
     8        mapStudent.insert(pair<int, string>(1, “student_one”));
     9        mapStudent.insert(pair<int, string>(2, “student_two”));
    10        mapStudent.insert(pair<int, string>(3, “student_three”));
    11        map<int, string>::iterator iter;
    12        iter = mapStudent.find(1);
    13        if(iter != mapStudent.end())
    14        {
    15           cout<<”Find, the value is ”<<iter->second<<endl;
    16        }
    17        else
    18        {
    19           cout<<”Do not Find”<<endl;
    20        }
    21        return 0;
    22 }

    5.       数据的清空与判空 

      清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map

    6.       数据的删除

       这里要用到erase函数,它有三个重载了的函数,下面在例子中详细说明它们的用法

     1 #include <map>
     2 #include <string>
     3 #include <iostream>
     4 using namespace std;
     5 int main()
     6 {
     7        map<int, string> mapStudent;
     8        mapStudent.insert(pair<int, string>(1, “student_one”));
     9        mapStudent.insert(pair<int, string>(2, “student_two”));
    10        mapStudent.insert(pair<int, string>(3, “student_three”));
    11  
    12 //如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好
    13        //如果要删除1,用迭代器删除
    14        map<int, string>::iterator iter;
    15        iter = mapStudent.find(1);
    16        mapStudent.erase(iter);
    17  
    18        //如果要删除1,用关键字删除
    19        Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0
    20  
    21        //用迭代器,成片的删除
    22        //一下代码把整个map清空
    23        mapStudent.earse(mapStudent.begin(), mapStudent.end());
    24        //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
    25        return 0;
    26 }
    View Code

    7.       排序

    这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,这个时候就需要重载 < 运算符

     1 #include <map>
     2 #include <string>
     3 using namespace std;
     4 Typedef struct tagStudentInfo
     5 {
     6        Int      nID;
     7        String   strName;
     8        Bool operator < (tagStudentInfo const& _A) const
     9        {
    10               //这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序
    11               If(nID < _A.nID)  return true;
    12               If(nID == _A.nID) return strName.compare(_A.strName) < 0;
    13               Return false;
    14        }
    15 }StudentInfo, *PStudentInfo;  //学生信息
    16  
    17 int main()
    18 {
    19        int nSize;
    20        //用学生信息映射分数
    21        map<StudentInfo, int>mapStudent;
    22        map<StudentInfo, int>::iterator iter;
    23        StudentInfo studentInfo;
    24        studentInfo.nID = 1;
    25        studentInfo.strName = “student_one”;
    26        mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
    27        studentInfo.nID = 2;
    28        studentInfo.strName = “student_two”;
    29        mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
    30 
    31       for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
    32       {
    33           cout<<iter->first.nID<<endl<<iter->first.strName<<endl<<iter->second<<endl;
    34       }
    35       return 0;
    36 
    37 }
    View Code

      

  • 相关阅读:
    JavaScript中的memorizing技术
    在IE6/7/8下识别html5标签
    JavaScript中的类式继承和原型式继承
    OpenSUSE环境配置
    CentOS环境配置(LNMP)
    CentOS上OpenCC中文简繁体转换
    jQuery点击按钮页面滚动条向下滚动
    javascript-数组常用方法
    Tomcat配置常见错误问题解决方法
    字符串
  • 原文地址:https://www.cnblogs.com/yaoyueduzhen/p/4537123.html
Copyright © 2011-2022 走看看