码迷,mamicode.com
首页 > 其他好文 > 详细

STL中map的用法

时间:2015-05-28 23:03:55      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:

  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

 

  

STL中map的用法

标签:

原文地址:http://www.cnblogs.com/yaoyueduzhen/p/4537123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!