c++学习笔记(八)- map
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相关推荐
- ReactJS学习笔记八:动画
ReactJS学习笔记八:动画 分类: react学习笔记 javascript2015-07-06 20:27 321人阅读 评论(0) 收藏 举报 react动画 目录(?)[+] 这里只讨论Re ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
- ROS学习笔记八:创建ROS msg和srv
ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...
- Halcon 学习笔记八:颜色识别
Halcon 学习笔记八:颜色识别 一.图像处理需要的知识 二.图像处理的预处理和分割过程 二.颜色识别的方法 三.例子一 四.例子二 五.例子三 一.图像处理需要的知识 1.图像处理基础(rgb(h ...
- ZooKeeper学习笔记(八):ZooKeeper集群写数据原理
写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...
- MongoDB 学习笔记八 复制、分片、备份与恢复、监控
MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...
- python3第三方库手册_python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑...
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
- Polyworks脚本开发学习笔记(八)-组合运用命令批量改名
Polyworks脚本开发学习笔记(八)-组合运用命令批量改名 需求解析 以下是使用包边比较点创建的一组包边点(即Gap点)和曲面点-包边点(即Flush点),这种命名方式不太常规,改为Gap和Flu ...
- Redis 学习笔记八:集群模式
Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...
最新文章
- 基于 tcp协议完成的上传下载
- iOS编程陷井2,模拟器不可靠
- 02-1.CSS边框,边界,布局相关笔记
- LeetCode 231. 2的幂 LeetCode 338. 比特位计数(2进制1的个数)
- 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
- 疑似iPhone 13 mini原型机曝光:后置相机模组排布方式变化
- mongoDB学习——第一天
- java学习过程记录
- 开源要安全!Linux 基金会、GitHub、GitLab、Google 联合起来了!
- “对不起,我们只招有出色背景的技术人员!”
- 软件应用:HexorBase Tool 实战测试!
- docker镜像打包
- 代码炼金术·02集·卓越程序员磨刀不误砍柴工--快速学习能力
- 最全面的SpringMVC教程(二)——SpringMVC核心技术篇
- Visual Studio快捷键大全
- <论文阅读> DI-FODO — 3D距离传感器的快速视觉里程计
- 漫步者蓝牙耳机 LolliPods断连,充电异常问题解决
- 网页抖音批量取消关注JS代码
- 04、江苏专转本(专业课笔记)第四章、计算机网络与因特网
- 5G基站辐射致癌?一个源自19年前的某权威报告引发的谣言
热门文章
- python数学建模可视化,[Python与数学建模-数据处理与可视化]-3数据处理工具Pandas...
- asp前端日历_ASP+JavaScript的完整的日历使用-ASP教程,ASP应用
- linux 0.11根文件系统,构建一个最小Linux根文件系统
- [渝粤教育] 广东-国家-开放大学 21秋期末考试互联网营销概论10092k2
- 【渝粤教育】国家开放大学2018年春季 0179-21T数据库基础与应用 参考试题
- 【ACM2020】少样本学习综述
- Azure ARM (16) 基于角色的访问控制 (Role Based Access Control, RBAC) - 使用默认的Role
- cyyz: Day 6 平衡树整理
- leetcode笔记:Majority Element
- yum和apt-get 软件包管理器的用法及区别