(二十九)STL map容器(映射)与STL pair容器(值对)

2024-09-06 00:52

本文主要是介绍(二十九)STL map容器(映射)与STL pair容器(值对),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++中的map容器是什么?可以说这个是python中的字典(dict

T = {'1':5, '3':7, '5':4, '4':9, '2':6} print(T)

学过python的都知道字典的每一项都有一个键(key)和一个值(value),而且键是不能重复的

在C++还有一个特点:可以自排序

那值对pair又是个什么东西呢?一个pair可以存储两个数据,这是他的定义:

template<class _T1, class _T2>
struct pair 
{ ..._T1 first; _T2 second; ...
}

在这里_T1指第一项的类型,_T2指第二项的类型,因此first指第一项的值,second指第二项的值

map中的每一项都有一个值对pair,因此mappair有很大的关系。我们可以说“pair是只有一项的mapmap是有多项的pair

mappair的定义和vectorset一样,需要这两个得导入头文件#include <map>

map<Typ1, Typ2> T; //定义一个map容器T,它的键的类型是Typ1,值的类型是Typ2
pair<Typ1, Typ2> P; //定义一个pair容器P,first的类型是Typ1,second的类型是Typ2

想要制作一个值对,可以使用make_pair()函数

make_pair(first, second) //返回一个第一项为first,第二项为second的值对

这些是map容器中的一些函数:

  1. T.insert(x):x为一个值对,这个代码表示添加一个新项x(如果存在x.first则无事发生)
  2. T.erase(x):如果T中确实存在x这个键,那么删除它,否则无事发生
  3. T.erase(it):如果T中确实存在it这个有效迭代器,那么删除迭代器的内容,否则运行错误
  4. T[x]:返回T中键为x的那一项的值(未存在返回0)
  5. T.find(x):如果存在键x,返回它存在的迭代器,否则返回T.end()(类型map::iterator
  6. T.count(x):如果存在键x,返回1,否则返回0(返回类型size_t
  7. T.size():返回T的大小
  8. T.capacity():返回T占用的大小(T.erase()函数没有真正的删除,只是把它标记成了nullptr,所以这里的删除仍然在占用空间)
  9. T.begin():返回T的首元素迭代器
  10. T.end():返回T的末尾截止元素迭代器

这些是pair容器中的一些函数:

  1. P.first:返回P的第一个元素
  2. P.second:返回P的第二个元素
  3. Pit->first:返回地址为Pit的值对的第一项
  4. Pit->second:返回地址为Pit的值对的第二项

如果需要用迭代器遍历map容器,可以使用类型map<类型1, 类型2>::iterator

for(map<Typ1, Typ2>::iterator it = T.begin(); it != T.end(); it ++)cout << it->first << ':' << it->second << endl; 

因为map的每一项都是pair,所以可以使用迭代器->first来获取某项的键,用迭代器->second来获取某项的值

一样的,map也支持foreach循环

for(auto it: T)cout << it.first << ':' << it.second << endl; 

注意,foreach每项返回的不是迭代器

map容器可以自自定义排序方法,和set容器的方法一样,重载()

struct cmp {bool operator() (int a, int b) const //增加const后可以增加防御性{ return a > b; }
}; 
map<int,int,cmp> T; 

这种使用结构体来包装重载运算的方法叫做伪函数(functor)

如果不想让它排序呢?聪明点,定义一个vector数组

vector<pair<类型前, 类型后>> T; 

只不过用法就变了,例如insert()变身push_back(),访问元素还要依次查询

预览:

  • 二十二:类(class)
  • 二十三:高精度运算
  • 二十四:算法进阶
  • 二十五:递归
  • 二十六:vector容器
  • 二十七:递推
  • 二十八:set容器
  • 二十九:map容器
  • 三十:二分查找(Binary Search, BS
  • 三十一:前缀和与差分
  • 三十二:栈(stack
  • 三十三:队列(queue)和双向队列(deque
  • 三十四:电脑基础知识
  • 三十五:链表
  • 三十六:树
  • 三十七:图
  • 三十八:预处理命令

这篇关于(二十九)STL map容器(映射)与STL pair容器(值对)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140538

相关文章

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径

SpringIOC容器Bean初始化和销毁回调方式

《SpringIOC容器Bean初始化和销毁回调方式》:本文主要介绍SpringIOC容器Bean初始化和销毁回调方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录前言1.@Bean指定初始化和销毁方法2.实现接口3.使用jsR250总结前言Spring Bea

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav