C++ Primer 有感(标准库map类型)
map是键-值对的集合。map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样。而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取。
1.map对象的定义
要使用map对象,则必须包含map头文件。在定义map对象时,必须分别指明键和值得类型
map<string,int> word_count;
string为键,int为值
map的构造函数
map<k,v> m; //创建一个名为m的空map对象,其键和值得类型分别为k和v
map<k,v> m(m2); //创建m2的副本m,m与m2必须有相同的键类型和值类型
map<k,v> m(b,e) //创建map类型的对象m,存储迭代器b和e标记范围内所有元素的副本。元素的类型必须能转换为pair<const k,v>。
2.map定义的类型
map<k,v>::key_type 在map容器中用作索引的键的类型
map<k,v>::maped_type 在map容器中,键所关联的值得类型
map<k,v>::value_type 一个pair类型,它的first元素具有const map<k,v>::key_type类型,而second元素则为map<k,v>::maped_type类型。
对map迭代器进行解引用将获得一个pair对象,它的first成员存放键,为const,而second成员则存放值。
3.给map添加元素
与其他下标操作符一样,map的下标也是使用索引获取该键关联的值。如果该键在容器中,则map的下标运算与vector的下标元素一样:返回该键所关联的值。只有在所查的键不存在是,map容器才为该键创建一个新的元素,并将它插入到此map对象中。此时,所关联的值采用值初始化:类类型的元素用默认的构造函数初始化,而内置类型的元素则初始化为0。
map容器提供的insert操作
m.insert(e) e是在m上的value_type类型的值。如果键(e.first)不在m中,则插入一个e.second的新元素;如果该键在m中已经存在,则保持m不变。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素
m.insert(beg,end) 迭代器之间的元素必须为value_type类型的键-值对。在该范围内的元素,如果不在m中,则插入。
m.insert(iter,e) 从迭代器iter开始寻找,不存在m中则插入,返回迭代器,指向m中具有指定键的元素
word_count.insert(map<string,int>::value_type("Anna",1));
也可以简化为 word_count(make_pair("Anna",1));
使用第一种方法插入返回的是pair类型。
pair<map<string,int>::iterator,bool> ret=word_count.insert(map<string,int>::value_type("Anna",1));
4.查找并获取map中的元素
使用下标获取map中国的值,如果该键不存在,则插入了显得元素。下面map提供了两个操作
m.count(k) 返回m中k出现的次数
m.find(k) 存在则返回指向该元素的迭代器,否则返回超出末端迭代器
对于map,count的返回值只可能是0或者1,通过该函数就可以知道是否存在,然后使用下标操作,则不会出现不存在则插入新元素的问题。
对于find函数,通过判断是否与超过末端的迭代器相等判断是否存在,若存在则使用返回的迭代器,该返回的迭代器是pair类型,通过下面的方法获得值int value=iter->second;
5.从map中删除元素
m.erase(k) 删除m中键为k的元素。返回size_type类型的值,表示删除元素的个数
m.erase(p) 从m中删除迭代器p所指向的元素。p必须指向m中确实存在的元素,而且不能等于m.end()。返回void类型
m.erase(b,e) 从m中删除一段范围内的元素,该范围由迭代器对b和e标记。b和e必须标记m中一段有效范围:即b和e都必须指向m中的元素或者最后一个元素的下一个位置。而且b和e要么相等(此时删除的范围为空),要么b指向的元素必须出现在e所指向的元素之前。返回void类型。
除此之外,map还提供一种特殊的erase操作,其参数是key_type类型的值,如果拥有该元素的键存在,则删除该元素,返回删除的个数。对于map来说,返回值为1或者0。0表示表示删除的元素在map中不存在。
对于map对象的遍历,可以使用迭代器,m.end()和m.begin()。
C++ Primer 有感(标准库map类型)的更多相关文章
- c++ primer 3 标准库类型
3.1 命名空间的using声明 using声明是对某个命名空间做引入.主要作用是简化代码编写. 比如用cout的三种方式: using namespace std; using std::cout; ...
- 把《c++ primer》读薄(3-3 标准库bitset类型)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...
- Primer回顾 标准库类型
string类型的输入操作符: 1.读取并忽略开头所有的空白字符(如空格,换行符,制表符). 2.读取字符直至再次遇到空白字符,读取终止. 用getline读取整行文本 getline.接受两个参 ...
- 【C++ Primer每日刷】之三 标准库 string 类型
标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...
- C++标准库vector类型的使用和操作总结
vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...
- c/c++ 标准库 map multimap元素访问
标准库 map multimap元素访问 一,map,unordered_map下标操作 下标操作种类 功能描述 c[k] 返回关键字为k的元素:如果k不在c中,添加一个关键字为k的元素,并对其初始化 ...
- c/c++ 标准库 map set 插入
标准库 map set 插入 一,插入操作 有map如下: map<string, size_t> cnt; 插入方法: 插入操作种类 功能描述 cnt.insert({"abc ...
- c/c++ 标准库 map set 大锅炖
标准库 map set 大锅炖 一,关联容器有哪些 按关键字有序保存元素 map 保存key和value set 只保存key mulutimap key可以重复出现 multiset key可以重复 ...
- C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...
随机推荐
- async/await 的一些知识
博文 Don't Block on Async Code What is the purpose of "return await" in C#? Any difference b ...
- Vue2.0搭建脚手架流程
介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 安装node.js ...
- 再见,segmentfault
再见,segmentfault 太多的Bug,对segmentfault已经爱不起了. 重回博客园~
- Android 学习笔记二 自定义按钮形状 颜色 点击渐变
问题:自定义按钮的颜色 形状弧度 渐变效果 1.新建自定义属性button_login.xml (借鉴某大神) <?xml version="1.0" encoding=& ...
- 疯狂的Django 之深度外键跨表查找之疯狂INNER JOIN
定义Model: from django.db import models class Moreinfo(models.Model): weight = models.FloatField() hei ...
- iOS开源加密相册Agony的实现(七)
简介 虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制.本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目).Wi ...
- ZooKeeper之(二)数据模型
ZooKeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统: 树形结构的每个节点都被称作为Znode. Zonde通过路径引用,如同Unix中的文件路径.路径必须是绝对的,因 ...
- Objective-C的继承与组合
Objective-C的继承与组合 Objective-C与Java继承上的区别 区别 Objective-C Java 成员变量 Objective-C继承不允许子类和父类拥有相同名称的成员变量 J ...
- Android简易实战教程--第四十五话《几种对话框》
Android中提供了各种原生的对话框,在使用简单的功能的时候,还不比考虑自定义,使用原生的也能完成功能.本篇简单小案例就介绍三种对话框. 还是直接上代码吧: 布局中三个点击事件的按钮: <Li ...
- 高通开发笔记---Yangtze worknote
点击打开链接 1. repo init -u git://review.sonyericsson.net/platform/manifest -b volatile-jb-mr1-yangtze 2. ...