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 ;
9
10int main()
11{
12 //定义map对象,当前没有任何元素
13 map<string,float> m ;
14
15 //插入元素,按键值的由小到大放入黑白树中
16 m[“Jack”] = 98.5 ;
17 m[“Bomi”] = 96.0 ;
18 m[“Kate”] = 97.5 ;
19
20 //先前遍历元素
21 map<string,float> :: 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 ;
9
10int main()
11{
12 //定义map对象,当前没有任何元素
13 map<int, char> 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<int, char> :: 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 : a
3、元素反向遍历
可以用反向迭代器reverse_iterator反向遍历map映照容器中的数据,它需要rbegin()方法和rend()方法指出反向遍历的起始位置和终止位置。
1#include
2#include
3#include
4
5using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
9
10int main()
11{
12 //定义map对象,当前没有任何元素
13 map<int, char> m ;
14 //插入元素,按键值的由小到大放入黑白树中
15 m[25] = ‘m’ ;
16 m[28] = ‘k’ ;
17 m[10] = ‘x’ ;
18 m[30] = ‘a’ ;
19 //反向遍历元素
20 map<int, char> :: 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 : x
4、元素的搜索
使用find()方法来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。由于map采用黑白树数据结构来实现,所以搜索速度是极快的。
下面这个程序搜索键值为28的元素:
1#include
2#include
3#include
4
5using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
9
10int main()
11{
12 //定义map对象,当前没有任何元素
13 map<int, char> m ;
14 //插入元素,按键值的由小到大放入黑白树中
15 m[25] = ‘m’ ;
16 m[28] = ‘k’ ;
17 m[10] = ‘x’ ;
18 m[30] = ‘a’ ;
19 map<int, char> :: iterator it ;
20 it = m.find(28) ;
21 if(it != m.end()) //搜索到该键值
22 cout << (*it).first << " : " << ( *it ).second << endl ;
23 else
24 cout << “not found it” << endl ;
25 return 0 ;
26}
27
5、自定义比较函数
将元素插入到map中去的时候,map会根据设定的比较函数将该元素放到该放的节点上去。在定义map的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。在很多情况下,需要自己编写比较函数。
编写方法有两种。
(1)如果元素不是结构体,那么,可以编写比较函数。下面这个程序编写的比较规则是要求按键值由大到小的顺序将元素插入到map中
1#include
2#include
3#include
4
5using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
9
10//自定义比较函数 myComp
11struct myComp
12{
13 bool operator() (const int &a, const int &b)
14 {
15 if(a != b) return a > b ;
16 else return a > b ;
17 }
18} ;
19
20int main()
21{
22 //定义map对象,当前没有任何元素
23 map<int, char> m ;
24 //插入元素,按键值的由小到大放入黑白树中
25 m[25] = ‘m’ ;
26 m[28] = ‘k’ ;
27 m[10] = ‘x’ ;
28 m[30] = ‘a’ ;
29 //使用前向迭代器中序遍历map
30 map<int, char,myComp> :: 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 ;
9
10struct Info
11{
12 string name ;
13 float score ;
14 //重载 “<”操作符,自定义排列规则
15 bool operator < (const Info &a) const
16 {
17 //按score由大到小排列。如果要由小到大排列,使用“>”号即可
18 return a.score < score ;
19 }
20} ;
21
22int main()
23{
24 //定义map对象,当前没有任何元素
25 map<Info, int> 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 //使用前向迭代器中序遍历map
39 map<Info,int> :: 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 60
6、用map实现数字分离
对数字的各位进行分离,采用取余等数学方法是很耗时的。而把数字当成字符串,使用map的映照功能,很方便地实现了数字分离。下面这个程序将一个字符串中的字符当成数字,并将各位的数值相加,最后输出各位的和。
1#include
2#include
3#include
4
5using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
9
10int main()
11{
12 //定义map对象,当前没有任何元素
13 map<char, int> m ;
14
15 //赋值:字符映射数字
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}
41
7、数字映照字符的map写法
在很多情况下,需要实现将数字映射为相应的字符,看看下面的程序:
1#include
2#include
3#include
4
5using std :: cout ;
6using std :: endl ;
7using std :: string ;
8using std :: map ;
9
10int main()
11{
12 //定义map对象,当前没有任何元素
13 map<int, char> m ;
14
15 //赋值:字符映射数字
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

C++ map 映照容器相关推荐

  1. STL_set集合容器+map映照容器

    set集合容器使用一种红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,来组织泛华的元素数据.元素数据的检索,使用二叉检索树得中序遍历算法,检索的效率高于vector.deque和li ...

  2. STL泛型编程之map映照容器

    Map是STL的一个关联容器,它提供一对一的数据处理能力(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的映照元素),由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  3. map 映照容器入门

    欢迎前往我的个人博客阅读原文. 类似于 python 中的字典,map 映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map 映照容器插入元素的键值不允许 ...

  4. STL—map(映照容器)

    概述 map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据具有一对一的映照关系,且键值具有唯一性,不能重复出现.所以,我们可以将map看作是由键值标识元素的元素集合(猛地一看是不是 ...

  5. map映照容器的使用

    map映照容器可以实现各种不同类型数据的对应关系,有着类似学号表的功能. 今天在做并查集的训练时,就用上了map映照容器. 题目就不上了,直接讲一下用法.顺便说一下,实现过程是在C++的条件下. #i ...

  6. ACM学习历程12——Map映照容器

    Map映照容器是一种实现了平衡二叉树的数据结构,Map中每个元素都是一个键值对<key,value>,且key值是不能重复的,即每个元素的key值都是唯一的.Map容器可以按key检索,使 ...

  7. C++STL之map映照容器

    map映照容器的元素数据包含两个部分: 一个键值: 一个映照的数据: 组成的,键值和映照数据之间具有一一对应的关系. map映照容器的数据结构也是采用红黑树来实现的,请注意:不允许插入元素的键值相同. ...

  8. C++ STL之map映照容器

    map映照容器所处理的元素数据,与数据库的具有键值的记录非常相似,由一个键值和其他若干数据(映照数据)组成,键值和映照数据之间,可建立一个数学上的映照关系,由此而得映照容器的名称.**容器的数据结构同 ...

  9. map映照容器(常用的使用方法总结)

    map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与 set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习, ...

最新文章

  1. KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
  2. Angular 8正式发布!
  3. 前端学习(238):IE低版本常见bug
  4. Linux上的js解码,使用JavaScript实现Base64编码与解码
  5. postman插件下载、安装教程
  6. MySQL入门之插入、删除、修改表数据
  7. CodeForces Manthan 2011 D. Optical Experiment(动态规划)
  8. idea 提示 Cannot resolve symbol ‘log‘解决
  9. 职教高考专业课考计算机,职教高考和普通高考一样吗
  10. 上位机与下位机的串口通信实践
  11. html文档头部标记,HTML头部标记
  12. 移动编程基础知识(复习提纲)
  13. 【论文笔记】CVPR2019_SiamMask
  14. 苹果电脑win10蓝牙音响卡顿_Win10使用蓝牙鼠标老是卡顿的原因及解决方法
  15. 无线常见问题排查手册
  16. 影像组学ibex_影像组学的基本概念与临床应用
  17. 周鸿祎推动了中国互联网的进步
  18. 凹凸世界手游服务器维修,凹凸世界手游进不去怎么办 试试这几个解决方法
  19. 四位共阳极数码管显示函数_74LS164驱动4位共阳数码管代码
  20. 【饭谈】面试官让你来个“自我介绍”,你准备怎么说?

热门文章

  1. 什么是隐私浏览模式?隐私模式下的浏览器就一定保护用户隐私吗?
  2. python 查询电脑ip的方法
  3. 春运抢票同时警惕网络诈骗
  4. 发布我在esnips上传的东东
  5. jquery兄弟标签_jquery如何添加兄弟节点 不是子节点哦 O(∩_∩)O~
  6. 百度企业百家号运营矩阵三部曲——1、蓝V认证 2、企业头条 3行业词占领(蓝V2.0);蓝V认证立享21项特权(度爷解说收藏版)
  7. Linux网络数据包分析
  8. 文字替代图片(CSS加载不出来文字代替)
  9. 微博模拟登陆的方法 + 图灵图像图片验证码识别平台 识别验证码(97%正确率)Python + Selenium+Chrome
  10. android Accessibility系统自带语音助手打开第三方应用