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 ...
随机推荐
- jquery中选取兄弟节点的方法
$('#id').siblings() 当前元素所有的兄弟节点$('#id').prev() 当前元素前一个兄弟节点$('#id').prevaAll() 当前元素之前所有的兄弟节点$('#id'). ...
- Python网络爬虫第三弹《爬取get请求的页面数据》
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- 六、SpringBoot与数据访问
六.SpringBoot与数据访问 1.JDBC spring: datasource: username: root password: 123456 url: jdbc:mysql://192.1 ...
- 移动端rem布局(阿里)
该方案使用相当简单,把下面这段已压缩过的 原生JS(源码已在文章底部更新,2017/5/3) 放到 HTML 的 head 标签中即可(注:不要手动设置viewport,该方案自动帮你设置) < ...
- php中$this->的用法简单介绍
php中我们一般是先声明一个类,然后用这个类去实例化对象!$this 的含义是表示实例化后的具体对象!$this->表示在类本身内部使用本类的属性或者方法.‘->’符号是“插入式解引用操作 ...
- secure CRT常用的查看服务器日志命令
tail -f /(日志文件目录) 查看日志命令ctrl+c停止打印ls -al 查看文件的详细信息路径等vi /(日志文件目录) 打开日志/搜索字符退出:按ESC后,按“:”,输入q, ...
- 爆破root密码hash John the Ripper和hydra爆破ssh密码
官方网站:http://www.openwall.com/john/ 下载:wget http://www.openwall.com/john/j/john-1.8.0.tar.gz 解压:tar - ...
- awk命令分析日志的简单笔记
awk是一个文本分析工具,可以用来进行流量日志分析 之前无意中看到了这个命令,简单记一下笔记 ,在打线下的时候可能会有用 awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gaw ...
- IOT专用IOP平台
10.110.20.200(iot) root 789a? centos7 给展湾paul,iot-hub 10.110.20.199(iot) root ce ...
- Java 基础 常用API (System类,Math类,Arrays, BigInteger,)
基本类型包装类 基本类型包装类概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类 ...