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 ...
随机推荐
- 并查集——合作网络D306
合作网络D306 运行时间限制:1000ms: 运行空间限制:51200KB: 试题描述 有n个结点,初始时每个结点的父结点都不存在.你的任务是执行若干次Set操作和Query ...
- 使用Jersey上传文件
采用jquery.form.js异步上传图片,并结合<form>表单 <script type="text/javascript"> //采用jquery. ...
- office excel中怎么添加批注及修改批注用户名
office excel中怎么添加批注及修改批注用户名 参考:https://jingyan.baidu.com/article/c33e3f48a52853ea15cbb5db.html 1. of ...
- (1.4)mysql sql mode 设置与使用
关键词: mysql sql mode 1.查阅 mysql> mysql> show variables like 'sql_mode%';+---------------+------ ...
- windows系统redmine安装总结
今天在公司服务器上安装了redmine,主要用于项目管理和缺陷跟踪.安装过程比较简单,总结如下: 1.网上下载redmine安装包(bitnami-redmine-3.3.1-0-windows-in ...
- ES6语法 promise用法
ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...
- Py中的矩阵乘法【转载】
转自:https://blog.csdn.net/cqk0100/article/details/76221749 1.总结 对于array对象,*和np.multiply函数代表的是数量积,如果希望 ...
- jenkins 常见问题汇总
1.jenkins api调用 https://my.oschina.net/sanpeterguo/blog/197931 其中,有个错误的地方,带参数构建时,使用的时POST方法,如下: curl ...
- Hybrid设计--账号体系的建设
前后端分离:开发效率高,没有SEO 现在是重客户端设计:交互和业务逻辑是前端来写,适合做前后端分离.对前端更友好,提高了效率. 传统模式开发:整个业务逻辑是server端写,不适合做前后端分离.ser ...
- 【cocos2d-js官方文档】事件分发监听机制(摘录)
简介 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处理用户交互就需要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件处理逻 ...