简介

该头文件包含两个概念相似的容器----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. USACO Section 1.1 Greedy Gift Givers 解题报告

    题目 问题描述 有若干个朋友,朋友之间可以选择互相赠送一些有价值的礼物.一个人可以选择将一部分钱分给若干个朋友,例如某人送给其他两个人钱,总共赠送3元,两个人平均分,原本应该是每人1.5元,但是只能取 ...

  2. 关于 CentOS 7 里面 普通用户 Ulimit max user processes 值的问题

    最近在对tomcat 的一个 项目进行 压测, 普通用户 启动 tomcat 的时候 压力上去以后就会报 java.lang.OutOfMemoryError 的错误, 这种错误 按道理来说都是 系统 ...

  3. POJ 3494 Largest Submatrix of All 1’s

    POJ 2796 Feel Good HDU 1506 Largest Rectangle in a Histogram 和这两题一样的方法. #include<cstdio> #incl ...

  4. PHP和MySQL Web开发(原书第4版) 高清PDF+源代码

    PHP和MySQL Web开发(原书第4版) 高清PDF+源代码 [日期:2014-08-06] 来源:Linux社区  作者:Linux [字体:大 中 小]     内容简介 <PHP和My ...

  5. MariaDB GTID 复制同步

    MariaDB GTID 复制同步 GTID:Global Transaction ID,全局事务ID,在整个主从复制架构中任何两个事物ID是不能相同的.全局事务ID是Mster服务器生成一个128位 ...

  6. Servlet实现文件上传(简单)(一)

     1..使用到的jar包,为apache的一个子项目  此commons-fileupload-1.2.2需要以下commons-io-2.0.1的支持   2.页面展示fileUpload.jsp ...

  7. IOS开发-UI学习-UINavigationController(导航控制器)的使用

    UINavigationController是IOS 中常用的功能,基本用法如下: 1.在AppDelegate.m中添加如下代码: #import "AppDelegate.h" ...

  8. MongoDB的$type操作符

    字段类型定义: db.col.find({"title" : {$type : 2}})

  9. sql语句:CASE WHEN END 的用法

    select b,c, CASE a ' ' ' end from test1

  10. shell 远程备份日志

    #!/bin/bash #Function:自动备份给定列表中的目录或文件,并且可以保留N天备份的档案. #可备份至远程主机指定的目录下,但需本机能免密码登录到远程主机,用到ssh-keygen #该 ...