C++map容器中operator[ ]的实现原理

news2024/9/23 15:22:45

目录

一、operator[ ]函数介绍

二、insert函数介绍

三、operator[ ]函数实现原理

四、operator[ ]函数功能


一、operator[ ]函数介绍

mapped_type& operator[] (const key_type& k);

在map容器中存储的是一个键值对value_type,其本质是pair<const key_type, mapped_type>,mapped_type是键值对中第一个元素类型,key_type是键值对中第二个元素的类型

operator[ ]并非是像vector容器一样传入下标进行随机访问,而是

我们传入一个k参数:

如果map容器中已经存在k,插入失败,返回已经存在k的键值对的第二个元素的引用

如果map容器中不存在k,就用k和mapped_type类型的默认构造函数构建一个键值对并插入,返回新插入键值对的第二个元素的引用

(mapped_type类型的默认构造函数:如果int类型就调用int的默认构造函数,默认对象值为0;string类型就调用string类型的默认构造函数,默认对象值为空串"")

二、insert函数介绍

想要明白operator[ ]函数的实现原理,必须明白insert函数的使用,因为operator[ ]是调用insert函数实现的

观察单参数insert插入函数,函数原型为

pair<iterator,bool> insert (const value_type& val);

参数类型为const value_type&,即const pair<const key_type, mapped_type>&;

返回值类型为键值对pair<iterator,bool>

插入一个键值对pair<const key_type, mapped_type>:

如果map中已存在键值对的key_type,插入失败,返回pair<已存在的键值对的迭代器, false>

如果map中不存在键值对的key_type,插入成功,返回pair<新插入的键值对的迭代器, true>

三、operator[ ]函数实现原理

mapped_type& operator[] (const key_type& k)
{
    return (*((this->insert(make_pair(k,mapped_type()))).first)).second;
}

operator[ ]函数实现是这样子的,将代码写得简洁明了一些就是下面这样

mapped_type& operator[](const key_type& key)
{
	//利用make_pair函数插入一个键值对
	//成功则返回新键值对的迭代器和true,失败则返回已存在键值对的迭代器和false
	pair<iterator, bool> ret = this->insert(make_pair(key, mapped_type()));
	//取出插入结果返回的迭代器,无论是否成功都会有一个迭代器返回
	iterator it = ret.first;
	//返回该迭代器指向键值对的第二个元素的引用
	return it->second;
}

四、operator[ ]函数功能

根据上面operator[ ]函数介绍以及实现原理介绍,我们可以发现operator[ ]可以有以下四种用法

void test()
{
	map<string, string> s;
	//插入(对于map中不存在的数据,直接插入,返回string默认构造函数的默认值空串)
	s["left"];
	//插入并修改(对于map中不存在的数据,直接插入,返回string默认构造函数的默认值空串,我们可以再进行修改)
	s["right"] = "右边";
	//查找(对于map中存在的数据,返回键值对中第二个元素的引用,我们也可以用于数据查找)
	cout << s["right"] << endl;
	//修改(对于map中存在的数据,返回键值对中第二个元素的引用,我们可以直接修改)
	s["left"] = "左边";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maya python调试(pycharm)

maya里面调试代码一直用的print。遇到复杂点的类就感觉有点束手束脚的&#xff0c;因此整理了一下maya调试的一些方法 1.万能的pdb调试 pdb 有2种用法 1.非侵入式方法 &#xff08;不用额外修改源代码&#xff0c;在命令行下直接运行就能调试&#xff09; 常规用法&#xf…

APP长文本内容编辑器功能实现方案

背景 CSDN APP 中原有编辑器页面为纯H5适配&#xff0c;整体用户交互体验差&#xff0c;如何优化APP端编辑器用户体验是我们团队需要思考的问题。下面我们以iOS为例展开讨论。 一、方案调研 我们分析了几款国内内容发布的APP&#xff0c;如知乎、今日头条、简书&#xff0c;…

有了它 一键掌握Vue新版本!

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/#1 你是否也在为Vue生态中的快速更新而焦头烂额&#xff1f;ue 3.4版本发布&#xff0c;带来模板解析器重写和响应系统重构&#xff0c;提升了性能和开发体验。测试框架如…

《深入理解JAVA虚拟机(第2版)》- 第3章 - 学习笔记

第3章 垃圾收集器与内存分配策略 3.1 概述 垃圾收集器要完成三件事情&#xff1a; 什么样的内存需要回收什么时候回收如何回收 垃圾收集器主要关注的区域是&#xff1a;Java堆和方法区。因为程序计数器、虚拟机栈、本地方法栈是线程私有的&#xff0c;随着线程的结束所使用的…

2d椭圆拟合学习

算法来自论文《 Direct Least Square Fitting of Ellipses》 《NUMERICALLY STABLE DIRECT LEAST SQUARES FITTING OF ELLIPSES》 相关文章 论文阅读&#xff1a;直接拟合椭圆 Direct Least Square Fitting of Ellipseshttps://zhuanlan.zhihu.com/p/645391510Fitting Elli…

rsyslog交叉编译

文章目录 1、依赖库列表2、编译建议3、编译3.1、编译libestr3.2、编译libfastjson3.3、编译zlib3.4、编译libuuid3.5、编译libgpg-error3.6、编译libgcrypt3.7、编译openssl3.8、编译curl3.9、编译rsyslog该文档描述了如何交叉编译rsyslog到arm64嵌入式平台。 1、依赖库列表 li…

UE5开发——射击武器类拾取

整体框架&#xff1a; 拾取武器 要在 Unreal Engine 5 (UE5) 中实现一个按 E 键拾取武器的功能&#xff0c;您可以遵循以下步骤&#xff1a; ### 步骤 1: 创建拾取物品的基础类 1. 在 Content Browser 中创建一个新的 C 类&#xff0c;继承自 AActor 或者 AStaticMeshActor。…

pytorch交叉熵损失函数

nn.CrossEntropyLoss 是 PyTorch 中非常常用的损失函数,特别适用于分类任务。它结合了 nn.LogSoftmax 和 nn.NLLLoss(负对数似然损失)的功能,可以直接处理未经过 softmax 的 logits 输出,计算预测值与真实标签之间的交叉熵损失。 1. 交叉熵损失的原理 交叉熵损失衡量的是…

Visual Studio Code离线汉化

从官网下载Visual Studio Code安装包后&#xff0c; 下载Visual Studio Code&#xff1a;https://code.visualstudio.com/ 若因网络等问题无法在线安装语言包&#xff0c;可以尝试离线安装&#xff1a; 从官网下载语言包&#xff1a; Extensions for Visual Studio family …

线上考试系统部署(thirty-six day)

一、线上考试系统的数据 虚拟化技术部署 1、部署前端服务器 &#xff08;1&#xff09;将资源上传到服务器 scp -r dist/ root192.168.1.11:~ &#xff08;2&#xff09;创建基础容器 在服务器上 systemctl start docker.servicedocker pull centosdocker run -it --name …

基于RAG多层次的多代理架构来处理时序任务

《Agentic Retrieval-Augmented Generation for Time Series Analysis》这篇文章提出了一种新颖的时间序列分析方法&#xff0c;称为Agentic Retrieval-Augmented Generation&#xff08;RAG&#xff09;框架。它通过多层次的多代理架构来处理时间序列任务&#xff0c;其中主代…

【银河麒麟高级服务器操作系统】soft lockup软锁实例详细记录分析及处理建议

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 启nginx服务&#xff0c;但是报了sof…

WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

海外云手机实现海外社媒矩阵营销

如何利用社交媒体平台有效推广和带货&#xff0c;正成为众多企业和创业者关注的焦点。海外云手机解决各种网络和设备问题&#xff0c;成为跨境电商海外社媒矩阵建设的必备工具。 跨境电商的核心在于通过互联网连接不同国家的消费者与商品。社交媒体作为连接消费者与品牌的桥梁&…

vue nginx部署 配置 解决href = ‘/login路由‘ 跳转404问题

示例场景 <a :hrefthis.repDownloadUrl>下载平台</a><a href"/join" target"_blank">入驻平台</a><a href"/index" target"_blank" class"btn_login" style"color:#fff">nginx部署…

Datawhale X 李宏毅苹果书 AI夏令营 Task 2

课程内容 &#xff08;一&#xff09;术语解释 一 . Sigmoid函数与Hard Sigmoid 函数 &#xff08;1&#xff09;Sigmoid函数 Sigmoid函数&#xff0c;也称为逻辑函数&#xff08;Logistic function&#xff09;&#xff0c;是一种在数学、生物学、信息科学、神经网络等领域广…

【原子提交:IDEA实践】

原子提交&#xff1a;IDEA实践 背景先前情况idea实际操作方式一&#xff1a;Squash Commits方式二&#xff1a;Undo Commit 后再 Commit方式三&#xff1a;Resetpush前操作后悔药——回到squash commit之前&#xff1a; 背景 临近发版&#xff0c;某位老哥的个线上MR包含多个b…

YOLOv8环境搭建、创建数据集、训练推理教程(超级详细)

yolov8和yolov10 是一个流派&#xff0c;和yolov5区别还挺大&#xff0c;所以尝试使用yolov8来进行模型训练&#xff0c;下面是详细使用流程&#xff1a; 一、环境搭建 1.1 Anaconda安装 Anaconda是一个强大的开源数据科学平台,它将很多好的工具整合在一起&#xff0c;极大地…

怎么在CSDN上赚钱?

CSDN平台上有多种方式可以赚钱&#xff0c;以下是其中几种常见的&#xff1a; 写作赚钱&#xff1a;CSDN平台鼓励用户积极创作原创技术博客&#xff0c;通过博客的阅读量和转发量来获取广告收益&#xff1b;用户还可以发表付费文章或参与付费专栏&#xff0c;在文章的阅读量和付…

Flask+LayUI开发手记(六):树型表格的增删改查

树型表格的增删改查功能与数据表格的是完全一致&#xff0c;就是调用layui-form表单组件实现数据输入再提交&#xff0c;比较大的区别是树型节点的编辑&#xff0c;都需要有上级节点的输入&#xff0c;而这个上级节点的展示&#xff0c;必须是以树型方式展示出来。当然&#xf…