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类型)的更多相关文章

  1. c++ primer 3 标准库类型

    3.1 命名空间的using声明 using声明是对某个命名空间做引入.主要作用是简化代码编写. 比如用cout的三种方式: using namespace std; using std::cout; ...

  2. 把《c++ primer》读薄(3-3 标准库bitset类型)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...

  3. Primer回顾 标准库类型

    string类型的输入操作符: 1.读取并忽略开头所有的空白字符(如空格,换行符,制表符). 2.读取字符直至再次遇到空白字符,读取终止.   用getline读取整行文本 getline.接受两个参 ...

  4. 【C++ Primer每日刷】之三 标准库 string 类型

    标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...

  5. C++标准库vector类型的使用和操作总结

    vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...

  6. c/c++ 标准库 map multimap元素访问

    标准库 map multimap元素访问 一,map,unordered_map下标操作 下标操作种类 功能描述 c[k] 返回关键字为k的元素:如果k不在c中,添加一个关键字为k的元素,并对其初始化 ...

  7. c/c++ 标准库 map set 插入

    标准库 map set 插入 一,插入操作 有map如下: map<string, size_t> cnt; 插入方法: 插入操作种类 功能描述 cnt.insert({"abc ...

  8. c/c++ 标准库 map set 大锅炖

    标准库 map set 大锅炖 一,关联容器有哪些 按关键字有序保存元素 map 保存key和value set 只保存key mulutimap key可以重复出现 multiset key可以重复 ...

  9. C++标准库string类型

    string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...

随机推荐

  1. Socket网络编程详解

    一,socket的起源 socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的, 撰写者为Stephen Carr.Steve Crocker和Vi ...

  2. vue项目开发中遇到的问题总结--内部分享

     1.路由变化页面数据不刷新问题 这种情况一般出现在vue-router的history模式下,初次进入会执行钩子函数,再次进入时则不会. 解决方案: 监听路由变化 watch : { "$ ...

  3. 原生JS模拟百度搜索关键字与跳转

    <style type="text/css"> *{ margin: 0; padding: 0; } #text{ width: 300px; height: 30p ...

  4. ng-book札记——内置指令

    Angular提供了一些内置指令(directive),这些添加在HTML元素(element)上的特性(attribute)可以赋予更多的动态行为. NgIf ngIf指令用于在某个条件下显示或者隐 ...

  5. 粗浅看Struts2和Hibernate框架

    ----------------------------------------------------------------------------------------------[版权申明: ...

  6. 如何找出Xcode中不同版本Swift的路径

    我们知道Xcode中可能包含不知一个Swift的版本,那么我们如何找到它们对应的路径呢? 熟悉unix shell命令的童鞋都知道有一个find指令,在我们已知Xcode路径时,我们可以在其中找到Sw ...

  7. Android Lollipop 5.0 经典新特性回顾

    *Tamic 专注移动开发! 更多文章请关注 http://blog.csdn.net/sk719887916 虽然Android已到了7.0 ,但是我们还是不能忘怀视觉革命性改变的5.0,今天回顾下 ...

  8. 【安卓开发】Layout Inflation不能这么用

    Layout inflation在Android上下文环境下转换XML文件成View结构对象的时候需要用到. LayoutInflater这个对象在Android的SDK中很常见,但是你绝对没想到竟然 ...

  9. 数据标准化/归一化normalization

    http://blog.csdn.net/pipisorry/article/details/52247379 基础知识参考: [均值.方差与协方差矩阵] [矩阵论:向量范数和矩阵范数] 数据的标准化 ...

  10. iOS9中关于地址簿ABAddressBookXXX之类方法被废弃的解决

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在iOS9的SDK中我们会发现原来地址簿权限查询,获取以及创建 ...