c++学习笔记(八)- map
map<key, value>是按key排好序的,key不可以重复。
1. map.lower_bound():按key查找,如果查找的key存在,返回该位置,如果不存在返回大于所查找值的最小key所在位置
#include <iostream>
#include <map>
using namespace std; int main ()
{
std::map<char,int> mymap;
std::map<char,int>::iterator itlow,itup; mymap['a']=;
mymap['b']=;
mymap['b']=; //key值不重复,会把b的value更新为50
mymap['c']=; //value的值可以重复
mymap['d']=;
mymap['e']=; for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
cout<<endl;
//这段程序其实并不能成功插入,因为key=b已经存在了,value也不会更新
itlow=mymap.lower_bound ('b'); //如果键值b存在,itlow指向b,否则指向比b大的最小key所在位置
mymap.insert(itlow,std::map<char,int>::value_type('b',)); //向itlow指向的位置插入map<'b',40> for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
cout<<endl; char c='a';
while()
{ //输入一个字符并插入
cin>>c;
itlow = mymap.lower_bound(c);
if(itlow != mymap.end())
cout<<"insert "<<c<<" to position: "<<itlow->first<<" , "<<itlow->second<<'\n';
mymap.insert(itlow, map<char,int>::value_type(c, +c));
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
cout<<endl;
}
return ;
}
输出结果:
a => 20
b => 50
c => 80
d => 80
e => 100 a => 20
b => 50
c => 80
d => 80
e => 100 d //并没有成功插入,d的value还是原来的80
insert d to position: d , 80
a => 20
b => 50
c => 80
d => 80
e => 100 z //插入位置在map.end
a => 20
b => 50
c => 80
d => 80
e => 100
z => 282 x
insert x to position: z , 282
a => 20
b => 50
c => 80
d => 80
e => 100
x => 280
z => 282
2. map.key_comp(),只有第一个参数小于第二个才返回true。
函数返回值是bool型,输入是两个key值,key_comp()(a,b),当a<b时返回1,否则返回0。
#include <iostream>
#include <map>
using namespace std;
int main ()
{
std::map<char,int> mymap; mymap['a'] = ;
mymap['c'] = ;
mymap['x']=;
mymap['y']=;
mymap['z']=; std::cout << "mymap contains:\n";
map<char,int>::iterator it = mymap.begin();
for( it = mymap.begin();it!=mymap.end();it++)
cout<<it->first<<" => "<<it->second<<'\n';
cout<<endl; map<char,int>::iterator pit = mymap.begin();
pit++;
pit++; //pit指向第三个元素map<x,101> it = mymap.begin();
for( it = mymap.begin();it!=mymap.end();it++)
{
cout<<"key comp result: "<<mymap.key_comp()(it->first, pit->first)<<endl;
}
cout<<endl;
return ;
}
结果:
mymap contains:
a =>
c =>
x =>
y =>
z => key comp result:
key comp result:
key comp result: 0 //此时it=pit
key comp result:
key comp result:
-----------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----------------------------
c++学习笔记(八)- map的更多相关文章
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- Go学习笔记之Map
Go学习笔记之Map Map 引用类型,哈希表.map的key必须可以比较相等,除了slice, map, function的内建类型都可以作为key.struct类型不包含上述字段,也可作为key. ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- Python学习笔记之map、zip和filter函数
这篇文章主要介绍 Python 中几个常用的内置函数,用好这几个函数可以让自己的代码更加 Pythonnic 哦 1.map map() 将函数 func 作用于序列 seq 的每一个元素,并返回处理 ...
- ROS学习笔记八:基于Qt搭建ROS开发环境
1 前言 本文介绍一种Qt下进行ROS开发的完美方案,使用的是ros-industrial的Levi-Armstrong在2015年12月开发的一个Qt插件ros_qtc_plugin,这个插件使得Q ...
随机推荐
- python摸爬滚打之day12----生成器, 各种生成式
1.生成器 生成器的本质就是迭代器. 1.1 获取生成器 1: 生成器函数 函数中出现 "yield" 的函数就是一个生成器函数, 再次执行函数时就不是运行函数而是获取生成器. ...
- HashMap如何做循环遍历
1.TestCase:
- javascript与XML
曾几何时,XML一度成为存储和通过因特网传输结构化数据的标准,之前,浏览器无法解析XML数据时,开发人员都要手动编写自己的XML解析器.而自从DOM出现后,所有浏览器都内置了对XML的原生支持(XML ...
- 对web标准化(或网站重构)知道哪些相关的知识,简述几条你知道的Web标准?
网页主要有三部分组成:结构(Structrue).表现(Presentation)和行为(Behavior).对应的网站标准也分为三方面: 1.结构化标准语言,主要包括XHTML和XML: 2.表现标 ...
- oracle如何查看执行计划
1.在PL/SQL Developer中得到一个SQL的执行计划 输入想要查看执行计划的目标SQL,再按一下快捷键F5就可以了.2.explain plan 命令 explain plan for + ...
- sql server 复制、镜像常见故障处理
sql server2008数据库复制实现数据同步常见问题 操作使用的一些技巧(事务复制类型): 1.如何修改一个已经发布的表的属性? 将发布所有订阅删除,(发布不用删除),就可以在发布属性的项目中取 ...
- OpenFace的一些了解
1.OpenFace内4个样例代码 配置学习了两个 其一: Ubantu 基本命令 Docker 安装方式.发布网站方式.查看验证安装结果命令 Openface 基本demo 实现方式.和基本原理 其 ...
- spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录。如果不放置在根目录下,将会提示 no mybatis mapper was found
spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录.将会将同一目录下的包扫描成bean. 如果不放置在根目录下,将会提示 no mybatis map ...
- [js]js的表单验证onsubmit方法
http://uule.iteye.com/blog/2183622 表单验证类 <form class="form" method="post" id= ...
- Android使得Fragment 切换时不重新实例化
以前实现Fragment的切换都是用replace方法实现 public void startFragmentAdd(Fragment fragment) { FragmentManager frag ...