博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ map 映照容器
阅读量:7131 次
发布时间:2019-06-28

本文共 5769 字,大约阅读时间需要 19 分钟。

map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。        map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。        使用map容器需要头文件包含语句“#include”, map文件也包含了对multimap多重映照容器的定义。        1、map创建、元素插入和遍历访问        创建map对象,键值与映照数据的类型由自己定义。在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,下面这个程序详细说明了如何操作map容器。 1#include  2#include 
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910int main()11{12 //定义map对象,当前没有任何元素13 map
m ;14 15 //插入元素,按键值的由小到大放入黑白树中16 m["Jack"] = 98.5 ;17 m["Bomi"] = 96.0 ;18 m["Kate"] = 97.5 ;19 20 //先前遍历元素21 map
:: iterator it ;22 for(it = m.begin() ; it != m.end() ; it ++)23 {24 cout << (*it).first << " : " << (*it).second << endl ;25 }26 27 return 0 ;28}29 运行结果: Bomi :96 Jack :98.5 Kate :97.5 程序编译试,会产生代号为“warning C4786” 的警告, “4786” 是标记符超长警告的代号。可以在程序的头文件包含代码的前面使用"#pragma waring(disable:4786)" 宏语句,强制编译器忽略该警告。4786号警告对程序的正确性和运行并无影响。2、删除元素 map映照容器的 erase() 删除元素函数,可以删除某个迭代器位置上的元素、等于某个键值的元素、一个迭代器区间上的所有元素,当然,也可使用clear()方法清空map映照容器。 下面这个程序演示了删除map容器中键值为28的元素: 1#include
2#include
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910int main()11{12 //定义map对象,当前没有任何元素13 map
m ;14 //插入元素,按键值的由小到大放入黑白树中15 m[25] = 'm' ;16 m[28] = 'k' ;17 m[10] = 'x' ;18 m[30] = 'a' ;19 //删除键值为28的元素20 m.erase(28) ;21 //向前遍历元素22 map
:: iterator it ;23 for(it = m.begin() ; it != m.end() ; it ++)24 {25 //输出键值与映照数据26 cout << (*it).first << " : " << (*it).second << endl ;27 }28 return 0 ;29}30运行结果: 10 : x 25 : m 30 : a3、元素反向遍历 可以用反向迭代器reverse_iterator反向遍历map映照容器中的数据,它需要rbegin()方法和rend()方法指出反向遍历的起始位置和终止位置。 1#include
2#include
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910int main()11{12 //定义map对象,当前没有任何元素13 map
m ;14 //插入元素,按键值的由小到大放入黑白树中15 m[25] = 'm' ;16 m[28] = 'k' ;17 m[10] = 'x' ;18 m[30] = 'a' ;19 //反向遍历元素20 map
:: reverse_iterator rit ;21 for( rit = m.rbegin() ; rit != m.rend() ; rit ++)22 {23 //输入键值与映照数据24 cout << (*rit).first << " : " << (*rit).second << endl ;25 }26 return 0 ;27}28运行结果: 30 : a 28 : k 25 : m 10 : x4、元素的搜索 使用find()方法来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。由于map采用黑白树数据结构来实现,所以搜索速度是极快的。 下面这个程序搜索键值为28的元素: 1#include
2#include
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910int main()11{12 //定义map对象,当前没有任何元素13 map
m ;14 //插入元素,按键值的由小到大放入黑白树中15 m[25] = 'm' ;16 m[28] = 'k' ;17 m[10] = 'x' ;18 m[30] = 'a' ;19 map
:: iterator it ;20 it = m.find(28) ;21 if(it != m.end()) //搜索到该键值22 cout << (*it).first << " : " << ( *it ).second << endl ;23 else24 cout << "not found it" << endl ;25 return 0 ;26}275、自定义比较函数 将元素插入到map中去的时候,map会根据设定的比较函数将该元素放到该放的节点上去。在定义map的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。在很多情况下,需要自己编写比较函数。 编写方法有两种。 (1)如果元素不是结构体,那么,可以编写比较函数。下面这个程序编写的比较规则是要求按键值由大到小的顺序将元素插入到map中 1#include
2#include
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910//自定义比较函数 myComp11struct myComp12{13 bool operator() (const int &a, const int &b)14 {15 if(a != b) return a > b ;16 else return a > b ;17 }18} ;1920int main()21{22 //定义map对象,当前没有任何元素23 map
m ;24 //插入元素,按键值的由小到大放入黑白树中25 m[25] = 'm' ;26 m[28] = 'k' ;27 m[10] = 'x' ;28 m[30] = 'a' ;29 //使用前向迭代器中序遍历map30 map
:: iterator it ;31 for(it = m.begin() ; it != m.end() ; it ++)32 cout << (*it).first << " : " << (*it).second << endl ;33 return 0 ;34}35运行结果: 30 :a 28 :k 25 :m 10 :x (2)如果元素是结构体,那么,可以直接把比较函数写在结构体内。下面的程序详细说明了如何操作: 1#include
2#include
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910struct Info11{12 string name ;13 float score ;14 //重载 “<”操作符,自定义排列规则15 bool operator < (const Info &a) const16 {17 //按score由大到小排列。如果要由小到大排列,使用“>”号即可18 return a.score < score ;19 }20} ;2122int main()23{24 //定义map对象,当前没有任何元素25 map
m ;26 //定义Info结构体变量27 Info info ;28 //插入元素,按键值的由小到大放入黑白树中29 info.name = "Jack" ;30 info.score = 60 ;31 m[info] = 25 ;32 info.name = "Bomi" ;33 info.score = 80 ;34 m[info] = 10 ;35 info.name = "Peti" ;36 info.score = 66.5 ;37 m[info] = 30 ;38 //使用前向迭代器中序遍历map39 map
:: iterator it ;40 for(it = m.begin() ; it != m.end() ; it ++)41 {42 cout << (*it).second << " : " ;43 cout << ((*it).first).name << " : " << ((*it).first).score << endl ;44 }45 return 0 ;46}47运行结果: 10 :Bomi 80 30 :Peti 66.5 25 :Jack 606、用map实现数字分离 对数字的各位进行分离,采用取余等数学方法是很耗时的。而把数字当成字符串,使用map的映照功能,很方便地实现了数字分离。下面这个程序将一个字符串中的字符当成数字,并将各位的数值相加,最后输出各位的和。 1#include
2#include
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910int main()11{12 //定义map对象,当前没有任何元素13 map
m ;1415 //赋值:字符映射数字16 m['0'] = 0 ;17 m['1'] = 1 ;18 m['2'] = 2 ;19 m['3'] = 3 ;20 m['4'] = 4 ;21 m['5'] = 5 ;22 m['6'] = 6 ;23 m['7'] = 7 ;24 m['8'] = 8 ;25 m['9'] = 9 ;26 /*上面的10条赋值语句可采用下面这个循环简化代码编写27 for(int j = 0 ; j < 10 ; j++)28 {29 m['0' + j] = j ;30 }31 */32 string sa, sb ;33 sa = "6234" ;34 int i ;35 int sum = 0 ;36 for ( i = 0 ; i < sa.length() ; i++ )37 sum += m[sa[i]] ;38 cout << "sum = " << sum << endl ;39 return 0 ;40}417、数字映照字符的map写法 在很多情况下,需要实现将数字映射为相应的字符,看看下面的程序: 1#include
2#include
3#include
4 5using std :: cout ; 6using std :: endl ; 7using std :: string ; 8using std :: map ; 910int main()11{12 //定义map对象,当前没有任何元素13 map
m ;1415 //赋值:字符映射数字16 m[0] = '0' ;17 m[1] = '1' ;18 m[2] = '2' ;19 m[3] = '3' ;20 m[4] = '4' ;21 m[5] = '5' ;22 m[6] = '6' ;23 m[7] = '7' ;24 m[8] = '8' ;25 m[9] = '9' ;26 /*上面的10条赋值语句可采用下面这个循环简化代码编写27 for(int j = 0 ; j < 10 ; j++)28 {29 m[j] = '0' + j ;30 }31 */32 int n = 7 ;33 string s = "The number is " ;34 cout << s + m[n] << endl ;35 return 0 ;36}37运行结果: The number is 7

重写比较器貌似只能针对key重写,value好像不行

转载地址:http://qzcrl.baihongyu.com/

你可能感兴趣的文章
try
查看>>
Session的SqlServer模式的配置
查看>>
struts2 访问国际化资源 <s:text>作为属性
查看>>
亲和串(两种方法妙解)
查看>>
android 实现跳动频谱 DEMO
查看>>
MYSQL 多表更新 UPDATE SET like concat('%',abc,'%');
查看>>
【Win 10应用开发】手动调用WCF服务
查看>>
Linux jstack分析cpu占用100%
查看>>
[Shell]Bash变量:环境变量的配置文件和登录信息
查看>>
使用NuGet时的一个乌龙
查看>>
nginx: [emerg] getpwnam(“www”) failed
查看>>
Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件(转)
查看>>
Unity3D之Mecanim动画系统学习笔记(三):Animation View
查看>>
校园网络(模拟)
查看>>
Android之Http沟通——4.Android HTTP索取信息:HttpClient
查看>>
BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
查看>>
Rejected request from RFC1918 IP to public server address
查看>>
Hadoop学习笔记—5.自定义类型处理手机上网日志
查看>>
TypeScript
查看>>
[转]angularjs 设置全局变量的3种方法
查看>>