《算法笔记》学习笔记

map 常见用法详解

**map翻译为映射,也是常用的STL容器 **

map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)

1. map 的定义

//单独定义一个map
map<typename1, typename2> mp;
//map和其他的STL容器在定义上有点不同
//因为 map 需要确定映射前类型(键key)和映射后类型(值value)
//其中第一个是键的类型,第二个是值的类型 //字符串到整型的映射
//必须使用string而不能用char数组
map<string, int> mp; //map的键和值也可以是STL容器
//将一个 set 容器映射到一个字符串
map<set<int>, string> mp;

2. map 容器内元素访问

//map 一般有两种访问方式:通过下标或迭代器访问

(1) 通过下标访问

//和访问普通的数组是一样的
//注意:map中的键是唯一的
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['c'] = 20;
mp['c'] = 30; //20被覆盖
printf("%d\n", mp['c']);
return 0;
}

(2) 通过迭代器访问

//map 迭代器的定义和其他STL容器迭代器定义的方式相同
map<typename1, typename2>::iterator it;
//typename1和typename2就是定义map填写时的类型
//map的每一对映射都有两个typename,这决定了必须能通过一个 it 来同时访问键和值。
//map 可以使用 it->first 来访问键, it->second 来访问值。
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['m'] = 20;
mp['r'] = 30;
mp['a'] = 40;
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
}

3. map常用函数实例解析

**(1) find() **

//find(key)返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
map<char, int>::iterator it = mp.find('b');
printf("%c %d\n", it -> first, it -> second);
return 0;
}

(2) erase()

//erase()有两种用法:删除单个元素,删除一个区间内的所有元素
//<1> 删除单个元素
//删除单个元素有两种方法:
//mp.erase(it), it为需要删除的元素的迭代器,时间复杂度为O(1)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
map<char, int>::iterator it = mp.find('b');
mp.erase(it); //删除 b 2
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
} //mp.erase(key), key为欲删除的映射的键。时间复杂度为O(logN),N为map内元素的个数
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp.erase('b'); //删除键为b的映射,即 b 2
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
} //<2> 删除一个区间内的所有元素
//mp.erase(first, last), 其中first为需要删除的区间的起始迭代器,
//而last则为需要删除的区间的末尾迭代器的下一个地址,也即为删除左闭右开
//的区间[first, last)。时间复杂度为O(last - first)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp<char, int>::iterator it = mp.find('b'); //令it指向键为b的映射
mp.erase(it. mp.end()); //删除it之后的所有映射,即b 2和c 3
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
}

(3) size()

//size()用来获取map中映射的对数,时间复杂度位O(1)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 10;
mp['b'] = 20;
mp['c'] = 30;
printf("%d\n", mp.size()); //3对映射
return 0;
}

(4) clear()

//clear()用来清空map中的所有元素,复杂度为O(N),其中N为map中元素的个数。
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp.clear(); //清空map
printf("%d\n", mp.size());
return 0;
}

4.map的常见用途

  • 需要建立字符(或字符串)与整数之间映射的题目,使用map可以减少代码量。
  • 判断大整数或者其他类型数据是否存在的题目,可以把map当作bool数组用。
  • 字符串和字符串的映射也有可能会遇到。

STL map 常见用法详解的更多相关文章

  1. C++标准模板库(STL)——map常见用法详解

    map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...

  2. STL pair 常见用法详解

    <算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...

  3. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

  4. STL priority_queue 常见用法详解

    <算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...

  5. STL queue 常见用法详解

    <算法笔记>学习笔记 queue 常见用法详解 queue翻译为队列,在STL中主要则是实现了一个先进先出的容器. 1. queue 的定义 //要使用queue,应先添加头文件#incl ...

  6. STL set 常见用法详解

    <算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...

  7. STL vector常见用法详解

    <算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...

  8. STL string 常见用法详解

    string 常见用法详解 1. string 的定义 //定义string的方式跟基本数据类型相同,只需要在string后跟上变量名即可 string str; //如果要初始化,可以直接给stri ...

  9. C++标准模板库(STL)——queue常见用法详解

    queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...

随机推荐

  1. [Vue] : Vue概述

    什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架. Vue.js 是前端的主流框架之一,和Angular.js.React.js 一起,并成为前端三大主流框 ...

  2. Java中可变参数

    从java5开始出现了可变参数,这是对java方法及数组的拓展! 方法中可以接受的参数不再是固定个数的,而是随着具体需求传递的多少来决定. 定义格式: 返回值类型  方法名(参数类型 ... 形式参数 ...

  3. RSA加密算法c++简单实现

    RSA是一种非对称加密算法,在公开密钥和电子商业中RSA被广泛使用.它是基于一个很简单的数论事实,两个素数相乘很容易,对两素数乘积因式分解很困难.原理就不再阐述了,我谈谈算法的编程实现过程. 一.RS ...

  4. WIN7系统TortoiseSVN右键没有菜单解决办法

    TortoiseSVN右键菜单不显示解决办法,亲测有效.其他操作系统解决办法类似,如有问题,给我留言. 百度经验:jingyan.baidu.com 工具/原料   TortoiseSVN 百度经验: ...

  5. Linux设备驱动程序 之 RCU机制

    读取-复制-更新(read-copy-update,RCU)是一种高级的互斥机制,在正确的条件下,可以获得高的性能: RCU对它保护的数据结构做了一些限定,它针对经常发生读而很少发生写的情况做了优化, ...

  6. LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)

    题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的 ...

  7. Qt串口通信专题教程

    查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...

  8. 微信小程序之状态管理A

    其实这个标题 不是很对 主要是最近小程序项目中 有这么一个状态 所有商品都共用一个商品详情页面  大概就是这样子  为了公司 保险起见,一些展示的内容已经处理 但是无伤大雅 就是这么两个按钮 左侧粉色 ...

  9. ubuntu下如何关闭某个端口?

    1. 开启防火墙 sudo ufw enable 2. 关闭某个端口,如80端口 sudo ufw deny 80 3. 查询当前防火墙状态 sudo ufw status

  10. Spring事务注解分析

    1.使用spring事务注解 2.手写事务注解 1).sql执行器 2).事务注解定义 3).AOP实现事务具体实现(同一个线程中使用同一个连接) 4).应用使用注解前 5).应用使用注解后