map简介

map是STL中的一个关联式的容器,可以建立key(first)和value(second)一对一的联系,由key映射到value。
map内部自建了一棵红黑二叉树,可以对数据进行自动排序,所以map里的数据都是有序的,这也是我们通过map简化代码的原因。
使用map需要声明头文件#include"map"

map特点

自动建立key-value的对应关系,key和value可以是你需要的任何类型。
快速查找,删除记录,根据key值查找的复杂度基本上是long(n)
key和value一一对应的关系可以去重
-map的基本操作

-构造map:

map<int,string> map_student
//定义了一个由int映射到string的map,并命名为map_student
这里的first和second的数据类型可以是任意类型的数据,包括自定义的数据类型。

向map中插入数据:

1.这里通常的方法是把map用数组的方法插入数据。
-

可以看出第二次的操作覆盖了第一次的key对应的value。

2.用insert()函数插入数据//(1)(2)等价
(1)insert(map<int,string>::value_type(1,"student1"));
(2)insert(make_pair(1,"student1"));
与方法1不同的是,insert()函数体现了映射的一一对应这一特性,即当map中有这个key时,就不能用insert插入数据了,但是用数组的方法1是可以覆盖原数据的。

使用find()查找

用find函数来定位数据出现位置它返回的是一个迭代器。当数据出现时,它返回的是数据所在位置的迭代器。如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

使用count函数

count函数返回的是数据在映射中出现的次数,即0或1.无法定位数据在映射中出现的位置。

map在题目中的应用

1.去重 2.排序 3.计数
去重:利用映射的一一对应性,把可能出现重复的数据设置为key值以达到去重的目的。

排序(按照key排序):map是STL中的一个模版类,以下是map的定义:

template < class Key, class T, class Compare = less<Key>,  class Allocator = allocator<pair<const Key,T> > > class map;

其实map里应该有四个变量(第四个不用看),而第三个变量是排序方式,如果我们不指定排序方式的话,按照平时的写法,map就会按照模版中的less进行排列。

如果我们想按照我们自己的想法来对key排序呢?

我们先来看一下class Compare = less的类模版:

template <class T> struct greater : binary_function <T,T,bool> {  bool operator() (const T& x, const T& y) const  {return x>y;}
};

抓关键点:return的值是较大的,即为key升序排列。
自定义Compare类(依葫芦画瓢)
我们可以自己定义一个Compare类,把这个类按照map的模版,加在本该在Compare类的位置上,就可以自定义key的排序方式了。

比如我建了一个学生-成绩的map,原先是按照学生名字的字典序
排序的。

如果我想按照降序呢?学生姓名长度呢?

  • 按照默认cmp的输出:

  • 降序输出:

-自定义cmp按照长度升序输出:

3,计数:假设定义一个map<string,int>map1,输入数据s,记为first,如果这个数据存在,map1[s]++; 如果不存在,map1[s]=1;

什么样的题适合使用map

1.去重类问题

2.可以打乱重新排列的问题

3.有清晰的一对一关系的问题

C++STL库中的map容器相关推荐

  1. C++11 中STL库中新增内容

    C++ 11一个比较显著的变化是以前boost库中的一些函数被正式标准化合入到STL中了,本文就简单的介绍一下. 引用包装器(Reference Wrapper) 当模板函数参数为泛型类型的时候,无法 ...

  2. STL库中string类内存布局的探究

    在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...

  3. C++STL库中不可或缺的部分—string(模拟实现)

    前文 大家好,本篇文章主要是讲解一下 string一些常用接口的模拟实现. 众所周知,在日常生活中,字符串无处不在,如 ''just do it'',''中国'',''一坤年''等,想要在计算机上将这 ...

  4. SDNUOJ 1703.字谜|STL库中map的使用/map映射

    题目 Description 输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本的另外一个单词.在判断是否满足条件时,字母不分大小写,但在输出时应保留输入的大小写.满足条件 ...

  5. 简单实现STL库中的容器vector

    一.简要说明 本篇博客实现的容器仅仅可存放任意基本数据类型的元素,但是还没有实现容器可存放容器类型的元素(类似于多维数组). 二.代码实现 2.1 数组声明 #define INCREASEMENT ...

  6. c++中的map容器

    map/multimap基本概念 Map的特性是,所有元素都会根据元素的键值自动排序.Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两 ...

  7. c++ stl库中begin()和end()的区别

    c.begin();           返回指向容器最开始位置数据的指针 c.end();             返回指向容器最后一个数据单元+1的指针 如果我们要输出最后一个元素的值应该是 *( ...

  8. 关于微软企业库中依赖注入容器Unity两种生成对象的实现

    看了很多牛人关于Unity的文章后,深有感触 下面简单介绍下UnityContainer 怎么注册和生成具体类的对象 假设我们一个命名空间为UnityContainerText的项目中拥有一个接口和实 ...

  9. STL库中的优先队列

    priority_queue是一个优先队列,优先级高的最先出队,默认最大值优先.内部实现为堆,因此出队和入队的时间复杂度均为O(logn).可以自定义优先级控制出队顺序优先队列不支持删除堆中指定元素, ...

最新文章

  1. Linux火狐解压完运行不了,在Ubuntu系统下firefox账号无法登录的解决
  2. 2020年高等数学方法与提高(上海理工大学)学习笔记:一元函数微分学
  3. P2447 [SDOI2010]外星千足虫
  4. 线段树-Mex-洛谷P4137
  5. 飞鸽传书软件来说到目前为止最难走的路
  6. SpringBoot中获取微信用户信息竟然这么简单!
  7. 强化学习离轨策略:从失败中获得成功经验 - 以追女孩为例 | 采样率的数学意义
  8. R语言 需要安装的包
  9. uniapp 微信内置浏览器h5打开app
  10. 企业资源规划 ERP
  11. 根据IP地址查询所在地
  12. HDU 4826Labyrinth(dp)
  13. $monitor用法
  14. Matlab与V-REP联合仿真 | Joint simulation of MATLAB and V-REP
  15. el-date-picker 日期过滤周末节假日
  16. 厦门计算机中专学校,厦门有哪些中专学校
  17. arduino 感光灯
  18. SpringBoot+阿里云短信服务实现发送短信验证码功能
  19. Jira中文包插件,更专业的中文Jira
  20. 手写汉字数字识别详细过程(构建数据集+CNN神经网络+Tensorflow)

热门文章

  1. SQLite内部机制和新特性
  2. thinkphp5 后台多选删除_TP5(thinkPHP框架)实现后台清除缓存功能示例
  3. mysql 代替分号_php – mysql FIND_IN_SET()用分号代替逗号
  4. 火车票售票系统mysql_2021年元旦火车票今日开售!具体开售时间是几点?
  5. [SOJ #538]好数 [CC]FAVNUM(2019-8-6考试)
  6. 理论篇-数理统计填坑篇
  7. JS中移动端项目取余数和switch于PC端的不同
  8. java调用支付宝接口代码介绍
  9. spring复杂数据类型传递
  10. matlab 启动图标