Cpp9 — map和set

 map和set

STL分为序列式容器(vector、list、deque)和关联式容器(map、set)

序列式容器:数据与数据之间没有很强的联系。(各个数据之间没什么关联)。底层为线性序列的数据结构,里面存储的是元素本身。栈和队列是适配器。

关联式容器:数据和数据之间有很强的关联关系(在数据检索时比序列式容器效率更高。底层是红黑树,再底层是一棵搜索树。)

set

set的本质是Key模型(Key模型就是确认在不在的模型)。典型的set底层是二叉搜索树

Compare是一个仿函数,用来比较。默认给的是less,相当于operator<,我们可以传别的,来控制这里的比较规则、比较方式。

 key_comp/value_comp获取key/value的比较器。  提供它两是为了保持set与map的一个兼容

set支持增删查,不支持修改,因为Key模型的底层是二叉搜索树,其一旦被修改,整个树就有可能错误了,所以是不允许修改的。

set的拷贝构造赋值都是深拷贝,而且是一棵树,消耗比较大。

lower_bound、upper_bound

删除30-60

itlow = lower_bound(30);//返回大于等于30这个的值的位置//如果给35,则是40到60

itup = upper_bound(60);//返回大于60这个的值的位置,这里返回的是70//如果给55,返回的是60的位置,但是因为是左闭右开,所以60并没有被删掉

//10 20 30 40 50 60 70 80 90

set.erase(itlow, itup);//删除30到70所括住的区间[30, 70)

equal_range

x <= val < y(左闭右开)

map 

 map底层存储的结构是pair,pair是一个模板的键值对。map的底层是一棵树

pair的原型大致为

 这是SGI-STL原码中对于键值对的定义

 这里能不能用auto推导?不能,它推不出来

因为其插入时,只看key,val相不相同无所谓,但是map不支持冗余,所以只要key有了,就不支持再插入了。

 其实也不用typedef pair

我们可以用make_pair。前面的都是调用构造。而make_pair是一个函数模板,它的实现方式大致如下,它的优势就是自动推导,不需要我们显式地写模板参数了。make_pair是构造一个匿名pair然后返回

 一般被定义成inline

 有时候有些头文件我们每包含,但是我们仍能使用的原因:

它们被其他头文件包含了。

map的遍历

void test_map1()
{map<string, string> dict;pair <string, string> kv1("hello","你好");dict.insert(kv1);dict.insert(make_pair("sort", "排序"));dict.insert(make_pair("push", "插入"));dict.insert(make_pair("pop","删除"));//dict.insert(make_pair("hello", "hi"));//优势:自动推导类型,不用显式地写模板参数//map的遍历map<string, string>::iterator it = dict.begin();//auto it = dict.begin();while (it != dict.end()){cout << it->first << it->second << endl;//cout << (*it).first <<(*it).second << endl;//pair不支持流插入,它没有重载流插入。//我们用kv键值对++it;}cout << endl;for (const auto& kv : dict)//范围for是依次取数据赋值给kv,其实就是迭代器*it给kv,但是这样拷贝代价太大了,所以尽量把引用加上减少拷贝。{cout << kv.first << ":" << kv.second << endl;}cout << endl;}

map和set的迭代器都是双向迭代器,也就是可以正向和反向遍历。

第三十节00:11:00-00:25:00 将双箭头做特殊处理 只看了一遍,没笔记,代码只写了一点

map中的[]

它去容器里找k对应的元素,然后返回对应的value。如果这个key没有被匹配到,它会插入一个新的元素,这个元素就用这个key,然后返回它的映射类型,如果它没有对应的映射类型,value用它的默认构造(default constructor)

即:

1.map中有这个key,返回value的引用(可用于查找,修改value)

2.map中没有这个key,会插入一个新元素,该元素为pair(key, V()); ,返回value(这里的value就是pair里自动创建的value)的引用(可用于插入,修改)    V()是value类型的匿名对象。这个value是一个缺省值,该value如果是int类型,则其缺省值为0,若为string,则其为"",若为指针,则其为nullptr

[]的底层是这样实现的

 map中的insert

上面的value_type实际上就是pair<K, V> val;

返回的不是true和false,而是pair

 insert一个值,如果已经有这个值了,就不插入,bool就是false。如果没有,那就插入,bool是true

再讲解:

返回一个pair,pair的first被设置为迭代器,这个迭代器指向新插入的元素或者是跟这个key相等的元素,second是bool,如果插入成功,返回true。如果插入失败(即有key与它相等),则返回false。

插入时只看key。

1.key已经在map中,返回pair<key_iterator, false>//返回新插入元素的迭代器或与这个值相等的元素的迭代器;如果与key相等的元素已经存在,返回false(即已存在且相等的话,返回false)

2.key不在map中,返回pair(new_key_iterator, true);

第三十节1:06:30-1:15:00模拟实现[]

insert返回pair就是为[]准备的。

multimap为什么没有[]呢?

因为它允许键值冗余了,例如我们要返回苹果,我们应该返回哪次苹果来时的value呢?multi也不能用之前的代码帮我们统计次数了,因为它可以多次插入一样的值。

multimap也是看key,但是不管key有没有出现过,它都是插入,value相不相同无所谓

两个题:第三十节1:38:40-2:58:00

unordered_map、unordered_set

map/set与unordered系列的区别

1.map和set遍历是有序的,该类为无序

2.unordered系列只有单向迭代器,map和set是双向迭代器

数据越多,unordered系列效率更高,但是它的插入稍微差一点,因为它插入时要扩容,扩容的代价有点大

unordered系列的优点:

在处理大量数据时,其增删查改效率更优,尤其是查找。

当我们遇到这种情况时(一个不能被运算的类型需要运算)。

unordered_map里有一个参数帮助我们解决这种情况。hash<Key>

hash<Key>是一个仿函数,

所以要在这里添加一个Hash的仿函数

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言每日一题:13《数据结构》环形链表。

题目链接&#xff1a; 一.环形链表运动基础。 使用快慢指针利用相对移动的思想&#xff1a; 1.第一种情况&#xff1a; 1,令快指针&#xff08;fast&#xff09;速度为2. 2.慢指针&#xff08;slow&#xff09;速度为1. 3.以慢指针进入环中开始。 4。假设slow刚刚进入环中fast…

如何把pdf转成cad版本?这种转换方法非常简单

将PDF转换成CAD格式的优势在于&#xff0c;CAD格式通常是用于工程设计和绘图的标准格式。这种格式的文件可以在计算机上进行编辑和修改&#xff0c;而不需要纸质副本。此外&#xff0c;CAD文件通常可以与其他CAD软件进行交互&#xff0c;从而使得工程设计和绘图过程更加高效和精…

CSS 滚动条

一、滚动条样式属性 ::-webkit-scrollbar {width: 6px; /* 竖向滚动条宽度 */height: 6px; /* 横向滚动条高度 */ }::-webkit-scrollbar-thumb {border-radius: 10px; /* 滚动条样式 */-webkit-box-shadow: inset 0 0 3px red; /* 内阴影 */background-color: blue; /* 滚动条…

卷积神经网络

目录 注意&#xff1a;有参数计算的才叫层 1.应用 1.1分类和检索 1.2超分辨率重构 1.3医学任务 1.4无人驾驶 1.5人脸识别 2.卷积 2.1卷积神经网络和传统网络的区别 2.2整体框架 2.3理解卷积&#xff08;重点&#xff09; 2.4为何要进行多层卷积 2.5卷积核的参数 2.6…

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 详细建模方案解析及参考文献

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 详细建模方案解析及参考文献 1 题目 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要…

时间复杂度和空间复杂度

目录 一. 时间复杂度 有循环的时间复杂度例子&#xff1a; 1. 求冒泡排序的时间复杂度&#xff1f;O(n^2) 2. 求二分查找的时间复杂度&#xff1f;O(logn) 3. 求斐波那契数的时间复杂度&#xff1f;O(n) ​编辑 递归的时间复杂度例子&#xff1a; 1. 递归求阶乘&#…

Vue2(初识vue)

目录 一&#xff0c;Vue2简介1.1&#xff0c;什么是vue1.2&#xff0c;初始vue1.3&#xff0c;搭建vue环境1.4&#xff0c;第一个hello world 二&#xff0c;基础知识2.1 指令2.2-1 指令v-text2.2-2 指令v-html2.2-3 指令v-if2.2-4 指令v-else2.2-5 指令v-show2.2-6 v-if指令与…

华为数通HCIA-网络参考模型(TCP/IP)

网络通信模式 作用&#xff1a;指导网络设备的通信&#xff1b; OSI七层模型&#xff1a; 7.应用层&#xff1a;由应用层协议&#xff08;http、FTP、Telnet.&#xff09;为应用程序产生对应的数据&#xff1b; 6.表示层&#xff1a;将应用层产生的数据转换成网络设备看得懂…

react ant add/change created_at

1.引入ant的 Table import { Table, Space, Button, message } from antd; 2.获得接口的数据的时候增加上创建时间 const response await axios.get(${Config.BASE_URL}/api/v1/calculation_plans?token${getToken()});if (response.data.message ok) {const data respon…

从感知到理解-融合语言模型的多模态大模型研究

©PaperWeekly 原创 作者 | 张燚钧 单位 | 中国移动云能力中心 研究方向 | 预训练大模型 引言 近年来&#xff0c;大语言模型&#xff08;Large language model, LLM&#xff09;取得了显著进展。以 ChatGPT 为代表的 LLM 在自然语言任务上展现出惊人的智能涌现能力。尽管…

JVM面试题--实践

目录 JVM 调优的参数可以在哪里设置参数值 war包部署在tomcat中设置 jar包部署在启动参数设置 JVM 调优的参数都有哪些&#xff1f; 设置堆空间大小 虚拟机栈的设置 年轻代中Eden区和两个Survivor区的大小比例 年轻代晋升老年代阈值 设置垃圾回收收集器 JVM 调优的工…

微服务实战项目-学成在线-选课学习(支付与学习中心)模块

微服务实战项目-学成在线-选课学习(支付与学习中心)模块 1 模块需求分析 1.1 模块介绍 本模块实现了学生选课、下单支付、学习的整体流程。 网站的课程有免费和收费两种&#xff0c;对于免费课程学生选课后可直接学习&#xff0c;对于收费课程学生需要下单且支付成功方可选…

实验笔记之——Android项目的适配

android有一个很烦人的点就是版本之间差距较大&#xff0c;且不兼容&#xff0c;导致不同版本之间代码兼容很容易出问题&#xff0c;一个常见的例子就是几年前自己开发的app&#xff0c;几年后再用竟然配置不了。。。为此&#xff0c;写下本博客记录一下配置旧项目的过程。 …

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传&#xff0c;后端使用ThinkPHP。 1、前端代码 json&#xff1a;引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml&#xff1a;deletedFile是删除文件函…

SpringBoot项目修改中静态资源,只需刷新页面无需重启项目(附赠—热加载)

初衷 &#x1f4a2;初衷&#x1f4a2; 因为一遍遍修改并重启项目觉得很麻烦&#xff0c;所以刚开始就自己给项目配置了热加载&#xff0c;但奈何代码更新还是慢&#xff0c;还不如我重启一遍项目的速度&#xff0c;所以放弃了自己上网找到的热加载配置。直到我debugger前端代码…

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c;Kubernetes 可以负…

load、unload和pagehide、pageshow

一、load、unload和pagehide、pageshow的主要应用 1&#xff09;load 和 unload 事件监听web页面的进入和离开&#xff0c;一般用于页面的首次加载、刷新和关闭等操作的监听&#xff1b; 2&#xff09;pageshow 和 pagehide 事件多用于监听浏览器的前进和后退等。 二、pagesh…

【雕爷学编程】 MicroPython动手做(38)——控制触摸屏2

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…

SQL 语句中 left join 后用 on 还是 where,区别大了!

目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条&#xff0c;奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数&#xff0c;只会根据and后的条件是否显示 B表的记录&#xff0c;A表的记录一定会显…

RT1052的定时器

文章目录 1 通用定时器1.1 定时器框图1.2 实现周期性中断 2 相关寄存器3 定时器配置3.1 时钟使能3.2 初始化GPT1定时器3.2.1 base3.2.2 initConfig3.2.2.1 clockSorce3.2.2.2 divider3.2.2.3 enablexxxxx 3.3 设置 GPT1 比较值3.3.1 base3.3.2 channel3.3.3 value 3.4 设置 GPT…