【C++】set和map的使用

news2024/11/26 4:33:05

对于STL容器来说,有很多相似的功能,所以这里主要将与之前不同的功能说清楚

文章目录

    • 1.对于set与set的简单理解
    • 2. set
      • insert
      • 迭代器遍历
      • count
      • multiset
        • insert
        • find
        • count
    • 3. map
        • insert与迭代器的使用
        • 统计水果次数
      • operator []
        • operator[]的实现理解
          • 对整体的拆分理解
          • operator[]的作用
      • multimap

1.对于set与set的简单理解

vector/list/deque 作为序列式容器(类似于线性表的存储方式)
map与set作为关联式容器,里面存储的是<key,value>结构的键值对(数据之间有非常强的关联关系)
键值对:用来表示一 一对应的关系,key代表键值,value代表与key对应的信息
如:中英文互译字典,内部的英文必然有一个中文对应


map与set 底层是二叉搜索树


set作为key模型
map作为 key_value模型
不懂的可以点击了解:二叉搜索树的应用场景

2. set

set的官方文档


compare作为一个仿函数,
默认为升序,在重载operator()时 ,以小于比较
同样若将operator()重载中改为大于比较,则为降序
Alloc作为一个默认的空间配置器

insert

由于底层是二叉搜索树,所以要注意若插入相同的key值,就会造成插入失败

迭代器遍历

set底层是二叉搜索树,所以重复的值在树中插入会失败
相当于完成了去重操作


不能随便修改*it的数据,set底层作为二叉搜索树,若将其中一个key值进行修改,就没办法保证修改后是不是搜索树了


支持迭代器就是支持范围for,范围for底层就是迭代器

count

给一个值,判断在不在
若在返回非0,若不在返回0
但是由于set不支持重复的key值插入,所以count只能判断在不在

count的效果与二叉搜索树的应用场景的写法,效果是等价的
x作为key值,若存在则进入if 输出在,若不在则进入else 输出不在

multiset


与set的区别为 :允许键值冗余

insert


再次使用迭代器遍历时,发现是有重复的值存在的


find

multiset的find函数,若有多个重复的key存在,实际上查找的是中序的第一个


验证查找为中序第一个key

若查找的为中序的第一个1,才可将后面的所有的1都显示出来


count

在multiset中由于有重复key的存在,
所以count函数能够返回该key值出现的个数
若key值没有出现,则返回0

3. map

map的官方文档


map作为 key_value模型
但是map并没有定义key与value,而是存在一个结构pair


pair是库自己定义的结构,用于存放key与value

带有两个模板参数分别是first与second,相当于key与value

insert与迭代器的使用

通过map将key与value都置成string类型,可以通过pair完成插入,但是pair写起来太长容易出错


若使用pair则需要借助匿名对象插入


所以为了减少代码长度,所以使用make_pair

make_pair为一个函数模板,实际上还是调用匿名构造返回

统计水果次数

方法1是在二叉搜索树的应用场景使用的
方法2是operator[]的使用
两种方法的作用是等价的
countmap[e]++: 传入key值e,并返回对应的value值,使value值+1

operator []

给一个key值,返回mapped_type类型


mapped_type代表第二个模板参数value


operator[]的实现理解


insert的返回值
在这里插入图片描述
pair的first是一个迭代器,指向新插入的元素或者指向与key值相等元素位置的迭代器
pair的second是bool类型,bool代表在不在,若插入成功返回true,插入失败返回false,但是会返回之前已经存在并且相同类型的迭代器


对整体的拆分理解

调用insert函数,函数的第二个参数为value类型的缺省值,调用默认构造
返回值是pair<iterator,bool>
pair.first 表示迭代器 ,解引用就为pair数据 ,pair数据取second就为value


operator[]的作用

1.插入
插入key值,若插入成功则返回true
2.修改
若key值已经存在,则返回false,同时也会返回之前已经存在并且相同类型的迭代器 ,使之对value值修改
3.插入+修改
插入key值,若插入成功则返回true,同时将对应的value值修改
4.查找
当key值已经存在时,就会寻找之前已经存在并且类型相同的迭代器


1.插入
插入 left,第二个给缺省值,而string缺省值为空串
2.修改
由于插入的left已经存在,所以插入失败,并寻找之前已经存在的left对应的迭代器
把left迭代器的返回值 value修改为左边
3.插入+修改
插入right,第二个缺省值为空串,并把返回值 value修改为右边
4.查找
直接返回对应的value值即可

multimap

与map的区别:允许键值冗余


在这里插入图片描述


但是multimap并没有operator[]
因为在map中,key和value是一对一的关系
在multimap中,key和value是一对多的关系
所以 没办法判断当前key值对应哪一个value

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

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

相关文章

Nginx:常见的面试题和答案

1. 什么是Nginx&#xff1f; 答&#xff1a;Nginx是一款高性能的Web服务器和反向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议&#xff0c;同时用于处理高并发的请求&#xff0c;提供快速、可靠的服务。 2. Nginx的优点是什么&#xff1f; Nginx的优点包括&#xff1a…

【BeautifulSoup上】——05全栈开发——如桃花来

目录索引 介绍&#xff1a;解析库&#xff1a; 安装&#xff1a;pip install BeautifulSoup4pip install lxml 标签选择器&#xff1a;1.string属性&#xff1a;.name属性&#xff1a;获取标签中的属性值&#xff1a; 实用——标准选择器&#xff1a;使用find_all()根据标签名查…

五、C++内存管理机制 —— primitives(侯捷)

侯捷 C八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C 面向对象高级开发 1、C面向对象高级编程(上) 2、C面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C 设计模式 四、C 新标准 五、C 内存管…

2023-04-29 动态规划介绍

2023-04-29 动态规划介绍 动态规划是运筹学课程的一部分 多阶段决策问题 有一类活动的过程&#xff0c;可以分成若干个互相联系的阶段&#xff0c;在它的每一阶段都需要作出决策&#xff0c;从而使整个过程达到最好的活动效果 当然&#xff0c;每个阶段的决策的选取不是任意确…

dc-6靶机

1.使用nmap进行信息搜集&#xff0c;存活主机&#xff0c;端口 192.168.85.184是存活主机&#xff0c;发现开放22&#xff0c;80端口 2.访问192.168.85.184的80端口 发现被重定向了&#xff0c;修改hosts文件 vim /etc/hosts 添加一行 192.168.85.174 wordy3.对网站进行信息搜…

彻底解决 Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0 解决方法

当我遇到这错误的时候,我去网上也找过对应解决方法,出现这个的原因有很多种情况 大多是解决Linux系统里的 我是windows系统里的MySQL服务出问题了,所有那些方法对我来说毫无意义. 好了,说一下我的解决办法,其实也很简单 只需要卸载mysql服务,注册表也要删干净,也要把环境变…

C的文件操作

&#x1f416;前言 &#x1f415;1.为什们我们要用文件 在我们之前写程序时&#xff0c;如果使用scanf函数用键盘输入数据&#xff0c;这些东西都放到内存当中&#xff0c;一旦退出程序&#xff0c;那么这些数据就会消失&#xff0c;比如就像我们写的通讯录&#xff0c;不管是…

Shiro相关知识

1、Shiro功能概述 Apache Shiro是一个功能强大且易于使用的 Java 安全框架&#xff0c;可执行身份验证、授权、加密和会话管理。 主要功能&#xff1a; Authentication&#xff1a;身份认证。登录时验证身份信息。 Authorization&#xff1a;授权操作。访问控制的过程&…

CSS布局基础(标签类型,盒子模型)

布局基础 元素显示类型&#xff0c;盒子模型 标签类型块元素常见块元素 行内元素常见行内元素 行内块元素常见行内块 模式转换显示类型显著区别 盒子模型盒子组成布局描述边框圆角 内边距外边距块元素居中盒子内行内&#xff08;块&#xff09;元素居中 外边距使用陷阱两盒子外…

【进阶C语言】动态版通讯录的实现(详细讲解+全部码源)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于C语言进阶系列&#xff0c;本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数…

Linux基础IO【重定向及缓冲区理解】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、文件描述符1.1、先描述&#xff0c;再组织1.2、files_struct1.3、分配规则…

Java数组的学习(基础)

目录 第一章&#xff1a;数组的概念介绍 1.数组的概念 2.数组的初始化/数组的创建/数组的定义 第二章&#xff1a;数组的使用 数组添加元素的方法/数组的赋值 数组的遍历 数组之选择排序的升序 数组之冒泡排序的升序 数组的最小值 数组的反转 数组中常见的异常 第三…

Python程序员想要转行,可以从这几个方面着手

最近有很多朋友问我一个问题&#xff0c;不论是我们做程序员还是做产品经理或者其他行业&#xff0c;到了30岁或35岁之后&#xff0c;都会面临各种各样的问题&#xff0c;比如达到职业天花板。有没有一种方法能够解决这种问题呢&#xff1f;我想分享一下我的观点和身边的案例。…

《Netty》从零开始学netty源码(四十七)之PooledByteBuf的方法

setBytes() 从channel中读取数据并写到PooledByteBuf中&#xff0c;分配缓存的过程与getBytes一样&#xff0c;只是duplicate为false。 capacity() 动态更新容量&#xff0c;根据新传入的容量值更改length。 如果新容量值与旧值相同则无需扩容如果为非池化内存则根据新容量值…

Zabbix部署详解

文章目录 Zabbix安装部署一、zabbix-server端部署二、zabbix-agent端部署 Zabbix安装部署 环境准备 VMware Workstation Pro 15.0 版本 系统 Centos7 内存 4G 处理器 2G 硬盘 50G 网络适配器 NAT 两台服务器&#xff0c;一台做zabbix-server、一台做zabbix-agent 关闭防火墙、…

【华为OD机试真题】信号发射和接收(javaC++python)100%通过率 超详细代码注释

信号发射和接收 知识点数组栈 单调栈时间限制: 1s 空间限制: 256MB 限定语言:不限 题目描述: 有一个二维的天线矩阵,每根天线可以向其他天线发射信号也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向发…

unity-VRTK-simulator开发学习日记2(抛物线 导包|使用|调用方法)

导包 使用抛物线 1.层级目录下添加抛物线曲线 2.将跟踪控制器 给到抛物线的“跟随资源” &#xff08;选择哪只手射出射线&#xff09; 3.激活按键 找到模拟手柄按键 找到simulator的交互的几个按键&#xff08;ButtonOne为例&#xff09; value&#xff0c;默认值为false&a…

Doris(20):Doris的函数—数学函数

1 查看函数名 show builtin functions in test_db; 2 abs(double a) 功能: 返回参数的绝对值 返回类型:double类型 使用说明:使用该函数需要确保函数的返回值是整数。 3 acos(double a) 功能: 返回参数的反余弦值 返回类型:double类型 MySQL 中反余弦函数 ACOS(…

【五一创作】使用Scala二次开发Spark3.3.0实现对MySQL的upsert操作

使用Scala二次开发Spark实现对MySQL的upsert操作 背景 在我们的数仓升级项目中&#xff0c;遇到了这样的场景&#xff1a;古人开发的任务是使用DataStage运算后&#xff0c;按照主键【或者多个字段拼接的唯一键】来做insert then update&#xff0c;顾名思义&#xff0c;也就…

能上网的ChatGPT,会带来什么改变

最近关注AI的人&#xff0c;应该会注意到这条新闻。 ChatGPT官方推出新模式—Default&#xff08;GPT-3.5&#xff09;with browsing 这个是之前ChatGPT没有的功能&#xff0c;ChatGPT以前的训练数据是在2021年左右&#xff0c;并不知道最近的新闻。 现在ChatGPT 能够联网以…