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

【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

set和map基础:【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客

前言:

在上篇的学习中,我们已经学习了如何使用C语言来实现二叉搜索树,在C++中,我们是有现成的封装好的类模板来实现二叉搜索树的——set和map,这也是我们今天要讲的重点

目录

一、容器

二、set和multiset

一、set与multiset概述

二、set与multiset的基本操作

三、高级特性

四、set与multiset的选择

三、map和multimap

1. map与multimap的区别

2. map与multimap的使用场景

3. 基本操作

4. 注意事项

5. 示例代码

四、总结


一、容器

在前面,我们经常提到容器这个东西,比如stack、queue等许多类模板都称之为容器,其实今天要讲的set和map也是容器的一种,容器这个东西我会在下一章进行单独讲解,有兴趣的可以关注一下

二、set和multiset

在C++标准模板库(STL)中,setmultiset是两种关联容器,它们在处理有序集合数据时非常有用。

一、set与multiset概述

set 是一种关联容器,它存储唯一(不重复)的元素,并且这些元素会根据特定的排序规则自动排序。set内部通常采用红黑树实现,保证了元素的对数时间复杂度的插入、删除和查找操作。

multiset 与set类似,但它允许存储重复的元素。multiset同样基于红黑树实现,其操作的时间复杂度特性与set相同。

二、set与multiset的基本操作

在使用set或multiset之前,需要包含相应的头文件:

#include <set>
#include <multiset>

以下是一些基本操作:

  1. 构造函数
set<T> s; // 默认构造函数
multiset<T> ms; // 默认构造函数
// 可以通过比较函数和分配器进行自定义构造
  1. 插入元素
s.insert(key); // set插入元素
ms.insert(key); // multiset插入元素
  • insert 方法用于向set或multiset中添加元素,如果插入成功,set 的insert方法返回pair<iterator, bool>(这个东西后面会讲),其中bool指示是否插入成功。
  • multiset 的insert方法返回指向插入元素的迭代器。
  1. 删除元素
s.erase(key); // 删除特定元素(set)
ms.erase(key); // 删除特定元素(multiset)
// 删除操作在multiset中会删除所有匹配的元素
  1. 查找元素
auto it = s.find(key); // 查找元素(set)
auto it = ms.find(key); // 查找元素(multiset)
// find返回指向元素的迭代器,如果未找到则返回end()
  1. 统计元素个数
s.count(key); // set中元素个数(总是1或0)
ms.count(key); // multiset中元素个数(可能是大于0的整数)
  1. 大小和容量
s.size(); // 返回元素数量
ms.size(); // 返回元素数量
s.empty(); // 判断是否为空
ms.empty(); // 判断是否为空

三、高级特性

  1. 迭代器

set和multiset都提供迭代器,支持前向和后向遍历。

for (auto it = s.begin(); it != s.end(); ++it) {// 遍历set中的元素
}
  1. 排序规则

默认情况下,set和multiset使用小于操作符<进行排序,但可以通过自定义比较函数来改变排序规则。

struct CustomCompare {bool operator()(const T& a, const T& b) const {// 自定义比较逻辑}
};
set<T, CustomCompare> s; // 使用自定义比较函数
multiset<T, CustomCompare> ms; // 使用自定义比较函数
  1. 性能考虑

由于set和multiset基于二叉搜索树实现,它们的插入、删除和查找操作通常具有O(log n)的时间复杂度。

四、set与multiset的选择

选择使用set还是multiset取决于是否需要存储重复元素。如果需要存储唯一的元素集合,则应该使用set。如果允许集合中存在重复元素,那么应该选择multiset。

三、map和multimap

在C++的STL(标准模板库)中,mapmultimap是两种关联容器,它们用于存储键值对。这些容器使用红黑树作为底层数据结构,以确保高效的插入、查找和删除操作。

1. mapmultimap的区别

  • 唯一性map存储的是唯一键值对,即每个键只能对应一个值。而multimap允许相同的键对应多个值,提供了一种更灵活的数据存储方式。
  • 排序:两者都按照键的自然顺序进行排序,通常为升序。可以通过自定义比较函数来改变排序规则。

2. mapmultimap的使用场景

  • map通常用于需要确保键的唯一性且需要对键进行排序的场景。例如,统计不同类别的数据数量、实现字典等。
  • multimap则适用于需要处理多个值与相同键关联的场景,如记录用户在不同时间段的登录记录。

3. 基本操作

下面这些操作与上面set和multiset的操作基本一致,就不再写了

  • 构造与初始化:可以通过构造函数直接初始化mapmultimap,也可以使用std::make_mapstd::make_multimap辅助函数。自定义排序可以通过传递比较函数来实现。
  • 插入与删除:使用insert方法插入键值对,erase方法删除键值对。erase方法还可以用于删除指定范围内的元素。
  • 查找find方法用于查找键值对,返回指向匹配元素的迭代器;lower_boundupper_bound方法用于查找键的范围,适用于处理多个相同键的值。

4. 注意事项

  • 迭代器的失效:删除元素后,所有指向被删除元素的迭代器都会失效。在迭代时,需要确保迭代器的有效性。
  • 键的类型:键的类型必须支持比较操作,通常需要有定义的比较运算符或提供一个比较函数。
  • 性能:插入、查找和删除操作的时间复杂度为O(log n),基于红黑树的高效性。
  • 值类型:值的类型可以是任何类型,但通常选择有意义的数据类型,如整型、浮点型或字符串等。

5. 示例代码

#include <iostream>
#include <map>
#include <string>
using namespace std;int main() {// 使用map存储唯一键值对map<string, int> fruitCounts = {{"apple", 10},{"banana", 15},{"cherry", 5}};// 使用multimap存储多个值与相同键关联multimap<string, int> logins = {{"Alice", 1001},{"Bob", 2001},{"Alice", 1003}};// 查找和打印map中的元素auto it = fruitCounts.find("banana");if (it != fruitCounts.end()) {cout << "Found banana: " << it->second << endl;}// 查找和打印multimap中的元素auto range = logins.equal_range("Alice");for (auto it = range.first; it != range.second; ++it) {cout << "Login for Alice: " << it->second << endl;}return 0;
}

运行结果:

四、总结

以上就是C++中set和map的全部内容,其实底层逻辑就是二叉搜索树或者准确来说叫红黑树,其中有一些小的知识点会在下一节再提一下

感谢各位大佬观看,创作不易,还请各位大佬点赞支持一下!!!

相关文章:

【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

set和map基础&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 前言&#xff1a; 在上篇的学习中&#xff0c;我们已经学习了如何使用C语言来实现二叉搜索树&#xff0c;在C中&#xff0c;我们是有现成的封装好的类模板来实现二叉搜索树…...

sqlmap确定目标/实操

安装kali&#xff0c;kali自带sqlmap&#xff0c;在window系统中跟linux系统操作有区别 sqlmap是一款自动化SQL工具&#xff0c;打开kali终端&#xff0c;输入sqlmap&#xff0c;出现以下界面&#xff0c;就说明sqlmap可用。 sqlmap确定目标 一、sqlmap直连数据库 1、直连数据库…...

Java笔试|面试 —— 对多态性的理解

谈谈对多态性的理解&#xff1a; 一个事物的多种形态&#xff08;编译和运行时状态不一致性&#xff09; 实现机制&#xff1a;通过继承、重写和向上转型&#xff08;Object obj new 子类()&#xff09;来实现。 1.广义上的理解 子类对象的多态性&#xff0c;方法的重写&am…...

从RL的专业角度解惑 instruct GPT的目标函数

作为早期chatGPT背后的核心技术&#xff0c;instruct GPT一直被业界奉为里程碑式的著作。但是这篇论文关于RL的部分确写的非常模糊&#xff0c;几乎一笔带过。当我们去仔细审查它的目标函数的时候&#xff0c;心中不免有诸多困惑。特别是作者提到用PPO来做强化学习&#xff0c;…...

location匹配的优先级和重定向

nginx的重定向&#xff08;rewrite&#xff09; location 匹配 location匹配的就是后面的uri /wordpress 192.168.233.10/wordpress location匹配的分类和优先级 1.精确匹配 location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配 ^-前缀级别&#xff…...

观察矩阵(View Matrix)、投影矩阵(Projection Matrix)、视口矩阵(Window Matrix)及VPM矩阵及它们之间的关系

V表示摄像机的观察矩阵&#xff08;View Matrix&#xff09;&#xff0c;它的作用是把对象从世界坐标系变换到摄像机坐标系。因此&#xff0c;对于世界坐标系下的坐标值worldCoord(x0, y0, z0)&#xff0c;如果希望使用观察矩阵VM将其变换为摄像机坐标系下的坐标值localCoord(x…...

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一&#xff0c;使用逆向工程步骤梳理1&#xff0c;修改逆向工程的application.yml配置2&#xff0c;修改逆向工程的generator.properties配置3&#xff0c;以Debug模式启动逆向工程4&#xff0c;使用逆向工程生成代码5&#xff0c;整合生成的代码到对应的模块中 二&am…...

时序预测 | Matlab实现TCN-Transformer的时间序列预测

时序预测 | Matlab实现TCN-Transformer的时间序列预测 目录 时序预测 | Matlab实现TCN-Transformer的时间序列预测效果一览基本介绍程序设计 效果一览 基本介绍 基于TCN-Transformer模型的时间序列预测&#xff0c;可以用于做光伏发电功率预测&#xff0c;风速预测&#xff0c;…...

没想到MySQL 9.0这么拉胯

MySQL 7月1号发布了9.0版本&#xff0c;然而没想到并没有引起大家的狂欢&#xff0c;反而是来自DBA圈子的一篇吐槽&#xff0c;尤其是PG界吐槽更厉害。 难道MySQL现在真的这么拉胯了&#xff1f;本着好奇的态度&#xff0c;我也去下载了MySQL9.0的手册看了一下。确实有点让我大…...

开源 Wiki 系统 InfoSphere 2024.01.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…...

1.Introduction to Spring Web MVC framework

Web MVC framework 文档&#xff1a;22. Web MVC framework (spring.io) 概述 Web MVC框架&#xff08;Web Model-View-Controller Framework&#xff09;是一种用于构建Web应用程序的软件架构模式。MVC模式将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&am…...

Onnx 1-深度学习-概述1

Onnx 1-深度学习-概述1 一: Onnx 概念1> Onnx 介绍2> Onnx 的作用3> Onnx 应用场景4> Onnx 文件格式1. Protobuf 特点2. onnx.proto3协议3> Onnx 模型基本操作二:Onnx API1> 算子详解2> Onnx 算子介绍三: Onnx 模型1> Onnx 函数功能1. np.random.rand…...

网络基础——udp协议

UDP协议&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是OSI&#xff08;Open System Interconnection&#xff0c;开放式系统互联&#xff09;参考模型中一种无连接的传输层协议&#xff0c;它提供了一种简单的、不可靠的数据传输服务。以下是关于…...

分布式锁理解

介绍分布式锁&#xff0c;我觉得从项目的背景入手把 在伙伴匹配系统中&#xff0c;我创建了一个定时任务&#xff0c;做为缓存预热的手段 这个具体原因在Redis-CSDN博客 接下来切入正题&#xff1a; 想象每个服务器都有一个定时任务&#xff0c;都要对数据库或者缓存进行操…...

Android Gradle 开发与应用 (十): Gradle 脚本最佳实践

目录 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 迁移到Kotlin DSL 1.3 优势分析 2. 优化依赖管理 2.1 使用依赖版本管理文件 2.2 使用依赖分组 3. 合理使用Gradle插件 3.1 官方插件和自定义插件 3.2 插件管理的最佳实践 4. 任务配置优化 4.1 使用…...

c#获取本机的MAC地址(附源码)

在前一次的项目中&#xff0c;突然用到了这个获取本机的MAC地址&#xff0c;然后就研究了一下&#xff0c;记录下来&#xff0c;防止以后再用到&#xff0c; 使用winfrom做的&#xff0c;界面一个button&#xff0c;一个textBox,点了button以后给textBox赋值显示mac地址 附上源…...

sqlmap使用之-post注入、head注入(ua、cookie、referer)

1、post注入 1.1、方法一&#xff0c;通过保存数据包文件进行注入 bp抓包获取post数据 将数据保存到post.txt文件 加上-r指定数据文件 1.2、方法二、通过URL注入 D:\Python3.8.6\SQLmap>python sqlmap.py -u "http://localhost/login.php" --data "userna…...

XSS: 原理 反射型实例[入门]

原理 服务器未对用户输入进行严格校验&#xff0c;使攻击者将恶意的js代码&#xff0c;拼接到前端代码中&#xff0c;从而实现恶意利用 XSS攻击危害 窃取用户Cookie和其他敏感信息&#xff0c;进行会话劫持或身份冒充后台增删改文章进行XSS钓鱼攻击利用XSS漏洞进行网页代码的…...

Idea新增Module报错:sdk ‘1.8‘ type ‘JavaSDK‘ is not registered in ProjectJdkTable

文章目录 一&#xff0c;创建Module报错二&#xff0c;原因分析三&#xff0c;解决方案1&#xff0c;点击上图的加号&#xff0c;把JDK8添加进来即可2&#xff0c;点击左侧[Project]&#xff0c;直接设置SDK为JDK8 四&#xff0c;配置检查与验证 一&#xff0c;创建Module报错 …...

基于RHCE基础搭建简单服务

目录 项目标题与需求一 配置IP地址server机node02机 二 配置web服务三 搭建dns服务器四 开启防火墙server firewalld 五 配置nfs服务器node02 nfsserver autofs 六 开启SELinux七 验证是否能访问www.rhce.com 项目标题与需求 项目标题&#xff1a; 项目需求&#xff1a; 现有…...

威纶通触摸屏软件离线仿真时出现报错8000端口占用或服务器断线

现象 威纶通触摸屏软件离线仿真时出现报错 显示8000端口被占用 或者是设备服务器断线的状态 处理方法 系统参数——HMI属性 端口号更改一下即可 或者关闭占用8000端口的应用 分享创作不易&#xff0c;请多多支持&#xff0c;点赞、收藏、关注&#xff01; Ending~...

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换&#xff0c;是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同&#xff0c;如果相同则将其更新为新值。CAS操作是原子的&#xff0c;这意味…...

【笔记】虚拟机中的主从数据库连接实体数据库成功后的从数据库不同步问题解决方法2

错误&#xff1a; Last_Errno: 1008 Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction ANONYMOUS at source log mysql-bin.000014, end_log_pos 200275. See error lo…...

【每日一练】python类和对象现实举例详细讲解

""" 本节课程目的&#xff1a; 1.掌握类描述现实世界实物思想 2.掌握类和对象的关系 3.理解什么事面向对象 """ #比如设计一个闹钟&#xff0c;在这里就新建一个类 class Clock:idNone #闹钟的序列号&#xff0c;也就是类的属性priceNone #闹…...

【学习css1】flex布局-页面footer部分保持在网页底部

中间内容高度不够屏幕高度撑不开的页面时候&#xff0c;页面footer部分都能保持在网页页脚&#xff08;最底部&#xff09;的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…...

Java中创建线程的几种方式

底层都是基于实现Runnable接口 1.继承thread类&#xff0c;new一个thread对象&#xff0c;实现run方法&#xff0c;无返回值 public class MyThread extends Thread {Overridepublic void run() {System.out.println("Thread created by extending Thread class is runn…...

[A-04] ARMv8/ARMv9-Cache的相关策略

ver0.2 前言 前面我们已经通过三篇文章反反复复的讲Cache的概念、结构、架构&#xff0c;相信大家对Cache已经大概有了初步的了解。这里简单归纳一下: (1) Cache从硬件视角看&#xff0c;是连接PE-Core和主存的一种存储介质&#xff0c;存储的数据是主存中数据的副本&#xf…...

【笔试常见编程题06】最近公共祖先、求最大连续bit数、二进制插入、查找组成一个偶数最接近的两个素数

1. 最近公共祖先 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号&#xff0c;根结点编号为1。现给定a&#xff0c;b为两个结点。设计一个算法&#xff0c;返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。 测试样例&#xff1a; 2&#xff0c;3 返回&a…...

【工具分享】Gophish——网络钓鱼框架

文章目录 Gophish安装方式功能简介 Gophish Gophish 是一个开源的网络钓鱼框架&#xff0c;它被设计用于模拟真实世界的钓鱼攻击&#xff0c;以帮助企业和渗透测试人员测试和评估他们的网络钓鱼风险。Gophish 旨在使行业级的网络钓鱼培训对每个人都是可获取的&#xff0c;它易…...

“职业三大底层逻辑“是啥呢?

大家好&#xff0c;我是有用就扩散。 掌握职业发展的三大底层逻辑以宏观视角看待自己的职业发展道路具备长远规划自己职业路劲的能力通过成就事件呈现自己的工作成绩 一、痛点陈述 不喜欢眼前的工作&#xff1f;眼前的工作琐碎没前途&#xff1f;找不到能力提升的方向时候会…...

广州市住房和城乡建设委员会网站/北京网站推广机构

2015年9月数据库流行榜单最新出炉&#xff01;与上个月相比&#xff0c;最受欢迎的前10名排名不变。第一梯队依旧是三足继续鼎立&#xff1a;Oracle雄霸榜单&#xff0c;MySQL和SQL Server尾随其后。第二梯队仍是MongoDB为排头兵&#xff0c;稳步攀升。建议以前只专注于RDBMS的…...

建筑工程承包网址大全/免费seo关键词优化方案

1、微型计算机系统中的中央处理器通常是指( )A.内存储器和控制器B.内存储器和运算器C.运算器和控制器D.内存储器、控制器和运算器2、存储器可分为哪两类( )A.硬盘和软盘B.ROM和EPROMC.RAM和ROMD.内存储器和外存储器3、最早的计算机的用途是用于( )A.科学计算B.自动控制C.辅助设…...

临潼区做网站的公司/seo查询源码

本文研究全球与中国市场脱盐乳清粉成分的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析脱盐乳清粉成分的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

网站建设费用计入无形资产/seo 论坛

整合sofa插件&#xff0c;接入网关 一、启动服务 作为RPC框架&#xff0c;sofa和dubbo在插件接入上有着一定的相似性。那么我们还是和前面的案例一样&#xff0c;先启动服务&#xff0c;启动服务的顺序是&#xff1a; soul-adminsoul-bootstrapsoul-examples-sofa 不过在启…...

做外贸的人如何上国外网站/西安发布最新通知

原文首发于同名微信公号「Allen5G」&#xff0c;欢迎大家搜索关注&#xff01;C语言的变量属性1.C语言中的变量可以有自己的属性2.在定义变量的时候可以加上“属性”关键字3.“属性”关键字指明变量的特有意义auto关键字1.auto即C语言中局部变量的默认属性2.auto表明将被修饰的…...

深圳二维码网站建设/杭州优化公司哪家好

使用torchvision中的transforms 一、数据预处理&#xff0c;在dataset中进行处理&#xff0c;使用提供的包 img_transform transforms.Compose([transforms.Resize(100), # 将图像的短边resize到100transforms.RandomHorizontalFlip(), # 随机翻转transforms.RandomCrop(1…...