简介

该头文件包含两个概念相似的容器----mapmultimap。 而这两个容器反映的概念就是 映射

这两个容器 相同 的属性有:

  • 关联性
  • 映射
  • 动态增长
  • 键(Key)唯一性

这两个不相同的属性是:

  • 映射关系

容器类别

既然说到关联性容器,自然得说说标准库的容器类别。 C++库容器主要能分成以下几类:

  1. 序列性容器: 将存储对象组织成线性模型,使用户能够像线性数组那样存取。
  2. 关联性容器: 将存储内容以键(Key)相关联 ,通过键来存取内容。
  3. 乱序容器: 存储对象以乱序存储,不具有顺序。
  4. 容器适配器: 通过适配的方式实现,内部使用的是其它已有的容器。

map

map为单映射容器,所谓单映射,就是一对一映射的意思。 每种信息都以 键 -> 值 的形式被存储,由 映射到 ,这是该类容器与vector等容器最大的不同。

实现

典型的map是以Binary Search Tree实现的,但也有可能使用其他合适的数据结构。 例如sgi stl使用的就是红黑树。

operator [ ]

除了迭代器,存取map元素时使用的较多的就是这个运算符了。 但实际上这个函数的语义不像看上去那么简单,这主要是因为这个函数对特殊情况的处理非常罕见(相比而言,C++11新增的at成员函数就比较符合正常逻辑)。 函数传入一个键k:

如果键k在map中,函数返回k映射的内容值;

如果键k不在map中,那么函数会插入一个新的键值对,对插入的值进行默认构造,并且返回这个值得引用

Observers

这里有两个特别的函数,它们在C++标准文档里被成为Observers(可能是因为通过这两个函数能够一定程度上的观察键值对,一定程度是因为它们只能对键值对进行比较)。

key_compare		key_comp() const;
value_compare value_comp() const;

它们返回一个comparison object,可以分别对键、值进行比较。

lower_bound、upper_bound

这两个函数比较晦涩难懂,这里提出来说明一下。

lower_bound返回传入键的下界,包括该键(如果存在的话):

upper_bound返回传入键的上界,不包括该键(如果存在的话):

两个函数这样设计的话:

  1. 传入同一个键,能正确地将一个range分成上下两部分。
  2. 用迭代器表示的range,开始和结尾分别以闭区间和开区间表示,这两个函数的返回至可以非常直观的代表range。

特殊函数

因为映射容器的特殊性,map和multimap具有其他容器所没有的一些特殊函数:

  • find
  • count:因为map是单映射,所以它的返回至只可能是1或0
  • equal_range:返回给定键的元素范围,因为map是单映射,返回的范围为空或包含一个元素。 返回值为迭代器pair,分别等于调用lower_bound和upper_bound的结果。

multimap

multimap为一对多映射,即一个Key可能映射到多个值。

因为是一对多映射的关系,该库没有提供像map::operator []、map::at那样的元素存取函数, 而是想让用户依赖于lower_bound、upper_bound这些函数。

语义完整的函数

同时,因为允许一个键有对应多个值,某些函数也得到了它真正的意义:

  • count(不止是返回0、1)
  • equal_range(不止是返回空范围或包含一个元素的范围)

语义有异的函数

  • find(如果有多个值,返回任意一个

C++ 头文件系列(map)的更多相关文章

  1. C++ 头文件系列(unordered_map、unordered_set)

    简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...

  2. C++ 头文件系列(set)

    简介 头文件包含set.multiset两个类模版,这里要描述的概念与map非常相似,甚至连成员函数都几乎一样,所以这篇随笔会很短. set set如果翻译成中文应该是集合的意思,这里更确切的说是唯一 ...

  3. C++ 头文件系列(array)

    注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...

  4. C++ 头文件系列(queue)

    简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的 ...

  5. C++ 头文件系列(stack)

    简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...

  6. C++ 头文件系列(vector)

    简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或 ...

  7. C++ 头文件系列(iterator)

    简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a general ...

  8. C++ 头文件系列 (algorithm)

    简介 algorithm头文件是C++的标准算法库,它主要应用在容器上. 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性. 因此,任何 ...

  9. C++ 头文件系列 (bitset)

    简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...

随机推荐

  1. 支持持久化的内存数据库-----Redis

    一.Redis概述 1.1.什么是Redis Redis是一种高级key-value数据库.它跟memcached类似,不过数据 可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合 ...

  2. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)

    http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...

  3. CentOS 6.4 x64 Percona-Server-5.6.15 源码安装

    首先下载 Percona-Server-5.6 http://www.percona.com/downloads/Percona-Server-5.6/LATEST/source/ 然后必须先安装cm ...

  4. C++异常第二篇---C++标准库异常类exception的使用

    1 继承图示 2 具体讲解 C++标准库异常类继承层次中的根类为exception,其定义在exception头文件中,它是C++标准库所有函数抛出异常的基类,exception的接口定义如下: na ...

  5. HUST 1351 Group

    (莫名其妙的被一个叫布布扣的网站收录了......什么鬼) 简单DP.dp[i][j]表示把前i个数字分成j段的最优解, 递推式很容易写: (其中sum[]是前缀和:p <= i - L,并且前 ...

  6. 一次性能优化,tps从400+到4k+

    项目介绍 路由网关项目watchman ,接收前端http请求转发到后端业务系统,功能安全验证,限流,转发. 使用技术:spring boot+ nreflix zuul,最开始日志使用slf4j+l ...

  7. 测试部署nginx

    1.已经安装了nginx 2.修改tomcat端口号为10081(可随意) 3 修改nginx的nginx.config  如下: upstream apiserver {           ip_ ...

  8. C++中string

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...

  9. HTML5离线应用与客户端存储

    序言 本篇文章会详细介绍使用HTML5开发离线应用的步骤,以及本地存储与cookie的一些异同,最后利用上面所学例子来实现一个购物车场景. 使用HTML5离线存储的基本过程如下: 离线检测:首先要对设 ...

  10. OI队内测试一【数论概率期望】

    版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...