set和map结构的使用
个人主页:敲上瘾-CSDN博客
个人专栏:游戏、数据结构、c语言基础、c++学习、算法
目录
一、序列式容器和关联式容器
二、set和multiset
1.insert
2.erase
3.find
4.count
三、map和mapmulti
1.pair
2.insert
3.find
4.operator[ ]
5.erase
6.lower_bound和upper_bound
四、习题
1.环形链表||
1.算法原理
2.代码编写
2.随机链表的复制
编辑
1.算法原理
2.代码编写
一、序列式容器和关联式容器
在正式讲解set和map之前需要先了解这个概念——序列式容器和关联式容器。比如string、vector、list、deque等这些储存结构都是序列式容器。序列式容器的特点是它们的逻辑结构都是线性的,而且数据之间都没有关联性,对一个数据的增删查并不对其他数据造成影响,也不会对这个结构造成影响。
而关联式容器就恰好相反,它的逻辑结构是非线性的,而且数据之间的关联性非常强,对其中一个数据进行改变会对整个数据结构造成影响,比如set,setmulti,map,mapmulti,undered_set,undered_map。
        这一章的主角set和map它们是一种树形结构,它们的底层是红黑树,即⼀颗平衡⼆叉搜索树
 。不过这一章主要是来讲它们的使用,对底层的结构并不做探讨。
二、set和multiset
首先区分一下set和multiset:set中一个值只能出现一次(即同一个key只能在set里面插入一个)。multiset内允许储存多个相同的值。
set的学习网址:set - C++ Reference (cplusplus.com)
1.insert
insert接口主要作用是来插入元素的,它支持直接插入某一个元素,也支持插入某个迭代器区间。
如下:
	set<int> st;st.insert(999);vector<int> arr = { 1,5,3,2 };st.insert(arr.begin(), arr.end());
2.erase

erase支持删除一个值,删除一个迭代器区间或一个迭代器。
如下:
st.erase(7);//删除某个值
st.erase(st.begin());//删除最小值
st.erase(st.begin(), st.end());//删除整个区间注意:对于set迭代器的遍历是中序遍历,所以迭代器遍历结果是有序的。
3.find
find的使用比较简单,传入一个值然后会返回一个该值的迭代器,不存在则返回空,就不再多讲。
4.count

count接口是用来返回set / multiset / map / multimap中某一个数据出现的个数,也可用来查找某个数据是否存在。
三、map和mapmulti
map的学习网址:map - C++ Reference (cplusplus.com)
map和set的区别:set一块区域只储存一个关键字(记为key),而map储存的是一个key和value,key和value是一个映射关系,通过key可以找到对应的vaule。而它们的函数接口的用法都一样就不分开讲。
map和multimap:map中一个键值对(key和value)只能出现一次(即同一个键值对只能在map里面插入一个)。multiset内允许储存多个相同的键值对。
1.pair
pair学习网址:pair - C++ Reference (cplusplus.com)
    pair是一种模板类型,用于存储一对值,其中这两个值可以是不同类型。它位于头文件 utility 中。使用 pair 可以非常方便地存储和操作一对相关联的数据,比如一个键(key)和一个值(value),这在许多算法和数据结构中都非常有用,如哈希表、映射(map)等。
    pair 有两个成员变量,通常称为 first 和 second,分别用来存储这一对值。这两个成员的类型可以不同,但它们都是在 pair 被声明时指定的。
pair有映射和集合的作用,标准库中的 map、multimap、unordered_map 和 unordered_multimap 等容器内部都使用 pair 来存储键值对。
2.insert
因为map在做插入和各种处理时,key和value的关联性很强,而且如果kay和value分散开放的话会使map的迭代器无法获取到key和value的值。所以使用了pair结构,pair的作用相当于把key和value绑定在一起。
所以insert的插入方法有以下几种:
2.1.先创建一个pair变量并储入键值对,然后再利用插入map中。
map<string, string> dict;
pair<string, string> kv1("left", "左");
dict.insert(kv1);2.2.创建匿名pair对象插入map中
map<string, string> dict;
dict.insert(pair<string, string>("left", "左"));2.3.使用make_pair
map<string, string> dict;
dict.insert(make_pair("left", "左"));make_pair这个接口的底层同样用了pair,不过它可以自动识别数据类型,减少了模板类型的填写。
2.4.c++11之后支持pair的隐式构造。
map<string, string> dict;
dict.insert({ "left", "左" });
对于以上的几种插入,insert都会返回pair<interator, bool>,即如果插入失败,返回的就是nullptr和false,如果插入成功或该数据已经存在则返回该位置的迭代器和true。所以insert同时具备插入和查找功能。
注意在做迭代器遍历的时候,pair的first成员是key,second成员是value。
3.find
map的查找呢是传入一个key值,然后对其查找,然后返回对应的迭代器,注意:map不支持对key进行修改,但支持对value进行修改。
4.operator[ ]
这个运算符重载的功能比较全面,它既有查找的功能,也有修改和插入的功能。它需要传入一个key,注意只能是key,因为是要用key去查找。
如果找到则返回这个key对应的value的引用。
如果没找到则插入这个key然后返回对应的value的引用。
所以我们可以完成下面的操作:
map<string, string> dict;
dict["right"];//right不存在完成插入操作
dict["left"]="左边";//left不存在进行插入并且修改
dict["left"] = "左边,剩余的";//left存在完成查找并且修改5.erase
传入一个key,按中序遍历找到key并且删除所有key关键字的键值对。其他性质与set类似。
6.lower_bound和upper_bound
lower_bound 的作用:
    lower_bound 函数用于在一个有序器中查找第一个大于等于给定值的元素。它返回一个迭代器,指向该元素。如果容器中不存在大于等于给定值的元素,则返回指向容器末尾的迭代器。
upper_bound 的作用:
    upper_bound 函数用于在一个有序容器中查找第一个大于给定值的元素。它同样返回一个迭代器,指向该元素。如果容器中不存在大于给定值的元素,则返回指向容器末尾的迭代器。
    lower_bound 和 upper_bound 搭配使用可以确定一个左闭右开的迭代器区间。这个区间由 lower_bound 返回的迭代器(包含)和 upper_bound 返回的迭代器(不包含)界定。
这两个函数对于set、map、vector等等使用方法都是相同的。
四、习题
1.环形链表||

1.算法原理
这个题是链表学习中的一个经典的题目,给一个链表然后判断这个链表是否有环,如果有环返回入环口处的节点,如果没有则返回空。
方法一:快慢指针。该题可以用一个快慢指针同时从链表头开始走,如果快指针走到空节点还未与慢指针相遇,则该链表无环。如果快指针与慢指针相遇,则有环并记录相遇点,找两个速度相同的指针一个从头开始走,一个从相遇点开始走,那么它们相遇时的点就为环的入口点。这个算法比较难以想到,而且一眼难以看出它的正确性需要有严谨的证明。我在以下文章中有详细讲解:链表经典面试题-CSDN博客
方法二:使用一个指针从链表的头走到尾,并且使用一个set容器,每走一步判断set中是否已存入该值,如果没有则存入,如果有那么这个链表一定有环并且该点就是环的入口点,直接返回该值即可。如果指针走到空依旧没有找到set中的重复值则这个链表不带环,返回空。该方法灵活运用了数据结构,而且很容易理解,相比上一个解法直接就是降维打击。
2.代码编写
class Solution {
public:ListNode *detectCycle(ListNode *head) {set<ListNode*> pt;ListNode* cur=head;while(cur){if(pt.count(cur)) return cur;else pt.insert(cur);cur=cur->next;}return nullptr;}
};2.随机链表的复制
1.算法原理
该题是对一个随机链表进行深拷贝,给一个链表要求原模原样拷贝一份,而这个题的难点并不在于拷贝节点本身,而是在于拷贝节点后random指向的节点是什么。尽管我们知道原链表的random指向什么但很难根据旧空间random的指向来判断新空间random的指向。不过因为旧空间与新空间有一个一一映射关系,所以我们可以使用一个map,key储存旧空间的值,value储存新空间的值。这个时候就非常好办只需旧空间的random找到指向的key就能找到新空间random应该指向的value。
2.代码编写
class Solution
{
public:Node* copyRandomList(Node* head){map<Node*,Node*> mp;Node* cur=head;Node* rhead=nullptr,*ret=nullptr,*perv=nullptr;while(cur){Node* ret=new Node(cur->val);if(rhead==nullptr) rhead=ret;else perv->next=ret;mp[cur]=perv=ret;cur=cur->next;}ret=rhead;cur=head;while(ret){ret->random=mp[cur->random];ret=ret->next;cur=cur->next;}return rhead;}
};相关文章:
 
set和map结构的使用
个人主页:敲上瘾-CSDN博客 个人专栏:游戏、数据结构、c语言基础、c学习、算法 目录 一、序列式容器和关联式容器 二、set和multiset 1.insert 2.erase 3.find 4.count 三、map和mapmulti 1.pair 2.insert 3.find 4.operator[ ] 5.erase 6.lo…...
2. qt_c++反射实例
目录 使用场景元对象相关类及宏常用功能获取类相关内容以及委托调用 使用场景 Qt基于强大的元对象系统实现反射机制; 在复杂的开发需求中,我们希望通过一些手段映射出我们的类(映射对象) 然后直接使用,通过࿰…...
 
卷积神经网络(CNN)的计算量和参数怎么准确估计?
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 1. 卷积层(Convolutional Layer) a) 计算量估计: 卷积层的 FLOPs 2 * H_out * W_out * C_in * C_out * K_h * K_w 详细解释: H_out, W_outÿ…...
Ruby基础语法
Ruby 是一种动态、反射和面向对象的编程语言,它以其简洁的语法和强大的功能而受到许多开发者的喜爱。以下是 Ruby 语言的一些基本语法: 1. 打印输出 puts "Hello, Ruby!" 变量赋值 x 10 name "John" 2. 数据类型 Ruby 有多种…...
 
插入排序C++
题目: 样例解释: 【样例解释 #1】 在修改操作之前,假设 H 老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是 3,2,1。 在修改操作之后,假设 H 老师进行了一次插入排序,则原序列的三个…...
 
修改ID不能用关键字作为ID校验器-elementPlus
1、校验器方法 - forbiddenCharValidator const idUpdateFormRef ref(null); const forbiddenCharValidator (rule, value, callback) > {const forbiddenCharacters [as,for,default,in,join,left,inner,right,where,when,case,select];for (let forbiddenCharacter o…...
 
一文详解WebRTC、RTSP、RTMP、SRT
背景 好多开发者,希望对WebRTC、RTSP、RTMP、SRT有个初步的了解,知道什么场景该做怎样的方案选择,本文就四者区别做个大概的介绍。 WebRTC 提到WebRTC,相信好多开发者第一件事想到的就是低延迟,WebRTC(W…...
 
全国职业院校技能大赛(大数据赛项)-平台搭建Zookeeper笔记
ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,为分布式应用提供一致性服务。它的设计目标是简化分布式系统的管理,保证多个节点之间的数据一致性和协调工作。ZooKeeper提供了类似文件系统的层次化命名空间,用来存储和管理元数…...
不同领域神经网络一般选择什么模型作为baseline(基准模型)
在神经网络研究中,选择合适的baseline(基线模型)是评估新方法有效性的重要步骤。基线模型通常是领域内公认的、性能良好的参考模型,用于比较和验证新提出模型的优势。以下是一些在不同任务和领域中常见的基线模型选择:…...
 
华为-IPv6与IPv4网络互通的6to4自动隧道配置实验
IPv4向IPv6的过渡不是一次性的,而是逐步地分层次地。在过渡时期,为了保证IPv4和IPv6能够共存、互通,人们发明了一些IPv4/IPv6的互通技术。 本实验以6to4技术为例,阐述如何配置IPv6过渡技术。 配置参考 R1 # sysname R1 # ipv6# interface GigabitEthernet0/0/1ip address 200…...
【spring中event】事件简单使用
定义事件类 /* * 1. 定义事件类 * 首先,我们创建一个自定义事件 UserRegisteredEvent,用于表示用户注册事件。 * */ public class UserRegisteredEvent extends ApplicationEvent {private final String email;public UserRegisteredEvent(Object sourc…...
 
leetcode每日一题day19(24.9.29)——买票需要的时间
思路:在最开始的情况下每人需要买的票数减一是能保持相对位置不变的, 如果再想减一就有可能 有某些人只买一张票,而离开了队伍, 所有容易想到对于某个人如果比当前的人买的多就按当前的人数量算 因为在一次次减一的情况下…...
 
智源研究院推出全球首个中文大模型辩论平台FlagEval Debate
近日,智源研究院推出全球首个中文大模型辩论平台FlagEval Debate,旨在通过引入模型辩论这一竞争机制对大语言模型能力评估提供新的度量标尺。该平台是智源模型对战评测服务FlagEval大模型角斗场的延展,将有助于甄别大语言模型的能力差异。 F…...
python实用脚本(二):删除xml标签下的指定类别
介绍 在目标检测中,有些时候会遇到标注好的类别不想要了的情况,这时我们可以运行下面的代码来批量删除不需要的类别节省时间。 代码实现: import argparseimport xml.etree.ElementTree as ET import osclasses [thin_smoke]def GetImgNam…...
vue3 父子组件调用
vue3 父子组件调用 父组件调用子组件方法 子组件使用defineExpose将方法抛出 父组件定义 function,子组件通过 defineExpose 暴露方法,父组件通过 ref 获取子组件实例,然后通过 ref 获取子组件方法。 // 父组件 <template><div>…...
 
线性模型到神经网络
🚀 在初始神经网络那一节(链接如下:初始神经网络)的最后,我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k,当我们在想让模型更加准确的时候,是做不到的,因为我们…...
 
【架构】前台、中台、后台
文章目录 前台、中台、后台1. 前台(Frontend)特点:技术栈: 2. 中台(Middleware)特点:技术栈: 3. 后台(Backend)特点:技术栈: 示例场景…...
Stable Diffusion 蒙版:填充、原图、潜空间噪声(潜变量噪声)、潜空间数值零(潜变量数值零)
在Stable Diffusion中,蒙版是一个重要工具,它允许用户对图像的特定部分进行编辑或重绘。关于蒙版蒙住的内容处理选项,包括填充、原图、潜空间噪声(潜变量噪声)、浅空间数值零(潜变量数值零)&…...
ffmpeg录制视频功能
本文目录 1.环境配置2.ffmpeg编解码的主要逻辑:3. 捕获屏幕帧与写入输出文件4. 释放资源 在录制结束时,释放所有分配的资源。5.自定义I/O上下文6.对于ACC编码器注意事项 1.环境配置 下载并安装FFmpeg库 在Windows上 从FFmpeg官方网站下载预编译的FFmpeg…...
 
【LeetCode】每日一题 2024_10_1 最低票价(记忆化搜索/DP)
前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动! 题目:最低票价 代码与解题思路 今天这道题是经典动态规划,我们定义 dfs(i) 表示从第 1 天到 第 i 天的最小花费,然后使用祖传的:从记忆…...
 
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
 
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
 
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
 
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
 
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
 
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
