map<key, value>是按key排好序的,key不可以重复。

1. map.lower_bound():按key查找,如果查找的key存在,返回该位置,如果不存在返回大于所查找值的最小key所在位置

 1 #include <iostream>
 2 #include <map>
 3 using namespace std;
 4
 5 int main ()
 6 {
 7   std::map<char,int> mymap;
 8   std::map<char,int>::iterator itlow,itup;
 9
10   mymap['a']=20;
11   mymap['b']=40;
12   mymap['b']=50;  //key值不重复,会把b的value更新为50
13   mymap['c']=80;  //value的值可以重复
14   mymap['d']=80;
15   mymap['e']=100;
16
17   for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
18     std::cout << it->first << " => " << it->second << '\n';
19   cout<<endl;
20                                         //这段程序其实并不能成功插入,因为key=b已经存在了,value也不会更新
21   itlow=mymap.lower_bound ('b');                     //如果键值b存在,itlow指向b,否则指向比b大的最小key所在位置
22   mymap.insert(itlow,std::map<char,int>::value_type('b',40));   //向itlow指向的位置插入map<'b',40>
23
24   for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
25     std::cout << it->first << " => " << it->second << '\n';
26   cout<<endl;
27
28   char c='a';
29   while(1)
30   { //输入一个字符并插入
31     cin>>c;
32     itlow = mymap.lower_bound(c);
33     if(itlow != mymap.end())
34       cout<<"insert "<<c<<" to position: "<<itlow->first<<" , "<<itlow->second<<'\n';
35     mymap.insert(itlow, map<char,int>::value_type(c, 160+c));
36     for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
37       std::cout << it->first << " => " << it->second << '\n';
38     cout<<endl;
39   }
42   return 0;
43 }

输出结果:

 1 a => 20
 2 b => 50
 3 c => 80
 4 d => 80
 5 e => 100
 6
 7 a => 20
 8 b => 50
 9 c => 80
10 d => 80
11 e => 100
12
13 d  //并没有成功插入,d的value还是原来的80
14 insert d to position: d , 80
15 a => 20
16 b => 50
17 c => 80
18 d => 80
19 e => 100
20
21 z //插入位置在map.end
22 a => 20
23 b => 50
24 c => 80
25 d => 80
26 e => 100
27 z => 282
28
29 x
30 insert x to position: z , 282
31 a => 20
32 b => 50
33 c => 80
34 d => 80
35 e => 100
36 x => 280
37 z => 282

2. map.key_comp(),只有第一个参数小于第二个才返回true。

函数返回值是bool型,输入是两个key值,key_comp()(a,b),当a<b时返回1,否则返回0。

 1 #include <iostream>
 2 #include <map>
 3 using namespace std;
 4 int main ()
 5 {
 6   std::map<char,int> mymap;
 7
 8   mymap['a'] = 20;
 9   mymap['c'] = 120;
10   mymap['x']=101;
11   mymap['y']=203;
12   mymap['z']=103;
13
14   std::cout << "mymap contains:\n";
15   map<char,int>::iterator it = mymap.begin();
16   for( it = mymap.begin();it!=mymap.end();it++)
17     cout<<it->first<<" => "<<it->second<<'\n';
18   cout<<endl;
19
20   map<char,int>::iterator pit = mymap.begin();
21   pit++;
22   pit++;  //pit指向第三个元素map<x,101>
23
24   it = mymap.begin();
25   for( it = mymap.begin();it!=mymap.end();it++)
26   {
27      cout<<"key comp result: "<<mymap.key_comp()(it->first, pit->first)<<endl;
28   }
29   cout<<endl;
30   return 0;
31 }

结果:

 1 mymap contains:
 2 a => 20
 3 c => 120
 4 x => 101
 5 y => 203
 6 z => 103
 7
 8 key comp result: 1
 9 key comp result: 1
10 key comp result: 0 //此时it=pit
11 key comp result: 0
12 key comp result: 0

-----------2018.03.09--------------------

db_feature.insert(std::pair<int, std::vector<std::vector<unsigned char>> >(id,feature) );   //如果id已经存在,不会成功插入
db_feature[id] = feature;                    //如果id已经存在,修改key=id的value

----------2019.01.08---------------------

map最后一个元素访问并删除

1. 直接调stl函数

*(map.rbegin());   //map最后一个元素

访问并删除:

key = m_right.rbegin()->first;        //map倒叙第一个元素(也就是正序最后一个)
value = m_right.rbegin()->second;
m_right.erase(key);                  //map的key是唯一的,可以按key删除
//m_right.erase(m_right.rbegin());      //这样删除会报错        

注意这个rbegin是一个反向迭代器:

// map<TreeNode*, int>::iterator it = m_right.rbegin();       //这样的索引是错的
map<TreeNode*, int>::reverse_iterator it = m_right.rbegin();            

这也解释了为什么不能用rbegin()删除元素,因为map.erase不支持反向迭代器的删除:

2. 使用end再自减迭代器

auto it = m_right.end();      //it指向最后一个元素的下一个地址
it--;                         //it指向最后一个元素
root = it->first;
s = it->second;
m_right.erase(it);            //删除迭代器指向的元素

关于map.end(), c++参考里描述是指向“past-the-end element”,stackoverflow对这个past-the-end的解释

---------------2019.02.27----------------------------

map按key长度排序、倒排等

map按value排序

转载于:https://www.cnblogs.com/zhengmeisong/p/8446883.html

c++学习笔记(八)- map相关推荐

  1. ReactJS学习笔记八:动画

    ReactJS学习笔记八:动画 分类: react学习笔记 javascript2015-07-06 20:27 321人阅读 评论(0) 收藏 举报 react动画 目录(?)[+] 这里只讨论Re ...

  2. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  3. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...

  4. ROS学习笔记八:创建ROS msg和srv

    ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...

  5. Halcon 学习笔记八:颜色识别

    Halcon 学习笔记八:颜色识别 一.图像处理需要的知识 二.图像处理的预处理和分割过程 二.颜色识别的方法 三.例子一 四.例子二 五.例子三 一.图像处理需要的知识 1.图像处理基础(rgb(h ...

  6. ZooKeeper学习笔记(八):ZooKeeper集群写数据原理

    写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...

  7. MongoDB 学习笔记八 复制、分片、备份与恢复、监控

    MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...

  8. python3第三方库手册_python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑...

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...

  9. Polyworks脚本开发学习笔记(八)-组合运用命令批量改名

    Polyworks脚本开发学习笔记(八)-组合运用命令批量改名 需求解析 以下是使用包边比较点创建的一组包边点(即Gap点)和曲面点-包边点(即Flush点),这种命名方式不太常规,改为Gap和Flu ...

  10. Redis 学习笔记八:集群模式

    Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...

最新文章

  1. 基于 tcp协议完成的上传下载
  2. iOS编程陷井2,模拟器不可靠
  3. 02-1.CSS边框,边界,布局相关笔记
  4. LeetCode 231. 2的幂 LeetCode 338. 比特位计数(2进制1的个数)
  5. 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
  6. 疑似iPhone 13 mini原型机曝光:后置相机模组排布方式变化
  7. mongoDB学习——第一天
  8. java学习过程记录
  9. 开源要安全!Linux 基金会、GitHub、GitLab、Google 联合起来了!
  10. “对不起,我们只招有出色背景的技术人员!”
  11. 软件应用:HexorBase Tool 实战测试!
  12. docker镜像打包
  13. 代码炼金术·02集·卓越程序员磨刀不误砍柴工--快速学习能力
  14. 最全面的SpringMVC教程(二)——SpringMVC核心技术篇
  15. Visual Studio快捷键大全
  16. <论文阅读> DI-FODO — 3D距离传感器的快速视觉里程计
  17. 漫步者蓝牙耳机 LolliPods断连,充电异常问题解决
  18. 网页抖音批量取消关注JS代码
  19. 04、江苏专转本(专业课笔记)第四章、计算机网络与因特网
  20. 5G基站辐射致癌?一个源自19年前的某权威报告引发的谣言

热门文章

  1. python数学建模可视化,[Python与数学建模-数据处理与可视化]-3数据处理工具Pandas...
  2. asp前端日历_ASP+JavaScript的完整的日历使用-ASP教程,ASP应用
  3. linux 0.11根文件系统,构建一个最小Linux根文件系统
  4. [渝粤教育] 广东-国家-开放大学 21秋期末考试互联网营销概论10092k2
  5. 【渝粤教育】国家开放大学2018年春季 0179-21T数据库基础与应用 参考试题
  6. 【ACM2020】少样本学习综述
  7. Azure ARM (16) 基于角色的访问控制 (Role Based Access Control, RBAC) - 使用默认的Role
  8. cyyz: Day 6 平衡树整理
  9. leetcode笔记:Majority Element
  10. yum和apt-get 软件包管理器的用法及区别