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函数,用法如下: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
- STL map的使用
- map 的使用【STL】
- STL map的使用
- STL map的使用
- STL map的使用
- STL map的使用
- STL map的使用
- stl map的使用
- STL中map的使用
- C++ STL map的使用
- C++ STL map的使用
- STL中 MAP的使用
- STL map的使用 POJ2503
- C++ STL map的使用
- C++ STL map的使用
- C++ STL map的使用
- C++ STL map的使用
- C++ STL map的使用
- 深入浅出MyBatis-Sqlsession
- CGLIB使用入门
- CentOS 7 安装 subversion1.9.5
- DedeCms设置titlelen后怎么显示完整标题
- Android WifiManager 中的常量
- STL map的使用
- kali安装rtl**.ko
- Windows右下角同步图标
- sql server 2008 评估期已过期解决办法
- 15.C#:VS2010无法新建实体数据模型,找不到Entity Data Model选项
- 【Python教程】python之路
- SecureCRT和SecureFx的安装以及注册
- android 文件存储
- 2017年学习指南