c语言中 map的用法,C+中STL中的map用法详解

《C+中STL中的map用法详解》由会员分享,可在线阅读,更多相关《C+中STL中的map用法详解(9页珍藏版)》请在人人文库网上搜索。

1、STL中map用法详解说明:如果你具备一定的C+ template知识,即使你没有接触过STL这个文章你也应该可能较轻易的看懂。本人水平有限,不当之处,望大家辅正。一 Map 概述Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在 map 中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它 完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map 部数据的组织, map 部自建一颗红黑树 (一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在 map 部所有的数据都是有序的,后边我们会见识到有序的好处。

2、。 下面举例说明什么是一对一的数据映射。 比如一个班级中,每个学生的学号跟他的就存在着 一一映射的关系,这个模型用 map 可能轻易描述,很明显学号用 int 描述,用字符串描述 (本 篇文章中不用char *来描述字符串,而是采用STL中string来描述),下面给出map描述代码: Map mapStudent;1. map 的构造函数map 共提供了 6 个构造函数,这块涉及到存分配器这些东西,略过不表,在下面我们将接 触到一些 map 的构造方法,这里要说下的就是,我们通常用如下方法构造一个map:Map mapStudent;2. 数据的插入在构造 map 容器后,我们就可以往里面插。

3、入数据了。这里讲三种插入数据的方法:第一种:用 insert 函数插入 pair 数据,下面举例说明 (以下代码虽然是随手写的,应该可以 在VC和GCC下编译通过,大家可以运行下看什么效果,在VC下请加入这条语句,屏蔽4786警告 # pragma warning (disable:4786)#include #include #include Using namespace std;Int main()student_one ”); student_two ”); student_three ”);Map mapStudent;mapStudent.insert(pair(1,mapStud。

4、ent.insert(pair(2,mapStudent.insert(pair(3, map:iterator iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter+)Coutfirstsecond#include #include Using namespace std;Int main()Map mapStudent;“ student_one ”); student_two ”);“ student_three ”);mapStudent.insert(map:value_type (1, mapStude。

5、nt.inser t(map:value_type (2, mapStudent.insert(map:value_type (3, map:iterator iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter+) Coutfirstsecond#include #include Using namespace std;Int main()Map mapStudent;mapStudent1 =“ student_one”;mapStudent2 =“ student_two”;mapStudent3 =“ st。

6、udent_three ”;map:iterator iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter+)Coutfirstsecond:value_type (1, “ student_one ”); mapStudent.insert(map:value_type (1, “ student_two ”); 上面这两条语句执行后, map 中 1 这个关键字对应的值是“ student_one ”,第二条语句并没 有生效,那么这就涉及到我们怎么知道 insert 语句是否插入成功的问题了, 可以用 pair。

7、 来获 得是否插入成功,程序如下Pair:iterator, bool Insert_Pair;Insert_Pair = mapStudent.insert(map:value_type (1,“ student_one ”);我们通过 pair 的第二个变量来知道是否插入成功,它的第一个变量返回的是一个 map 的迭 代器,如果插入成功的话 Insert_Pair.second 应该是 true 的,否则为 false。 下面给出完成代码,演示插入成功与否问题#include #include #include Using namespace std;Int main()Map mapSt。

8、udent;Pair:iterator, bool Insert_Pair;Insert_Pair = mapStudent.insert(pair(1,“ student_one ”);If(Insert_Pair.second = true)Cout(1,“ student_two ” );If(Insert_Pair.second = true)Cout:iterator iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter+)Coutfirstsecond#include #include Using na。

9、mespace std;Int main()Map mapStudent;mapStudent1 =“student_one”;mapStudent1 =“student_two”;mapStudent2 =“student_three”;map:iterator iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter+)Coutfirstsecond#include #include Using namespace std;Int main()Map mapStudent; mapStude nt.insert(p。

10、air(1, mapStudent.insert(pair(2, mapStudent.insert(pair(3, map:reverse_iterator iter;“ student_one ”);“ student_two ”);“ student_three ”);for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter+) Coutfirstsecond#include #include Using namespace std;Int main() Map mapStudent; mapStudent.inser。

11、t(pair(1, mapStudent.insert(pair(2, mapStudent.insert(pair(3, int nSize = mapStudent.size()“ student_one ”);“ student_two ”);“ student_three ”);for(int nIndex = 0; nIndex #include #include Using namespace std;Int main()Map mapStudent;mapStudent.insert(pair(1,“ student_one ” );mapStudent.insert(pair(。

12、2, “ student_two ” );mapStudent.insert(pair(3,“ student_three” );map:iterator iter;iter = mapStudent.find(1);if(iter != mapStudent.end()Coutse”co#include #include Using namespace std;Int main()Map mapStudent;mapStudent1 =“ student_one”;mapStudent3 =“ student_three”;mapStudent5 =“ student_five”;map:i。

13、terator iter;iter = mapStudent.lower_bound(2);/ 返回的是下界 3 的迭代器 Coutsecondsecondsecondsecond:iterator, map:iterator mapPair; mapPair = mapStudent.equal_range(2);if(mapPair.first = mapPair.second)cout#include #include Using namespace std;Int main()student_one student_two student_three);); ”);Map mapStu。

14、dent; mapStudent.insert(pair(1, mapStudent.insert(pair(2, mapStudent.insert(pair(3,/ 如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好/ 如果要删除 1,用迭代器删除 map:iterator iter;iter = mapStudent.find(1); mapStudent.erase(iter);/ 如果要删除 1,用关键字删除Int n = mapStudent.erase(1);/ 如果删除了会返回 1,否则返回 0/ 用迭代器,成片的删除/ 一下代码把整个 map 清空 mapStude。

15、nt.earse(mapStudent.begin(), mapStudent.end();/成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合8. 这里有/ 自个加上遍历代码,打印输出吧其他一些函数用法swap,key_comp,value_comp,get_allocator 等函数, 感觉到这些函数在编程用的不是很多,略过不表,有兴趣的话可以自个研究9. 排序这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是 int 型,它本身支持小于号运算,在 一些特殊情况, 比如关键字是一个结构体, 涉。

16、及到排序就会出现问题, 因为它没有小于号操 作, insert 等函数在编译的时候过不去,下面给出两个方法解决这个问题 第一种:小于号重载,程序举例#include #include Using namespace std;Typedef struct tagStudentInfoInt nID;String strName;StudentInfo, *PStudentInfo; / 学生信息Int main()/ 用学生信息映射分数MapmapStudent;StudentInfo studentInfo;studentInfo.nID = 1;studentInfo.strName = “。

17、 student_one ”; mapStudent.insert(pair(studentInfo, 90); studentInfo.nID = 2;studentInfo.strName = “ student_two ”; mapStudent.insert(pair(studentInfo, 80);以上程序是无法编译通过的,只要重载小于号,就OK 了,如下:Typedef struct tagStudentInfoInt nID;String strName;Bool operator #include Using namespace std;Typedef struct tagS。

18、tudentInfoInt nID;String strName;StudentInfo, *PStudentInfo; / 学生信息Classs sortPublic:Bool operator() (StudentInfo const &_A, StudentInfo const &_B) constIf(_A.nID mapStudent;StudentInfo studentInfo;studentInfo.nID = 1;studentInfo.strName =“ student_one ”;mapStudent.insert(pair(studentInfo, 90); stud。

19、entInfo.nID = 2;studentInfo.strName =“ student_two ”;mapStudent.insert(pair(studentInfo, 80);10. 另外由于STL是一个统一的整体,map的很多用法都和 STL中其它的东西结合在一起,比如在排 序上,这里默认用的是小于号, 即less,如果要从大到小排序呢, 这里涉及到的东西很多, 在此无法一一加以说明。还要说明的是, map 中由于它部有序,由红黑树保证,因此很多函数执行的时间复杂度都是 log2N 的,如果用 map 函数可以实现的功能,而 STL Algorithm 也可以完成该功能,建议用 map 自带函数,效率高一些。下面说下, map 在空间上的特性, 否则, 估计你用起来会有时候表现的比较郁闷, 由于 map 的每个数据对应红黑树上的一个节点, 这个节点在不保存你的数据时, 是占用 16 个字节的, 一个父节点指针,左右孩子指针,还有一个枚举值 (标示红黑的, 相当于平衡二叉树中的平 衡因子),我想大家应该知道,这些地方很费存了吧,不说了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值