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

2024-08-31 08:20

本文主要是介绍C++map容器中operator[ ]的实现原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、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,失败则返回已存在键值对的迭代器和falsepair<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"] = "左边";
}

这篇关于C++map容器中operator[ ]的实现原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构