Map和Multimaps

上传人:新** 文档编号:488366292 上传时间:2022-12-05 格式:DOC 页数:16 大小:203KB
返回 下载 相关 举报
Map和Multimaps_第1页
第1页 / 共16页
Map和Multimaps_第2页
第2页 / 共16页
Map和Multimaps_第3页
第3页 / 共16页
Map和Multimaps_第4页
第4页 / 共16页
Map和Multimaps_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Map和Multimaps》由会员分享,可在线阅读,更多相关《Map和Multimaps(16页珍藏版)》请在金锄头文库上搜索。

1、maps 和 multimap1 简介map 和 multimap 将key(键值,或理解为排序关键字)/value(值)作为元素,成对存储,它们可根据key的排序准则自动将元素排序。multimap允许重复键值,maps不允许。如下图:使用map和multimap需要使用头文件,在使用这个头文件时,要用标准名称空间(using namespace std;)。map和multimap的元素是 key/value 对,map可以作为映射式数组使用,比如存储学生信息时,学生的学号和姓名就是一一对应的映射关系,或者在存储电话号码时,人名和电话号码也是映射关系,等等。map和multimap根据元素

2、的key自动对元素进行排序。根据已知的key搜寻某个元素时,能够有很好的性能,根据已知的value搜寻元素时性能则很糟糕。“自动排序”这一性质使得map和multimap有 很重要的限制:不能直接改变元素的key,因为这会破坏正确顺序。要修改元素的key,必须先移除拥有该key的元素,然后插入拥有新的key值的元素。2 map和multimaps的构造函数表1 map和multimap的构造函数操作效果map c产生一个空的map/multimap,其中不含任何元素map c (op)以op为排序准则,产生一个空的map/multimapmap c1(c2)产生某个map/multimap的副

3、本,所有元素均被复制map c (beg, end)以区间beg ; end内的元素产生一个map/multimapmap c (beg, end, op)以op为排序准则,利用beg ; end内的元素生成一个map/multimap在表1中的map可以是以下形式:表2 表1中map的可选形式map效果map一个map,以less(实际上就是小于号“”)为排序准则map一个map,以op为排序准则multimap一个multimap,以less为排序准则multimap一个multimap,以op为排序准则表2中,key为键值类型,elem为value值的类型。op可以是less或者是gre

4、ater,在排序准则中要指定key的类型。第二个参数指定了value的类型:string声明一个map容器变量方法如下:第一个参数指定了key的类型:float#include #include #include 注意:此处两个“”中间有一个空格using namespace std;int main()mapfloat, string, greater mymap;return 0;mapfloat, string, greater mymap;语句中,mapfloat, string, greater 是类型,mymap是该map容器的变量,二者之间的关系就如同int a;语句中,变量类型

5、int和变量a之间的关系。实际上,map是一种容器,这种容器可以存储任何类型的变量,但是具体你需要什么类型的map,还需要告诉编译器,比如在本例的map容器,以float类型为key,以string类型为value。这些是属于泛型编程的内容,具体细节以后接触C+的时候就会明白。要注意红色高亮部分的两个“”中间要有一个空格,因为连续的两个“”会被编译器解释为移位操作符,导致语法错误。以上程序片段在VC中编译会有一大票C4786警告,不必理会,在其他编译器中无此问题。3 数据的插入和删除3.1 插入数据1、使用pair和insert语句:#include #include #include usi

6、ng namespace std;int main()mapfloat, string, greater mymap;mymap.insert(pair(22.3,hello);mymap.insert(pair(78.5,ok);return 0;其中pair的功能是把pair后面尖括号里指定的两种类型合并为一个pair类型。因为map容器存储数据都是相关联的数据成对存储的,所以要先把两个值合成一个“pair类型”。比如上面例子中,pair(22.3, “hello”)实现的功能就是把一个float和一个string合并成一个pair类型变量(实际上这就是面向对象中所谓的“对象”,对象与类的

7、关系类似于c语言中内置类型如int与该类型变量的关系。实际上pair是一个类)。这个pair类型变量的一对值分别是浮点值22.3和字符串”hello”。(注意string也是一个类,和c语言中的c风格字符串不一样,要使用string的话需要包含头文件)注意以上代码中黄色高亮部分:”hello”和”ok”实际上都是const string,而第一条insert语句中的pair指定的是string类型,这时pair会做一个自动的隐式类型转换,把const string类型(也就是”hello”)变成string类型。2、使用make_pair函数和insert,这是最方便的方法。#include

8、#include #include using namespace std;int main()mapfloat, string, greater mymap;mymap.insert(pair(22.3,hello);mymap.insert(pair(78.5,ok);mymap.insert(make_pair(50.0,happy);return 0;make_pair也会执行必要的隐式类型转换。但是在VC6.0中编译时mymap.insert(make_pair(50.0,happy);这一句通不过,”happy”被认为是char6类型,没有被自动转换成string。在dev c+中

9、编译顺利通过。看来VC6.0这个开发环境存在的主要目的是为基于MFC的win32编程服务的,用到c+核心内容时,会深刻感受到VC6.0的不标准。3、使用value_type和insert#include #include #include using namespace std;int main()mapfloat, string, greater mymap;mymap.insert(pair(22.3,hello);mymap.insert(pair(78.5,ok);mymap.insert(make_pair(50.0,happy);mymap.insert(map:value_typ

10、e(53.7,lucky);return 0;4 将map视为关联式数组,以数组下标方式(即)非常量(Non-const)的map提供下标操作符以支持元素的直接存取。如表3操作效果mkey返回一个引用(C+中的一种新类型,是一个变量的别名,可以按照指针来理解,但是使用起来比指针简单,而且效率比指针高),该引用指向键值为key的元素。如果该元素尚未存在,则插入该元素。注意mkey中的索引值”key”不一定是整型,因为他是map容器每个元素的key,可以是任意类型,这样可以方便地实现关联式数组。#include #include #include using namespace std;int m

11、ain()mapstring,float,less anothermap;anothermap.insert(make_pair(zhangsan,1.75);anothermap.insert(make_pair(lisi,1.72);anothermap.insert(make_pair(zhaoliu,1.69);anothermaplisi=1.77;anothermapwangwu=1.66;return 0;以上代码黄色高亮部分中,第一句anothermaplisi=1.77;在anothermap中已经存在了key值为”lisi”的元素,那么这一句将会用1.77覆盖掉原来lisi

12、所对应的值(1.72);黄色高亮部分中,第二句anothermapwangwu=1.66;another中不存在key值为”wangwu”的元素,那么会向anothermap中自动插入一个新元素,key值为”wangwu”,并把这个新插入的元素的value设置为某个默认值(比如当value的类型为int时,会默认设置为0),然后再把1.66赋给这个新插入元素的value。前面说过,map中不能存在key值相同的元素。因此,在使用insert添加map新元素时,如果新插入元素的key值与容器中原有元素的key值有重复,则insert会失败。但使用下标方式插入则不会出现插入失败,因为如果在原有元素

13、中存在与新插入元素key值相同的元素,则会用新插入元素的value去覆盖掉原有元素的value。这是下标方式的优点,也是其缺点,比如这会导致我们错误地覆盖掉容器中的原有元素,或是不小心错误插入新元素。比如:coutanothermap“zhangsa”;在输入”zhangsan”时,少敲了一个”n”,这将会导致向anothermap中插入一个新值,其key为”zhangsa”,value为0。另外,以下标方式向map中添加元素的速度要比insert方式慢许多。4 迭代器(iterator)在STL中,迭代器的角色类似于C/C+中的指针。其声明方式如下:map:iterator pos;其中map表明这个迭代器的类型,map:iterator pos表示声明一个迭代器pos,其类型为map。迭代器用法:#include #include #include using namespace std;int main()mapstring,float,less anot

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 商业计划书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号