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 ...
随机推荐
- maven如何将本地jar安装到本地仓库
1.首先确认你的maven是否已经配置: 指令:mvn -v 2.本地的jar包位置: 3.在自己项目pom.xml中添加jar依赖: <dependency> <groupId&g ...
- 洛谷P4495 奇怪的背包 [HAOI2018] 数论
正解:数论+dp 解题报告: 传送门! 首先看到这题,跳无数次,自然而然可以想到之前考过好几次了的一个结论——如果只考虑无限放置i,它可以且仅可以跳到gcd(p,v[i]) 举一反三一下,如果有多个i ...
- linux 查看文件目录大小
du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-de ...
- 27-4-DMA2D图形加速器
在实际使用 LTDC 控制器控制液晶屏时,使 LTDC 正常工作后,往配置好的显存地址写入要显示的像素数据, LTDC 就会把这些数据从显存搬运到液晶面板进行显示,而显示数据的容量非常大,所以我们希望 ...
- JavaScript学习(五)
- mac上Android反编译工具apktool、dex2jar入门
MAC上Apktool的安装 官网链接 image.png 使用步骤如图1-6 第一:下载一个shell脚本,保存的名字就是”apktool”,不要带.sh后缀.可以复制到sublimetext, ...
- echarts 实现tooltip双栏效果
实现效果如下: 代码: //option tooltip: { trigger: 'axis', axisPointer: { label: { show: true, fontSize: 15 } ...
- 2019.03.18 连接my sql
11.登陆功能(链接MySQL) python manage.py starapp movie 新建一个应用模块之后要记得到setting添加这个应用模块 在python2中你还有去导入一个MySQL ...
- [Java in NetBeans] Lesson 01. Java Programming Basics
这个课程的参考视频在youtube. 主要学到的知识点有: Create new project, choose Java Application. one .jar file/ package(.j ...
- 带上RESTful的金手铐,你累吗?
1. 首先RESTful是一套规范,不是框架,它是来约束你的.也不关心生产效率的提高.就好像使用汇编开发应用,性能是快了,但是生产效率很低.RESTful它需要你在路由上定义很多规则来解释的URL,假 ...