当前位置: 首页 > news >正文

map和set的使用(一)详解

文章目录

  • 序列式容器和关联式容器
  • map和set的介绍
  • set
    • 构造和迭代器遍历和insert
    • find
    • erase
    • swap
    • clear
    • count
    • lower_bound和upper_bound
    • multiset和set的对比
  • set的二个题目
    • 题目解析
    • 算法原理
    • 代码
    • 介绍一个找差集的算法
    • 同步算法
    • 题目解析
    • 算法原理
    • 代码
  • map
    • 构造
    • 遍历
    • initiaizer_list

序列式容器和关联式容器

  • 序列式容器在逻辑上是线性的,在物理上不一定连续,它们的数据之间没有太大的关联,比如交换两个位置的数,依旧是序列式容器,比如vector,list,deque等
  • 关联式容器在逻辑上是非线性的,两个位置的关系是紧密相关的,比如二叉搜索树,随意交换两个位置就破坏了这棵树的结构

map和set的介绍

map和set底层是红黑树,红黑树是平衡二叉搜索树,平衡二叉搜索树接近完全二叉树的结构,但不是完全二叉树,查找效率提高了,等于logN次,set是key的场景,map是key/value的场景。

set

支持增删查,不支持改,修改会改变树的性质

构造和迭代器遍历和insert

在这里插入图片描述

int main()
{// 降序排序+去重 Greater > set<int, greater<int>> t;// 升序排序+去重 Less <// set<int> t;t.insert(5);t.insert(7);t.insert(2);t.insert(5);// set<int>::iterator it = t.begin();auto it = t.begin();while(it != t.end()){// set不管什么迭代器都不支持修改// 修改会改变其内部结构// 按二叉搜索树的排序,中序,升序排序// *it = 10;cout << *it << " ";++it;}cout << endl;// initializer list 相同的值会插入失败t.insert({ 1,2,9,2,7 });for (auto e : t){cout << e << " ";}cout << endl;// void insert(initializer_list<value_type> ls);set<string> strset = { "sort","insert","add" };// 语法上隐式类型转换生成临时对象,临时对象拷贝构造strset// 编译器直接优化为构造// set<string> strset({ "sort","insert","add" });// 语法上构造for (auto& e : strset){cout << e << " ";}cout << endl;return 0;
}

find

在这里插入图片描述

// 算法库的find O(N)
auto pos = find(t.begin(), t.end(), x);
// set的find O(logN)
auto pos = t.find(x);

erase

在这里插入图片描述

  1. 删除某个位置的迭代器
  2. 删除某个值,返回成功删除数据的个数,删除失败返回0,为了兼容multiset(有数据冗余的set),这里面有多个相同的x
  3. 删除迭代器区间
    迭代器失效:
    1.删除的是根节点或只有一个孩子的节点,父亲节点已经链接其他节点了,去访问删除的节点是野指针,节点已经变了,意义变了
    2.删除的节点是有两个孩子的节点,替代法删除,把替代的节点删除,原来要删的节点的位置的迭代器失效,访问会崩溃,节点已经变了,意义变了
    在这里插入图片描述
int main()
{// 1.删除某个位置的迭代器set<int> t = { 1,2,93,403,43 };for (auto e : t){cout << e << " ";}cout << endl;// 删除最小值 [first,end),升序排序t.erase(t.begin());for (auto e : t){cout << e << " ";}cout << endl;// 2.删除某个值int x;/*cin >> x;int num = t.erase(x);if (num == 0){cout << num << "不存在" << endl;}else{cout << num << "删除成功" << endl;}cout << endl;for (auto e : t){cout << e << " ";}cout << endl;*/// 3.删除一个迭代器区间cin >> x;auto pos = t.find(x);if(pos != t.end()){// 删除这个节点后,该点迭代器失效t.erase(pos);// 不要访问,vs强制检查会崩溃cout << *pos << endl;// 访问Node节点}else{cout << "不存在" << endl;}for (auto e : t){cout << e << " ";}cout << endl;return 0;
}

swap

交换两个树的根节点
在这里插入图片描述

clear

清掉数据不清空间
在这里插入图片描述

count

value_type其实是为multiset准备的
功能:这个值在的话返回1,不在返回0
在这里插入图片描述

cin >> x;
if (t.count(x))
{cout << x << "在" << endl;
}
else
{cout << x << "不在" << endl;
}

lower_bound和upper_bound

lower_bound和upper_bound底层是按照二叉搜索树的逻辑进行查找的,logN
在这里插入图片描述

int main()
{std::set<int> myset;for (int i = 1; i < 10; i++){myset.insert(i * 10);// 10 20 30 40 50 60 70 80 90}for (auto e : myset){cout << e << " ";}cout << endl; 返回 >= 30//auto lowit = myset.lower_bound(30); 返回 > 50//auto upit = myset.upper_bound(50); 30 40 50 // 返回 >= 25auto lowit = myset.lower_bound(25);// 返回 > 55auto upit = myset.upper_bound(55);// 30 40 50 // 删除这段区间的值, 迭代器区间的都是[)myset.erase(lowit, upit);for (auto e : myset){cout << e << " ";}cout << endl;return 0;
}

multiset和set的对比

  • multiset和set都在set头文件下,multiset允许键值冗余,insert/find/count/erase都围绕着支持值冗余有所差异
    在这里插入图片描述
int main()
{// 排序但是不去重multiset<int> t = { 1,2,1,2,342 };auto it = t.begin();while (it != t.end()){cout << *it << " ";++it;}cout << endl; 有多个x的话,find查找的是中序的第一个int x;cin >> x;//auto pos = t.find(x);//while (pos != t.end() && *pos == x)//{//	cout << *pos << " ";//	++pos;//}//cout << endl;//auto pos = t.find(x);//while (pos != t.end() && *pos == x)//{//	pos = t.erase(pos);//	// 删除后返回当前位置的下一个迭代器//}//cout << endl;cout << t.count(x) << endl;t.erase(x);// erase把所有x都删除it = t.begin();while (it != t.end()){cout << *it << " ";++it;}cout << endl;// 返回x的个数cout << t.count(x) << endl;return 0;
}

set的二个题目

题目链接

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码

class Solution 
{
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {// 用set进行去重+排序set<int> s1(nums1.begin(),nums1.end());set<int> s2(nums2.begin(),nums2.end());vector<int> ret;auto it1 = s1.begin();auto it2 = s2.begin();while(it1 != s1.end()&& it2 != s2.end()){if(*it1 == *it2){ret.push_back(*it1);++it1;++it2;}else if(*it1 > *it2){++it2;}else{++it1;}}return ret;}
};

介绍一个找差集的算法

差集:是一个集合有,另一个集合没有的数据(去除两个集合共同有的数据)
在这里插入图片描述

同步算法

在这里插入图片描述

题目解析

题目链接
在这里插入图片描述

算法原理

让节点一个一个地插入set中,如果set中第一次存在一个重复的节点的话,返回这个重复的节点就是循环的开始
在这里插入图片描述

代码

class Solution 
{
public:ListNode *detectCycle(ListNode *head) {set<ListNode*> p;ListNode* cur = head;while(cur){if(p.count(cur))return cur;elsep.insert(cur);cur = cur->next;}return nullptr;}
};

map

map也有map和multimap之分
map支持修改,但是修改的是value的值,迭代器也支持修改value
key->key
T->value
在二叉搜索树那里就是把两个参数分开放
在map这里是把两个参数放在一个pair中,封装了一层
第一个参数是key,第二个参数是value
在这里插入图片描述

构造

在这里插入图片描述

int main()
{// 1.构造对象pair插入dict(有名对象)map<string, string> dict;pair<string, string> kv1("auto", "一");dict.insert(kv1);// 2.匿名对象dict.insert(pair<string, string>("string", "二"));// 3.make_pair模版dict.insert(make_pair("vector", "三"));// 4.C++11dict.insert({ "map","三" });// 插入时只看key,value不相等时不会更新// key相等时插入失败,map是不允许冗余的dict.insert({ "map","三二" });return 0;
}

遍历

结构体指针用->
对象用 .
map不允许冗余,unordered_map允许冗余

map<string, string>::iterator it = dict.begin();
while (it != dict.end())
{// 只支持修改value,不支持修改key// first不支持修改// 底层存的是const first // 这里是const string// it->first += 'x';it->second += 'x';// map不支持*it// cout << *it << " ";// cout << (*it).first << ":" << (*it).second << endl;cout << it->first << ":" << it->second << endl;//cout << it.operator->()->first << ":" << it.operator->()->second << endl;// operator* 返回数据的引用 pair// operator-> 返回数据的指针 pair*++it;
}
cout << endl;

initiaizer_list

都用第一种,不会用第二种的

// 1
map<string, string> dict = { {"left", "左边"}, {"right", "右边"}, {"insert", "插入"},{ "string", "字符串" } };
// 2
pair<string, string> kv1("string", "一");
map<string, string> dict = { kv1, pair<string, string>("一", "二") };

用最外层括号给给initiaizer_list,里面的{}隐式类型转换为pair的两个参数
在这里插入图片描述

相关文章:

map和set的使用(一)详解

文章目录 序列式容器和关联式容器map和set的介绍set构造和迭代器遍历和insertfinderaseswapclearcountlower_bound和upper_boundmultiset和set的对比 set的二个题目题目解析算法原理代码介绍一个找差集的算法同步算法题目解析算法原理代码 map构造遍历initiaizer_list 序列式容…...

ARP 表、MAC 表、路由表、跨网段 ARP

文章目录 一、ARP 表1、PC2、路由器 - AR22203、交换机 - S57004、什么样的设备会有 ARP 表&#xff1f; 二、MAC 表什么样的设备会有 MAC 表&#xff1f; 三、路由表什么样的设备会有路由表&#xff1f; 四、抓取跨网段 ARP 包 所谓 “透明” 就是指不用做任何配置 一、ARP 表…...

37.构造回文字符串问题|Marscode AI刷题

1.题目 问题描述 小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t&#xff0c;并且这个字符串需要满足以下几个条件&#xff1a; t 由小写字母组成&#xff0c;且长度与 s 相同。t 是回文字符串&#xff0c;即从左到右与从右到左读取相同。t 的字典序要小…...

ssm-mybatisPlus学习笔记

注意&#xff01;mybatisPlus只能够进行单表操作&#xff0c;其他的仍需要mybatis 1.快速入门 编写启动类 MapperScan("com.atguigu.mapper") SpringBootApplication public class MainApplication {public static void main(String[] args) {SpringApplication.r…...

【算法学习笔记】35:扩展欧几里得算法求解线性同余方程

线性同余方程问题 线程同余方程问题是指 a x ≡ b ( m o d m ) ax \equiv b~(mod~m) ax≡b (mod m)&#xff0c;给定 a a a、 b b b和 m m m&#xff0c;找到一个整数 x x x使得该方程成立&#xff0c;即使得 a x m o d m b ax~mod~mb ax mod mb&#xff0c;随便返回任何一个…...

线性规划:机器学习中的优化利器

一、线性规划的基本概念 线性规划&#xff08;Linear Programming, LP&#xff09;是运筹学中数学规划的一个重要分支&#xff0c;用于在一组线性不等式的约束条件下&#xff0c;找到线性目标函数的最大值或最小值。其问题可以表述为&#xff1a; 在一组线性约束条件 s.t.&am…...

Ubuntu开发中的问题

1.退出anaconda指令&#xff1a;conda deactivate 2.Linux系列&#xff1a;一打开终端就默认进入conda的base环境&#xff0c;取消方法 在终端输入conda config --show&#xff0c;会显示所有的配置信息,然后利用conda config --set来修改此配置&#xff1a; conda config --se…...

MAC 地址转换为标准大写格式

// ConvertToStandardMac 将 MAC 地址转换为标准格式&#xff0c;确保每个字节都是两位&#xff0c;并且字母是大写的 func ConvertToStandardMac(mac string) (string, error) { // 分割 MAC 地址的每一部分 parts : strings.Split(mac, ":") // 确保每部分是两…...

使用插件SlideVerify实现滑块验证

作者gitee地址&#xff1a;https://gitee.com/monoplasty/vue-monoplasty-slide-verify 使用步骤&#xff1a; 1、安装插件 npm install --save vue-monoplasty-slide-verify 2、在main.js中进行配置 import SlideVerify from vue-monoplasty-slide-verify; Vue.use(SlideV…...

深入探索 Nginx 的高级用法:解锁 Web 服务器的强大潜能

在当下互联网技术飞速发展的浪潮中&#xff0c;Nginx 凭借其轻量级、高性能的特性&#xff0c;在 Web 服务器和反向代理服务器领域脱颖而出&#xff0c;成为众多开发者和运维工程师的得力工具。它不仅能高效处理静态资源&#xff0c;在负载均衡、反向代理等方面也表现出色。然而…...

(01)搭建开发环境

1.安装虚拟机软件 VMware Workstation Pro 17 2.虚拟机安装ubuntu20.4系统 3.安装VMtools工具 4.安装vim编辑器 sudo apt install vim 4.安装SSH服务 选择下载源为&#xff1a;http://mirrors.aliyun.com/ubuntu在线安装&#xff1a;sudo apt-get install openssh-serv…...

Win11桌面右键刷新选项在二级界面的修正方法

win10已经被弃用了&#xff0c;现在的win11在桌面右键时&#xff0c;“刷新”按钮在二级界面。除此以外&#xff0c;在资源管理器中浏览文件的时候&#xff0c;很多其他选项也都被放在了二级界面&#xff0c;非常不方便。接下来介绍一个把右键菜单栏中的所有选项都显示在一级界…...

配电室防静电地板通常用哪种

配电室是指带有低压负荷的室内配电场所&#xff0c;包含变压器、配电柜、开关设备等&#xff0c;主要为低压用户配送电能。为防止设备故障、避免火灾爆炸、保护人员安全等均会安装防静电地板。那么配电室防静电地板通常用哪种&#xff1f; 一、全钢防静电地板 1. 全钢三聚氰胺…...

【重庆市乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移内容测评

标题中的“最新重庆市乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移最新”指的是一个地理信息系统&#xff08;GIS&#xff09;的数据集&#xff0c;特别设计用于ArcGIS软件。这个数据集包含了重庆市所有乡镇的边界信息&#xff0c;以Shapefile&#xff08;.shp…...

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…...

Windows电脑桌面记录日程安排的提醒软件

在快节奏的现代生活中&#xff0c;工作效率成为了衡量个人能力的重要标准之一。然而&#xff0c;日常办公中常常会遇到各种琐事和任务&#xff0c;如果没有合理安排日程&#xff0c;很容易陷入混乱&#xff0c;导致效率低下。因此&#xff0c;做好日程安排对于日常工作至关重要…...

TiDB与Oracle:数据库之争,谁能更胜一筹?

TiDB与Oracle&#xff1a;数据库之争&#xff0c;谁能更胜一筹&#xff1f; 最近有很多朋友在讨论数据库的选择问题&#xff0c;尤其是在面对大数据、分布式系统时。作为两款在企业级数据库中非常受欢迎的产品&#xff0c;TiDB和Oracle常常被拿来对比。TiDB 是一款开源分布式数…...

USART_串口通讯中断案例(HAL库实现)

引言 本次&#xff0c;继续对前面寄存器实现的串口通讯中断案例使用HAL库进行二次实现&#xff0c;因此这里会省略一些重复内容&#xff0c;如果大家不清楚的话请参考下面链接&#xff1a;USART_串口通讯中断案例&#xff08;一&#xff09;&#xff08;寄存器实现&#xff09;…...

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…...

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念&#xff0c;实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 &#xff08;Deferred shading&#xff09;技术。 按照本文代码实现后&#xff0c;可以实现以下…...

AI Agent的“搜索大脑“进化史:从Google API到智能搜索生态的技术变革

AI Agent搜索革命的时代背景 2025年agent速度发展之快似乎正在验证"2025年是agent元年"的说法&#xff0c;而作为agent最主要的应用工具之一(另外一个是coding)&#xff0c;搜索工具也正在呈现快速的发展趋势。Google在2024年12月推出Gemini Deep Research&#xff0…...

Arduino学习-跑马灯

1、效果 2、代码 /**** 2025-5-30 跑马灯的小程序 */ //时间间隔 int intervaltime200; //初始化函数 void setup() {// put your setup code here, to run once://设置第3-第7个引脚为输出模式for(int i3;i<8;i){pinMode(i,OUTPUT);} }//循环执行 void loop() {// put you…...

特别篇-产品经理(三)

一、市场与竞品分析—竞品分析 1. 课后总结 案例框架&#xff1a;通过"小新吃蛋糕"案例展示行业分析方法&#xff0c;包含四个关键步骤&#xff1a; 明确目标行业调研确定竞品分析竞争策略输出结论 1&#xff09;行业背景分析方法 PEST分析法&#xff1a;从四个…...

第四十一天打卡

简单CNN 知识回顾 数据增强 卷积神经网络定义的写法 batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据 特征图&#xff1a;只有卷积操作输出的才叫特征图 调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 →…...

golang 实现基于redis的并行流量控制(计数锁)

在业务开发中&#xff0c;有时需要对某个操作在整个集群中限制并发度&#xff0c;例如限制大模型对话的并行数。基于redis zset实现计数锁&#xff0c;做个笔记。 关键词&#xff1a;并行流量控制、计数锁 package redisutilimport ("context""fmt""…...

嵌入式学习笔记 - keil安装目录下的头文件自动包含问题

Keil MDK/MDK-ARM&#xff08;ARM编译器&#xff09;默认情况下会自动包含其安装目录下的标准头文件路径&#xff08;如CMSIS库、设备头文件等&#xff09;。具体机制如下&#xff1a; ‌默认自动包含‌&#xff1a; 新建工程或使用设备数据库选择芯片型号后&#xff0c;Keil会…...

MySQL 高可用实现方案详解

MySQL 高可用实现方案详解 一、高可用核心概念 高可用性(High Availability)指系统能够持续提供服务的能力,通常用可用性=正常服务时间/(正常服务时间+故障时间)来衡量,99.99%可用性表示年故障时间不超过52.6分钟。 MySQL实现高可用需要解决以下几个关键问题: 故障自动检测…...

WPF中自定义消息弹窗

WPF 自定义消息弹窗开发笔记 一、XAML 布局设计 文件&#xff1a;MessageInfo.xaml <Window x:Class"AutoFeed.UserControls.MessageInfo"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.…...

影响服务器稳定性的因素都有什么?

服务器的稳定性会影响到业务是否能够持续运行&#xff0c;用户在进行访问网站的过程中是否出现页面卡顿的情况&#xff0c;本文就来了解一下都是哪些因素影响着服务器的稳定性。 服务器中的硬件设备是保证服务器稳定运行的基础&#xff0c;企业选择高性能的处理器和大容量且高速…...

把 CURSOR 的工具活动栏改成和 VSCODE 一样的左侧展示

目前使用cursor的时候发现工具栏与vscode的布局不一致&#xff0c;cursor在顶部导致操作起来不方便&#xff0c;如何改成与vscode相同的左侧布局展示。 解决方案 文件→首选项→设置&#xff0c;进入设置中&#xff0c;然后点击这个icon图标&#xff0c;可以打开配置文件 se…...