当前位置: 首页 > news >正文

(二十九)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
  • 三十四:电脑基础知识
  • 三十五:链表
  • 三十六:树
  • 三十七:图
  • 三十八:预处理命令

相关文章:

  • 基于微信的热门景点推荐小程序的设计与实现(论文+源码)_kaic
  • Java设计模式之装饰器模式详细讲解和案例示范
  • Springboot3.x.x使用SpringSecurity6(一文包搞定)
  • 【数据分析预备】Numpy入门
  • 【STM32】GPIO翻转操作实现流水灯
  • C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作
  • 外包服务商靠谱吗?一文教你火眼金睛辨真相
  • Etherpad在线文档协作编辑工具
  • 【IOS兼容】IOS/IE new Date() 返回结果为invalid date
  • 微信支付商家转账到零钱:快速开通攻略及功能全解
  • 探索前沿科技:在本地系统上安装和使用Style TTS2进行高质量语音合成
  • word宏的概念
  • 《Python 面试热门问题五》
  • C++:类型转换
  • Linux之多线程概念
  • ----------
  • php的引用
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES6简单总结(搭配简单的讲解和小案例)
  • Golang-长连接-状态推送
  • isset在php5.6-和php7.0+的一些差异
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • node入门
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue脚手架vue-cli
  • vue学习系列(二)vue-cli
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • #### golang中【堆】的使用及底层 ####
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三)终结任务
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • ***通过什么方式***网吧
  • .Net CF下精确的计时器
  • .NET Framework杂记
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET成年了,然后呢?
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @Async 异步注解使用
  • @Autowired和@Resource的区别
  • [2019红帽杯]Snake