C++ set替换vector进行优化
文章目录
- demo
- 代码解释:
- 底层原理
- 1. 二叉搜索树基础
- 2. 红黑树的特性
- 3. `std::set` 基于红黑树的实现优势
- 4. 插入操作
- 5. 删除操作
- 6. 查找操作
demo
#include <iostream>
#include <set>int main() {// 创建一个存储整数的std::setstd::set<int> mySet;// 插入元素mySet.insert(300);mySet.insert(1);mySet.insert(2);mySet.insert(3); mySet.insert(3); // 重复元素不会被插入mySet.insert(300); // 重复元素不会被插入mySet.insert(300); // 重复元素不会被插入// 输出集合中的元素std::cout << "Set elements: ";for (auto it = mySet.begin(); it != mySet.end(); ++it){std::cout << *it << " ";}std::cout << std::endl;// 查找元素auto findIt = mySet.find(2);if (findIt != mySet.end()){std::cout << "Element 2 found in the set." << std::endl;} else{std::cout << "Element 2 not found in the set." << std::endl;}// 删除元素mySet.erase(1);std::cout << "Set elements after erasing 1: ";for (auto it = mySet.begin(); it != mySet.end(); ++it){std::cout << *it << " ";}std::cout << std::endl;// 检查集合是否为空if (mySet.empty()) {std::cout << "The set is empty." << std::endl;}else{std::cout << "The set is not empty." << std::endl;}// 获取集合的大小std::cout << "The size of the set is: " << mySet.size() << std::endl;// 清除集合中所有内容mySet.clear();std::cout << "Set elements after clearing: ";for (auto it = mySet.begin(); it != mySet.end(); ++it){std::cout << *it << " ";}std::cout << std::endl;// 再次检查集合是否为空if (mySet.empty()){std::cout << "The set is empty after clearing." << std::endl;} else {std::cout << "The set is not empty after clearing." << std::endl;}return 0;
}
代码解释:
- 创建集合:使用
std::set<int> mySet;
创建一个存储整数的std::set
。 - 插入元素:通过
insert
方法向集合中插入元素,重复元素不会被插入。 - 遍历集合:使用迭代器遍历集合中的元素并输出。
- 查找元素:使用
find
方法查找指定元素,如果找到则返回指向该元素的迭代器,否则返回end()
。 - 删除元素:使用
erase
方法删除指定元素。 - 检查集合是否为空:使用
empty
方法检查集合是否为空。 - 获取集合大小:使用
size
方法获取集合中元素的数量。
底层原理
在C++标准库中,std::set
是一个关联容器,用于存储唯一的元素,并且这些元素会按照一定的顺序排列(默认是升序)。它的底层通常基于红黑树(Red - Black Tree)这种自平衡二叉搜索树(Self - Balancing Binary Search Tree)来实现
1. 二叉搜索树基础
二叉搜索树(Binary Search Tree,BST)是一种二叉树,对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种特性使得在二叉搜索树中进行查找、插入和删除操作的平均时间复杂度为 O ( l o g n ) O(log n) O(logn),其中 n n n 是树中节点的数量。
2. 红黑树的特性
红黑树是一种自平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色(红色或黑色)。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。红黑树必须满足以下五个性质:
- 每个节点要么是红色,要么是黑色。
- 根节点是黑色。
- 每个叶子节点(NIL节点,空节点)是黑色的。
- 如果一个节点是红色的,则它的两个子节点都是黑色的。
- 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
3. std::set
基于红黑树的实现优势
- 有序性:由于红黑树是一种二叉搜索树,插入到
std::set
中的元素会根据元素的键值自动排序。例如,插入整数时会按照从小到大的顺序排列。 - 唯一性:在插入元素时,红黑树会进行比较,如果发现元素已经存在,则不会插入,保证了
std::set
中元素的唯一性。 - 高效的查找、插入和删除操作:红黑树的自平衡特性保证了树的高度始终保持在 O ( l o g n ) O(log n) O(logn) 级别,因此查找、插入和删除操作的时间复杂度都是 O ( l o g n ) O(log n) O(logn)。
4. 插入操作
当向 std::set
中插入一个新元素时,底层的红黑树会执行以下步骤:
- 按照二叉搜索树的规则找到新元素应该插入的位置。
- 将新元素插入到该位置,并将其颜色设置为红色。
- 检查红黑树的性质是否被破坏,如果破坏了则通过一系列的颜色调整和旋转操作来恢复红黑树的性质。
5. 删除操作
当从 std::set
中删除一个元素时,红黑树会执行以下步骤:
- 按照二叉搜索树的规则找到要删除的节点。
- 如果该节点有两个子节点,则用其右子树中的最小节点替换该节点,然后删除右子树中的最小节点。
- 删除节点后,检查红黑树的性质是否被破坏,如果破坏了则通过一系列的颜色调整和旋转操作来恢复红黑树的性质。
6. 查找操作
查找操作相对简单,根据二叉搜索树的特性,从根节点开始比较,如果要查找的元素值小于当前节点的值,则在左子树中继续查找;如果大于当前节点的值,则在右子树中继续查找;如果相等,则找到了该元素。由于红黑树的高度为 O ( l o g n ) O(log n) O(logn),因此查找操作的时间复杂度也是 O ( l o g n ) O(log n) O(logn)。
综上所述,std::set
基于红黑树实现,利用红黑树的特性保证了元素的有序性、唯一性以及高效的查找、插入和删除操作。
相关文章:
C++ set替换vector进行优化
文章目录 demo代码解释: 底层原理1. 二叉搜索树基础2. 红黑树的特性3. std::set 基于红黑树的实现优势4. 插入操作5. 删除操作6. 查找操作 demo #include <iostream> #include <set>int main() {// 创建一个存储整数的std::setstd::set<int> myS…...
Android学习总结之算法篇八(二叉树和数组)
路径总和 import java.util.ArrayList; import java.util.List;// 定义二叉树节点类 class TreeNode {int val;TreeNode left;TreeNode right;// 构造函数,用于初始化节点值TreeNode(int x) {val x;} }public class PathSumProblems {// 路径总和 I:判…...
正点原子IMX6U开发板移植Qt时出现乱码
移植Qt时出现乱码 1、前言2、问题3、总结 1、前言 记录一下正点原子IMX6U开发板移植Qt时出现乱码的解决方法,方便自己日后回顾,也可以给有需要的人提供帮助。 2、问题 用正点原子IMX6U开发板移植Qt时移植Qt后,sd卡里已经存储了Qt的各种库&…...
算法解密:轮转数组问题全解析
算法解密:轮转数组问题全解析 一、引言 在算法的世界里,数组的操作问题常常考验着我们对数据结构和算法技巧的掌握程度。“轮转数组”问题就是其中一个经典且有趣的题目。它看似简单,却蕴含着多种巧妙的解法。通过深入研究这个问题,我们能更好地理解数组的特性,提升算法思…...
正则化和L1/L2范式
1. 背景与引入 历史与位置 正则化(Regularization)是机器学习中控制模型复杂度、提升泛化能力的核心手段之一。 L2范式(Ridge正则化)最早可追溯至20世纪70年代的Tikhonov正则化,用于解决病态线性方程组问题…...
day05_java中常见的运算符
对字面量或者变量进行操作的符号就是运算符。用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。 java中常用的运算符有下面几种 算术运算符 代码示例 public class Demo01Operator {public static void main(String[] args) {int a 3;int b 4;System.o…...
Linux_进程退出与进程等待
一、进程退出 退出场景 正常终止:代码执行完毕且结果符合预期(退出码为 0)。异常终止:运行结果错误(退出码非 0)或进程被信号强制终止。(如 SIGINT 或 SIGSEGV)。 退…...
SSM框架(Spring + Spring MVC + MyBatis)整合配置的详细步骤
以下是 SSM框架(Spring Spring MVC MyBatis)整合配置的详细步骤,适用于 Maven 项目。 (一)、pom.xml中添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"ht…...
B. Zero Array(思维)
Problem - 1201B - Codeforces 思路:每次给任意两个不同下表的数减-1,相当于在这个数组总和S上减2,S为奇数则不可能变为0,S为偶数时,一定存在两个序列组成两个S/2,这样每次都是在两个S/2上各减1,…...
FPGA_Verilog实现QSPI驱动,完成FLASH程序固化
FPGA_Verilog实现QSPI驱动,完成FLASH程序固化 操作提要 使用此操作模式实现远程升级的原因是当前的FLASH的管脚直接与FPGA相连接,SPI总线并未直接与CPU相连接,那么则需要CPU下发升级指令与将要升级的文件给FPGA,然后在FPGA内部产…...
前端取经路——框架修行:React与Vue的双修之路
大家好,我是老十三,一名前端开发工程师。在前端的江湖中,React与Vue如同两大武林门派,各有千秋。今天,我将带你进入这两大框架的奥秘世界,共同探索组件生命周期、状态管理、性能优化等核心难题的解决之道。无论你是哪派弟子,掌握双修之术,才能在前端之路上游刃有余。准…...
【DBMS学习系列】一、DBMS(数据库管理系统)的存储模型
一、前置知识 1.1 什么是OLAP 和 OLTP? On-Line Analytical Processing,简称OLAP(联机分析处理),是一种用于处理大规模数据的技术,它提供了一种灵活的分析和查询方式,能够帮助用户从不同维度来分析和理解业务数据。 On-Line Transaction Processing,简称OLTP(联机事…...
Matlab 镍氢电池模型
1、内容简介 Matlab216-镍氢电池模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
39、.NET GC是什么? 为什么需要GC?
.NET GC是什么? .NET GC(Garbage Collector,垃圾回收器)是.NET运行时(CLR)的核心组件,负责自动管理托管堆(Managed Heap)中的内存分配与释放。其核心工作机制包括&#…...
前端缓存踩坑指南:如何优雅地解决浏览器缓存问题?
浏览器缓存,配置得当,它能让页面飞起来;配置错了,一次小小的上线,就能把你扔进线上 bug 的坑里。你可能遇到过这些情况: 部署上线了,结果用户还在加载旧的 JS;接口数据改了…...
XML语言
XML语言 在开始介绍Mybatis之前,先介绍一下XML语言,XML语言发明最初是用于数据的存储和传输,它是由一个一个的标签嵌套而成 <?xml version"1.0" encoding"UTF-8" ?> <outer> <name>阿伟</name&…...
垃圾回收的三色标记算法
目录 1、介绍 1.1、发展 1.2、基本原理 2、执行过程 2.1、初始标记 (Initial Marking) 2.2、并发标记 (Concurrent Marking) 2.3、重新标记 (Remark) 2.4、垃圾清理阶段 3、并发标记 3.1、浮动垃圾 3.2、漏标 前言 三色标记(Tri-color Marking࿰…...
紫禁城多语言海外投资理财返利源码带前端uniapp纯工程文件
测试环境:Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6,根目录public,伪静态thinkphp,开启ssl证书 语言:中文简体、英文、越南语、马来语、日语、巴西语、印尼语、泰语 前端是uniapp的源码,我已经把nmp给你…...
深入剖析 I/O 复用之 select 机制
深入剖析 I/O 复用之 select 机制 在网络编程中,I/O 复用是一项关键技术,它允许程序同时监控多个文件描述符的状态变化,从而高效地处理多个 I/O 操作。select 作为 I/O 复用的经典实现方式,在众多网络应用中扮演着重要角色。本文…...
Android开发报错解决
Android开发报错解决 组件相关文件相关权限相关代码相关程序报错IDE相关版本对应框架okhttp请求失败 Roomno such table cocos2d 组件相关 使用gravity属性让文字居中是,需把该属性放在text属性上面ScrollView只能容纳一个子视图 文件相关 放在drawble下的图片资源…...
Linux 网络命名空间:从内核资源管理到容器网络隔离
1. 网络命名空间是什么? 网络命名空间(Network Namespace) 是 Linux 内核提供的一种网络资源隔离机制,用于为进程或容器创建完全独立的网络环境。它并非物理或虚拟的网络接口(如网卡、veth pair 等),而是一个虚拟容器,包含以下资源的独立实例: 网络接口(物理或虚拟)…...
VNC windows连接ubuntu桌面
✅ 步骤 1:安装 VNC 服务器 首先,我们需要在 Winux 系统上安装一个 VNC 服务器。这里我们使用 tigervnc 作为例子,它是一个常用的 VNC 服务器软件。 打开终端并更新你的软件包: sudo apt update安装 tigervnc 服务器:…...
Elastic:如何构建由 AI 驱动的数字客户体验策略
作者:来自 Elastic Elastic Platform Team 客户通过多个数字渠道与企业和组织互动 —— 从网站和应用程序到聊天机器人和电子邮件。这些接触点构成了数字客户体验(DCX)。无缝的数字客户体验能显著提升客户满意度,进而带动更高的收…...
安防多协议接入/视频汇聚平台EasyCVR助力工地/工程/建筑施工领域搭建视频远程监控系统
一、摄像机安装方案 1)安装位置选择:摄像机安装需避开强振源与电磁干扰区,兼顾建筑外观,隐蔽安装。其防护罩应巧妙遮蔽视角,增强安防威慑。电梯轿厢内的摄像机,建议藏于吊顶。连接摄像机的视频、电源及…...
《100天精通Python——基础篇 2025 第16天:异常处理与调试机制详解》
目录 一、认识异常1.1 为什么要使用异常处理机制?1.2 语法错误1.3 异常错误1.4 如何解读错误信息 二、异常处理2.1 异常的捕获2.2 Python内置异常2.3 捕获多个异常2.4 raise语句与as子句2.5 使用traceback查看异常2.6 try…except…else语句2.7 try…except…finally语句--捕获…...
Ceph PG unfound/lost 问题排查与解决
Ceph PG unfound/lost 问题排查与解决 背景现象排查过程经验总结参考命令结语 背景 Ceph 集群出现 HEALTH_ERR,提示有 PG 对象丢失(unfound),并且 repair 无法自动修复。 现象 ceph health detail 显示: HEALTH_ERR …...
LeetCode热题100--54.螺旋矩阵--中等
1. 题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:ma…...
【嵌入式开发-CAN】
嵌入式开发-CAN ■ CAN简介 ■ CAN简介...
SQLite3介绍与常用语句汇总
SQLite3简介 SQLite3是一款轻量级的、基于文件的开源关系型数据库引擎,由 D. Richard Hipp 于 2000 年首次发布。它遵循 SQL 标准,但与传统的数据库系统不同,SQLite 并不运行在独立的服务器进程中,而是作为一个嵌入式数据库引擎直…...
uniapp中score-view中的文字无法换行问题。
项目场景: 今天遇到一个很恶心的问题,uniapp中的文字突然无法换行了。得..就介样 原因分析: 提示:经过一fan研究后发现 scroll-view为了能够横向滚动设置了white-space: nowrap; 强制不换行 解决起来最先想到的是,父…...
[学习]RTKLib详解:ephemeris.c与rinex.c
文章目录 RTKLib详解:ephemeris.c与rinex.cPART A: ephemeris.c一、代码整体作用与工作流程分析1.1 整体作用1.2 工作流程 二、核心函数说明2.1 alm2pos (Almanac to Position)2.2 eph2clk (Ephemeris to Clock)2.3 eph2pos (Ephemeris to Position)2.4 geph2pos (G…...
JDBC:java与数据库连接,Maven,MyBatis
JDBC 是使用Java语言操作关系型数据库的一套API JDBC是接口,用其实现一系列不同种类关系型数据库的实现类 JDBC本质: 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口 各个数据库厂商去实现这套接口,提供数据库驱动jar包 我…...
代码随想录第39天:单调栈
一、每日温度(Leetcode 739) 思路: 栈里存放的是**“还没等到升温的日子”**的索引; 每遇到一个新的温度: 检查是否比栈顶的温度高; 如果高了,说明升温来了,栈顶元素可以出栈&…...
如何在vite构建的vue项目中从0到1配置postcss-pxtorem
1. 安装postcss-pxtorem和autoprefixer yarn add postcss-pxtorem autoprefixer2. 在vite.config.ts中写入 import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; import postcssPxtorem from "postcss-pxtorem"; impo…...
基于51单片机的自动洗衣机衣料材质proteus仿真
地址:https://pan.baidu.com/s/13d2bJ6vKh8ZLuDBZnI0VGw 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C51 是一款常用的 8 位单片机,由 Atmel 公司(现已被 Microchip 收…...
永久免费的小工具,内嵌微软接口
有时候我们制作短视频,需要为视频添加声音,但部分配音软件要收费。不过别担心,今天给大家推荐一款超实用的免费文字转语音软件,完全无需担忧费用问题! 01 软件介绍 这款软件就是Read Aloud,具有以下特点&a…...
C++漫步结构与平衡的殿堂:AVL树
文章目录 1.AVL树的概念2.AVL树的结构3.AVL树的插入4.AVL树的旋转4.1 左单旋4.2 右单旋4.3 右左双旋4.4 左右双旋 5.AVL树的删除6.AVL树的高度7.AVL树的平衡判断希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 二叉搜索树有其自身的缺陷…...
MIST:一键解锁 macOS 历史版本,旧系统安装不再难!
在 Mac 电脑的使用过程中,你是否遇到过这些困扰?为了运行一款经典设计软件,新系统却无法兼容;或是想给老旧 Mac 设备升级,却找不到适配的系统版本。而 App Store 里,旧版 macOS 安装包就像 “隐藏副本”&am…...
mac连接lniux服务器教学笔记
从你的检查结果看,容器内已经安装了 XFCE 桌面环境(xfce.desktop 和 xubuntu.desktop 的存在说明桌面环境已存在)。以下是针对 Docker 容器环境的远程桌面配置方案: 一、容器内快速配置远程桌面(XFCE VNC)…...
网站公安备案流程及审核时间
在中国,网站运营除了需要 ICP备案(工信部备案),还需完成 公安备案(公安机关互联网站安全备案)。以下是详细流程及审核时间说明: 一、公安备案流程 1. 备案对象 所有在中国境内运营的网站&#…...
python学生作业提交管理系统-在线作业提交系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
从颜料混色到网络安全:DH算法的跨界智慧
一、颜料混色的秘密 想象一下,你和朋友各自有一罐私密的颜料,但你们想共同调出一种只有彼此知道的新颜色,而旁观者即使看到你们的操作也无法复现。奇怪的是,你们全程没有直接交换颜料,却能达成共识——这就是**迪菲-赫…...
初学者的AI智能体课程:构建AI智能体的十堂课
初学者的AI智能体课程:构建AI智能体的十堂课 在人工智能(AI)领域,AI智能体正在逐渐发挥其不容忽视的作用。自动化的智能体不仅仅在理论上广泛讨论,更加在实际应用中开辟了一片新的天地。那么如何动手开发属于自己的AI智能体呢?Microsoft提供的AI智能体入门课正是为此而设…...
数据结构 - 8( AVL 树和红黑树 10000 字详解 )
一:二叉搜索树 1.1 回顾二叉搜索树 我们在树的章节中学习了二叉搜索树的概念。二叉搜索树满足以下性质:如果它的左子树存在,则左子树所有节点的值均小于根节点的值;如果右子树存在,则右子树所有节点的值均大于根节点…...
Tcp 通信简单demo思路
Server 端 -------------------------- 初始化部分 ------------------------------- 1.创建监听套接字: 使用socket(协议家族,套接字的类型,0) 套接字类型有 SOCK_STREAM:表示面向连接的套接字(Tcp协议)&…...
Cesium 导航控件(指南针 + 缩放按钮),自定义放置位置
Cesium 导航控件(指南针 缩放按钮) Cesium 导航控件(指南针 缩放按钮)的功能实现,从技术角度来看,可以整理出一整套实现流程和技术结构。这套流程结合了以下几个核心技术点: 1、整体功能目标 …...
MySQL的索引和事务
目录 1、索引 1.1 查看索引 1.2 创建索引 1.3 删除索引 1.4 索引的实现 2、事务 1、索引 索引等同于目录,属于针对查询操作的一个优化手段,可以通过索引来加快查询的速度,避免针对表进行遍历。 主键、unique和外键都是会自动生成索引的…...
【Fifty Project - D25】
今日完成记录 TimePlan完成情况9:00 - 11:30大论文修改修改情况书小论文修改√16:00 - 17 :00Leetcode√ Leetcode 每日一题 到达最后一个房间的最小时间II:和昨天的每日一题大致一样,增加一个条件&…...
pip下载tmp不够
问题描述 今天遇到一个小问题,在用pip安装的时候提示 ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device 但我们单位用于生产环境的机器磁盘都是基本是论TB的,怎么会不够呢? 原因分析:…...
一种机载扫描雷达实时超分辨成像方法——论文阅读
一种机载扫描雷达实时超分辨成像方法 1. 专利的研究目标与产业意义1.1 研究目标与实际问题1.2 产业意义2. 专利的创新方法:滑窗递归优化与实时更新2.1 核心模型与公式2.2 与传统方法对比优势3. 实验设计与验证3.1 仿真参数3.2 实验结果4. 未来研究方向与挑战4.1 学术挑战4.2 技…...