map 和 multimap 将 key/value pair(键值对)当做元素进行管理,它们可根据 key 的排序规则(sorting criterion,也即在构造某一具体实例 map 实例时,可以模板参数的形式指定排序规则)自动为元素排序。multimap 允许重复元素,map 不允许。

模板参数

可像 set容器一样指定排序规则。来看它们的基本构造:

namespace std {template <typename Key, typename T, typename Compare = less<Key>,typename Allocator = allocator<pair<const Key, T>> >class map;template <typename Key, typename T, typename Compare = less<Key>,typename Allocator = allocator<pair<const Key, T>> >class multimap;
}

元素的次序由它们的 key 决定,和 value 无关。

元素的插入与移除(inserting and removing)

std::map<std::string, float> coll;
  • 法一

    自 C++11 起,安插元素的最方便做法就是把它们以初值列(initializer list)的形式传进去,其中第一笔数据是 key,第二笔则是 value。

    coll.insert({"otto", 22.3});
  • 法二

    运用 value_type,其是map容器实例提供的类型定义:

    coll.insert(std::map<std::string, float>::value_type("otto", 22.3));
  • 法三

    运用 pair

    coll.insert(std::pair<std::string, float>("otto", 22.3));
  • 法四

    运用便捷函数 std::make_pair,C++ 11面世之前最方便的办法即是运用 make_pair()函数,它根据收到的两个实参构建出一个pair对象;

    coll.insert(std::make_pair("otto", 22.3));

排序规则只返回true/false,map容器如何实现查重与去重

排序规则针对的只是键(key),而不比较值(value)。

map容器实例而言,排序规则也是可以用来检查相等性的:如果俩个元素的key彼此都不小于对方,两个元素被视为相等:

{x≥yy≥x⇒x=y

\left \{ \begin{array}{l} x\geq y\\ y\geq x \end{array} \right .\Rightarrow x=y

迭代器类型

map/multimap支持的迭代器相关函数:

  • c.begin() / c.end()
  • c.cbegin() / c.cend()
  • c.rbegin() / c.rend()
  • c.crbegin() / c.crend()

和其他所有的关联容器一样,这些迭代器都是双向迭代器。所以,对于只能接受随机访问迭代器的 STL 算法(例如排序算法或随机乱序random shuffling算法),map / multimap 就无福消受了。

更为重要的是,在 map / multimap 中,所有元素的 key 都被视为常量,因此,元素的实质类型是pair<const Key, T>。这个限制是为了避免你试图变更元素的 key而破坏已排好的元素次序。

标准模板库(STL)之 map 列传相关推荐

  1. C++ 标准模板库(STL)

    C++ 标准模板库(STL) C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列) ...

  2. c++标准模板库STL【快速查找】【最全】【常用】【语法】

    c++标准模板库STL[快速查找][最全][常用][语法] c标准模板库STL快速查找最全常用语法         vector- 变长数组         set-内部自动有序且不含重复元素     ...

  3. 第十章 标准模板库STL

    第十章 标准模板库STL 因为是在复习时重写的,无法在PTA上验证,编程题格式可能有误. 判断题 1.可以通过下标随机访问向量vector中的元素.(T) 2.当向量对象的内存用完之后,就会产生越界错 ...

  4. 标准模板库STL(Standard Template Library)

    标准模板库STL(Standard Template Library)指南 /*刘振飞liuzf@pku.org.cn 1999-10-20*/ / *版权所有 (C) 1999-2004 刘振飞li ...

  5. 蓝桥杯算法竞赛系列第0章——蓝桥必考点及标准模板库STL(上)(万字博文,建议抱走)

    欢迎来到:遇见蓝桥遇见你,不负代码不负卿! 目录 ​ 一.蓝桥必考点剖析 二.什么是STL 三.vector的常见用法详解 1.vector的定义 2.vector容器内元素的访问 (1).通过下标访 ...

  6. C++ ——模板 标准模板库STL

    C++ 知识基础 流操作符 类 & 基础 初始化和重载 类 & 高级 继承和多态 模板 & 标准模板库STL 目录 C++ 一.模板 1.函数模板 2.类模板 二.标准模板库S ...

  7. C++ 标准模板库 STL 概述

    泛型程序设计 C++ 的特点: ​ C++ 的核心优势之一就是便于软件重用,而软件的重用在 C++ 中主要体现在以下两个方面: 面向对象的思想:继承.多态和标准类库 泛型程序设计的思想:模板机制和标准 ...

  8. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  9. 13 标准模板库STL【C++】

    13 标准模板库STL 13- 判断题 单选题 填空题 程序填空题 函数题 7-1 .查找电话号码 7-2 姓名排序 7-3 Score Processing 13+ 编程题 7-1 查找成绩并折算后 ...

  10. C++中标准模板库STL基本概念

    0. 前言 C++语言的一大优势就是便于软件的重用,而重用体现在两方面: 1. 面向对象思想:继承和多态,标准类库 2. 泛程序设计(Generic Programming)思想:模板机制,标准模板库 ...

最新文章

  1. 独家 | 深度学习基础——激活函数以及什么时候使用它们?(附代码)
  2. 由Linux内核bug引起SSH登录缓慢问题的排查与解决
  3. 一个基于Mule的企业服务总线的案例(关于JMS)
  4. python分割字符串输出_python字符串分割
  5. iOS 应用内跳转到appstore里下载
  6. Linux进阶之路————Linux运行级别(重置密码)
  7. mac下载百度网盘文件限速_百度网盘限速怎么办 (20200412 )
  8. Oracle occi 抓包,instantclient 32下载-instantclient-basic(轻量级数据库)32位 11.2.0.4.0 官方版 - 河东下载站...
  9. Access of undefined property JSON:无法明确解析多名称引用
  10. 功能详细设计文档模板
  11. 杰理AD14N/AD15N---外置Flash烧录音乐文件
  12. DOS命令查看局域网所有IP
  13. 常用图片jpg png jpeg gif等格式介绍
  14. 东芝服务器报错误代码维修,东芝复印机错误代码和维修代码
  15. MOSFET的特性曲线及特性方程
  16. OPPO正在拆掉“创新围墙”
  17. 动态规划 HDU 1493 QQpet
  18. vscode vim 分组替换_写给 VS Code 用户的 Vim 入坑指南
  19. dig命令的使用方法
  20. java架构百度云视频,Java系列学习进阶视频

热门文章

  1. 计算机系统访问控制的功能,访问控制是为了限制访问主体对访问客体的访问权限,从而使计算机系统在合法范围内使用的安全措施,以下关于访问控制的叙述中,()是不正确的 - 信管网...
  2. 数值分析方程求根实验matlab,基于matlab的数值分析( 非线性方程求根)上机实验报告1...
  3. 拼装sql_2020最新最全面的SQL优化干货总结
  4. java swing 删除事件_java swing清除事件队列
  5. latex 中表格怎么指定编号_在医学论文中,应用表格怎么用才是正确的?
  6. 第3章 动态规划 矩阵连乘问题
  7. C#调用open cv函数
  8. 单元测试spock框架基础
  9. hadoop05---进程线程
  10. C#高级编程 第十五章 反射