C++ 标准模板库(STL):map
4. map
- map翻译为映射,也是常用的STL容器。
- 在定义数组时,实际上是定义了一个int型到int型的映射,或者int型到double型的映射等。
- hashtable[max_size]不适合数据太大,导致不好设计散列函数和浪费空间。但可以选择map建立映射。
4.1 map的定义
map<typenameKey,typenameValue> mp;
map的值和键也可以是STL容器。
4.2 map容器内元素的访问
通过下标访问
- map的值是唯一的
#include <stdio.h>
#include <map>
using namespace std;
int main(){
map<char, int> mp;
mp['c'] = 20;
mp['c'] = 30;
printf("%d\n", mp['c']);
return 0;
}
通过迭代器访问
map<typenameKey,typenameValue>::iterator it;
- map可以用it->first来访问键,it->second来访问值!
- map会以键从小到大的顺序自动排序。(这是由于map内部是使用红黑树实现的,在建立映射的过程中会自动实现从小大到的排序功能。)
#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;
}
4.3 map常用函数实例解析
find()
find(key)返回键值key的映射的迭代器,时间复杂度为\(O(logN)\)
#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", it->first, it->second);
return 0;
}
erase()
删除单个元素
- 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;
//这种删除方法,需要先根据键值查找到迭代器指针的位置。
auto it = mp.find('b');
mp.erase(it);
for(auto it = mp.begin(); it != mp.end(); it++){
printf("%c %d\n", it->first, it->second);
}
return 0;
}
- mp.erase(key),key为欲删除的映射的键。时间复杂度为\(O(logN)\)
#include <stdio.h>
#include <map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
//总体来说删除特定键值的映射关系的时间复杂度都是O(logN)
mp.erase('b');
for(auto it = mp.begin(); it != mp.end(); it++){
printf("%c %d\n", it->first, it->second);
}
return 0;
}
删除一个区间所有元素
mp.erase(first,last) 左开右闭!
#include <stdio.h>
#include <map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
auto it = mp.find('b');
mp.erase(it, mp.end()); //删除b之后的所有映射
for(auto it = mp.begin(); it != mp.end(); it++){
printf("%c %d\n" ,it->first, it->second);
}
return 0;
}
size()
\(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());
return 0;
}
clear()
\(O(N)\)
#include <stdio.h>
#include <map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp.clear();
printf("%d\n", mp.size());
return 0;
}
4.4 map的常见用途
- 需要建立字符或字符串与整数之间的映射关系的题目,使用map可以减少代码量。
- 判断大整数或其他类型数据是否存在的题目
- 字符串和字符串的映射也可能会遇到。
C++ 标准模板库(STL):map的更多相关文章
- C++标准模板库(STL)——map常见用法详解
map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
随机推荐
- Hbase性能调优(二)
一.HBase关键参数配置指导 如果同时存在读和写的操作,这两种操作的性能会相互影响.如果写入导致的flush和Compaction操作频繁发生,会占用大量的磁盘IO操作,从而影响读取的性能.如果写入 ...
- MongoDB 基础手册(一)
作者:云怀大师兄 博客园:https://www.cnblogs.com/yunhuai/ 公众号:云怀大师兄 与Mysql概念对比 说明 MySQL MongoDB 数据库 DatatBase Da ...
- 【.NET与树莓派】上手前的一些准备工作
.NET Iot 不是什么新鲜事物,百科很强大,故老周在此也不必多介绍.现在的时代和老周当年学 QBasic 的时代不同,那时候拉根电话线上网,下载速度只有可怜的 3.5 kb/s.而且还要去店里买上 ...
- ASP.NET Core 3.1 中间件
参考微软官方文档 : https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1 ...
- FAT32、NTFS、exFAT有什么区别?
文件系统 我们经常会对电脑硬盘.U盘.移动硬盘进行格式化,而在格式化硬盘的时候会弹出文件系统的选项,分别有FAT32.NTFS.exFAT三种格式,那么FAT32.NTFS.exFAT有什么区别? 在 ...
- Hive Query生命周期 —— 钩子(Hook)函数篇
无论你通过哪种方式连接Hive(如Hive Cli.HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析.编译.优化器处理.执行器执行四个方面. 以Hive目前 ...
- mysqlbinlog :unknown variable 'default-character-set=gbk'
mysqlbinlog :unknown variable 'default-character-set=gbk' 解决方法: 在命令行中加入--no-defaults开关,使用mysqlbinlo ...
- 【ORA】ORA-27101快速处理方法
今天朋友的数据库出了问题,报错如下: 这个问题主要是是spfile和pfile文件不一致导致的, 生成一个pfile,完了用pfile启动数据库即可 SQL> create pfile '/ho ...
- leetcode 886. 可能的二分法(DFS,染色,种类并查集)
题目链接 886. 可能的二分法 题意: 给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 ...
- MyBatis初级实战之五:一对一关联查询
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...