STL map的使用

来源:互联网 发布:体检数据服务 编辑:程序博客网 时间:2024/05/16 00:34

①map详解

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



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

Map<int, string> mapStudent;


1.       map的构造函数

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

Map<int, string> mapStudent;


2.       数据的插入

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


第一种:用insert函数插入pair数据,下面举例说明

#include <iostream>#include <map>#include <string>Using namespace std;int main(){map<int, string> mapStudent;mapStudent.insert(pair<int, string>(1, “student_one”));mapStudent.insert(pair<int, string>(2, “student_two”));mapStudent.insert(pair<int, string>(3, “student_three”));map<int, string>::iterator  iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){Cout<<iter->first<<”   ”<<iter->second<<end;}return 0;}




第二种:用数组方式插入数据,下面举例说明

#include <iostream>#include <map>#include <string>Using namespace std;int main(){Map<int, string> mapStudent;mapStudent[1] =  “student_one”;mapStudent[2] =  “student_two”;mapStudent[3] =  “student_three”;map<int, string>::iterator  iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){Cout<<iter->first<<”   ”<<iter->second<<end;}    return 0;}

以上二种用法,虽然都可以实现数据的插入,但是它们是有区别的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值


3.       map的大小

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


Int nSize = mapStudent.size();




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

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

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

这里给出二种数据查找方法


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


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

#include <iostream>#include <map>#include <string>Using namespace std;int main(){Map<int, string> mapStudent;mapStudent.insert(pair<int, string>(1, “student_one”));mapStudent.insert(pair<int, string>(2, “student_two”));mapStudent.insert(pair<int, string>(3, “student_three”));map<int, string>::iterator iter;iter = mapStudent.find(1);if(iter != mapStudent.end()){Cout<<”Find, the value is ”<<iter->second<<endl;}else{Cout<<”Do not Find”<<endl;}}



5       数据的清空与判空



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


6.       数据的删除

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

#include <iostream>#include <map>#include <string>Using namespace std;int main(){Map<int, string> mapStudent;mapStudent.insert(pair<int, string>(1, “student_one”));mapStudent.insert(pair<int, string>(2, “student_two”));mapStudent.insert(pair<int, string>(3, “student_three”));//如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好//如果要删除1,用迭代器删除map<int, string>::iterator iter;iter = mapStudent.find(1);mapStudent.erase(iter);//如果要删除1,用关键字删除Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0//用迭代器,成片的删除,一下代码把整个map清空mapStudent.earse(mapStudent.begin(), mapStudent.end());//成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合return 0;}

②map例题

杭电1004Let the Balloon Rise

第一种解法:

#include<iostream>#include<map>using namespace std;int main(){   int n,max;   string s,ans;   map <string,int> mat;   while(cin>>n,n)  {   max=0;   while(n--)  {   cin>>s;   mat[s]++;   if(mat[s]>max)  {   ans=s;   max=mat[s];  }  }   cout<<ans<<endl;  } return 0;}


第二种解法:
#include<iostream>#include<string>#include<map>using namespace std;map <string,int> mat;int main(){int n;map<string,int>::iterator it;string name,maxname;int max=0;while(cin>>n&&n){max=0;while(n--){     cin>>name;     mat[name]++;     }for(it=mat.begin();it!=mat.end();it++){if(it->second>max){max=it->second;maxname=it->first;}}cout<<maxname<<endl;mat.clear();}return 0;}

HDU 4802 GPA

<span style="font-weight: normal;">#include<iostream>#include<map>#include<string.h> using namespace std;int main(){  int n,all,mak;  double gpa;  char a[3];  int i,j;  map<string,double> ma;    ma["A"]=4.0;    ma["A-"]=3.7;    ma["B+"]=3.3;    ma["B"]=3.0;    ma["B-"]=2.7;    ma["C+"]=2.3;    ma["C"]=2.0;    ma["C-"]=1.7;    ma["D"]=1.3;    ma["D-"]=1.0;    ma["F"]=0;    while(scanf("%d",&n)!=EOF)    {     gpa=0;     all=0;    while(n--)    {    scanf("%d%s",&mak,a);    if(strcmp(a,"N")!=0&&strcmp(a,"P")!=0)    {    all+=mak;gpa+=ma[a]*mak;    }}    if(gpa!=0) gpa/=all;    printf("%.2lf\n",gpa);    }  return 0;}</span>


HDU Ignatius and the Princess IV

<span style="font-weight: normal;">#include<iostream>#include<map>#include<string.h> using namespace std;int main(){  int n,m;  int num;  map <int,int> mat;  map <int,int>::iterator it;  while(cin>>n)  {    num=(n+1)/2;  while(n--)  {     scanf("%d",&m);     mat[m]++;  }  for(it=mat.begin();it!=mat.end();it++)  {  if(it->second>=num)  {  printf("%d\n",it->first);  break;  }  }  mat.clear();  }  return 0;}</span>


HDU 1075 What Are You Talking About

#include<iostream>#include<string>#include<map>using namespace std;map<string,int>M;map<string,int>::iterator p,q;int n;int main(){    string str;    while(scanf("%d",&n),n)    {       M.clear(); //清空       while(n--)       {          cin>>str;          if(M[str]==0) //插入            M[str]=1;          else               M[str]++;       }       int k=-1;       for(p=M.begin();p!=M.end();p++)   //查找       {         if((p->second)>k)         {            k=p->second;            q=p;         }       }      cout<<q->first<<endl;     }    return 0;}


0 0
原创粉丝点击