C++ 关联容器之map插入相同键元素与查找元素操作
一、插入相同键元素操作
(1)insert方法
在map中的键必须是唯一的,当想map中连续插入键相同但值不同的元素时,编译和运行时都不会发生任何错误,系统会忽略后面的对已存在的键的插入操作,如
map<int,int> m1;
m1.insert(make_pair(,));
m1.insert(make_pair(,));
for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){
cout<<mit->first<<":"<<mit->second<<endl;
}
在第二行和第三行分别插入键都为1,但值不同的数据,此操作会忽略第三行的插入操作,其程序运行结果为:
:
通过insert方法插入操作容易误解:
1. 认为插入相同键的操作会报错(正解:插入相同键的操作,无论是编译和运行时都不会报错)
2. 对插入相同键的数据时,后面的插入操作的值会覆盖前面的值,例如会误认为该例子中第三句的插入操作会使最终键为1的数据对应的值会被修改为3(正解:对于插入的数据的键值已存在,那么这个插入操作将会被忽略)
(2)通过下标操作
向map中插入元素还可以用数组(关联数组)下标的方式,先看下面的例子
map<int,int> m1;
m1[]=;
m1[]=;
for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){
cout<<mit->first<<":"<<mit->second<<endl;
}
运行结果
:
这段代码与insert示例中的代码差别只在第2,3行,而从结果上看通过下标方式插入元素操作后面的赋值操作覆盖了前面的赋值操作。稍后会进一步对下标操作进行分析。
二、查找并读取map中的元素
map容器最大的优点就在于它可以快速定位并读取某一键值的元素。
(1)通过下标查找
如下代码所示
map<string,int> m1;
cout<<m1["abc"]<<endl;
m1["abc"]=;
cout<<m1["abc"]<<endl;
运行结果:
由上面的代码可以看到,我们可以非常方便的通过数组下标的方式对map中的元素进行访问。但你可能对第2行的输出会有一些疑惑,因为最初map是空的,直接读取一个不存在的键,其居然会有正常的输出结果(可能并不是我们想要的),而之前我们并没有对该键进行任何赋值操作。
解释下标索引的机制
用下标访问map中不存在的元素时,将导致向map中添加该下标所指向的新元素,其值会根据类型默认值或默认构造函数进行初始化(如int或初始化为0,string初始化为“”)。
(2)通过方法count()和find()查找
因此,如果判断map中是否存在某键值的元素,一般不能通过取下标的方式判断,因为这样会想map中添加新元素。map标准库中提供了两种判断某键值的元素是否存在的方法,count()方法和find()方法,如下表
| map::count(k) | 返回map中键k出现的次数,这里只能取0(不存在)和1(存在) |
| map::find(k) | 如果容器中存在按k的索引元素,则返回指向该元素的迭代器。如果不存在则返回超出末端的迭代器 |
这两种方法不会向map中插入新元素,因此对map索引键判断时,应选用这两种方法。
C++ 关联容器之map插入相同键元素与查找元素操作的更多相关文章
- iBinary C++STL模板库关联容器之map/multimap
目录 一丶关联容器map/multimap 容器 二丶代码例子 1.map的三种插入数据的方法 3.map集合的遍历 4.验证map集合数据是否插入成功 5.map数据的查找 6.Map集合删除元素以 ...
- [知识点]C++中STL容器之map
UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...
- 类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
类 java.util.Collections 提供了对Set.List.Map进行排序.填充.查找元素的辅助方法. 1. void sort(List) //对List容器内的元素排序,排序的规 ...
- STL关联式容器之map和multimap
一,map和multimap的概念 1.map和multimap的基本知识 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中 ...
- C++ STL容器之 map
map 是一种有序无重复的关联容器. 关联容器与顺序容器不同,他们的元素是按照关键字来保存和访问的,而顺序元素是按照它们在容器中的位置保存和访问的. map保存的是一种 key - value 的pa ...
- C++STL模板库关联容器之set/multiset
目录 一丶关联容器简介.set/multiset 二丶演示代码. 一丶关联容器简介.set/multiset 我们的序列容器,底层都是线性表构成的. 比如 vector list deque. 关联容 ...
- STL容器之map
[1]map容器 map 是关联容器.容器中的每一个元素都是由一个键值和一个数据值组成的. set 是一个集合它以其元素作为键值(同一个键值只能出现一次),且默认以升序排列. list 是一个顺序容器 ...
- Java容器之Map接口
Map 接口: 1. 实现 Map 接口的类是用来存储键-值(key-value)对: 2. Map 接口的实现类有 HashMap 和 TreeMap 等: 3. Map 类中存储的键-值对,通过键 ...
- [知识点]C++中STL容器之set
零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 继上期的vector之后,我们又迎来了另一个类数组的STL容器——set. 二.用途与特性 set,顾名思义,集合 ...
随机推荐
- (转).net webconfig使用IConfigurationSectionHandler自定section
自定义配置结构 (使用IConfigurationSectionHandler) 假设有以下的配置信息,其在MyInfo可以重复许多次,那么应如何读取配置呢?这时就要使用自定义的配置程序了.<m ...
- hdu More is better
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:王老师要找一些男生帮助他完成一项工程.要求最后挑选出的男生之间都是朋友关系,可以说直接的, ...
- Android Wear 开发入门——怎样创建一个手机与可穿戴设备关联的通知(Notification)
创建通知 为了创建在手机与可穿戴设备中都能展现的通知,能够使用 NotificationCompat.Builder.通过该类创建的通知,系统会处理该通知是否展如今手机或者穿戴设备中. 导入必要的类库 ...
- C#面向对象复习概要
1.面向对象:我们将具有统一行为和属性的对象抽象划分为类,通过类去创建对象.这种编程思想叫做面向对象的编程思想. 2.属性:对象具有的属性 using System; using System.Col ...
- PHP的垃圾回收机制详解
原文:PHP的垃圾回收机制详解 最近由于使用php编写了一个脚本,模拟实现了一个守护进程,因此需要深入理解php中的垃圾回收机制.本文参考了PHP手册. 在理解PHP垃圾回收机制(GC)之前,先了解一 ...
- Spark入门级小玩
·背景 随着周边吐槽hadoop的声音渐渐多起来之后,spark也逐渐进入了大家的视野.之前,笔者有粗略的写过一篇spark的安装和性能比较[http://www.cnblogs.com/zacard ...
- Equals 和==
class Person { private string name; public string Name { get ...
- 关于Java中List对象的分页思想,按10个或者n个数对list进行分组
try { List<String> timelist = DateUtils.getDateListBySETime("2015-08-01", "2015 ...
- C#备份还原MySql数据库
原文:C#备份还原MySql数据库 项目结束,粘点代码出来让Google或Baidu一下,原因是现在还搜不到这么现成的 调用MySql的工具mysqldump来实现. 类Cmd来实现调用cmd命令, ...
- Android学习之 WebView使用小结
这段时间基于项目须要 在开发中与WebView的接触比較多,前段时间关于HTML5规范尘埃落定的消息出如今各大IT社区头版上,更有人说:HTML5将颠覆原生App开发 尽管我不太认同这一点 可是关于H ...