- 博客(57)
- 收藏
- 关注
原创 C++_哈希
本文介绍了C++中unordered系列关联式容器的哈希表实现原理。相比红黑树结构的关联式容器,哈希表通过哈希函数建立元素与存储位置的映射关系,实现O(1)的平均查找效率。文章详细阐述了哈希冲突的解决方法(开放定址法和链地址法),并提供了哈希表的具体实现代码,包括迭代器设计、扩容机制等关键技术点。同时介绍了位图和布隆过滤器两种哈希应用,位图适用于海量数据存在性判断,布隆过滤器则用于允许一定误判率的场景。最后通过封装unordered_set和unordered_map展示了哈希表在实际开发中的应用。
2025-09-06 22:28:35
1052
原创 CAN通信入门
本文介绍了CAN总线的基础知识与应用。CAN总线是BOSCH开发的串行通信总线,具有抗干扰强、传输速率高(1Mbps/40m或125kbps/1km)、支持多设备等特点,广泛应用于汽车和工业控制领域。文章详细解析了CAN的差分信号传输、帧格式(数据/遥控/错误/过载帧)、位填充等关键技术,并对比了不同通信协议。通过STM32的CAN外设实例,展示了硬件电路设计、初始化配置、收发函数实现等开发要点,包括GPIO设置、过滤器配置及数据传输流程。最后提供了基础的CAN通信代码实现框架。
2025-09-05 20:07:20
824
原创 Linux进程概念
本文主要介绍了计算机系统中的关键概念和技术。首先阐述了冯诺依曼体系结构的特点,包括CPU只能直接访问内存、外设必须通过内存进行数据交换等核心原则。其次详细讲解了操作系统的管理功能,包括进程概念、PCB数据结构、进程状态(运行、阻塞、僵尸等)以及进程调度优先级。文章还深入探讨了环境变量的作用和使用方法,包括PATH、HOME等常见变量及其相关指令。最后分析了进程地址空间的本质,解释了虚拟地址到物理地址的转换机制,以及页表在内存管理中的重要作用。这些内容系统性地揭示了计算机系统如何通过分层管理和资源调度来实现高
2025-07-30 21:16:01
1147
原创 C++_红黑树树
本文介绍了红黑树的概念、性质及其实现。红黑树是一种二叉搜索树,通过颜色标记和旋转操作保持近似平衡,其最长路径不超过最短路径的两倍。文章详细阐述了红黑树的插入操作及其三种处理情况(uncle节点为红/不存在/黑),并提供了代码实现。此外,还讲解了红黑树的检查方法(检查连续红节点和黑节点数量一致性),以及如何用红黑树模拟实现STL中的map和set,包括迭代器设计。最后给出了完整的红黑树底层实现代码,包含旋转、平衡检查和高度计算等核心功能。
2025-07-29 19:19:23
1121
原创 STM32单片机_4(入门完结篇)
本文介绍了STM32嵌入式开发中的电源控制、看门狗和FLASH闪存三大模块。在电源控制方面,详细讲解了主频修改、睡眠模式、停止模式和待机模式的实现方法,包括时钟配置、中断唤醒等关键技术。看门狗部分对比了独立看门狗和窗口看门狗的工作原理与配置方法,强调喂狗操作的重要性。FLASH闪存章节介绍了数据存储机制,展示了如何将SRAM数据保存到FLASH以避免掉电丢失,并提供了电子签名的读取方法。全文通过代码实例详细演示了各模块的实现过程,为STM32初学者提供了实用的开发指导。
2025-07-13 17:01:36
510
原创 Linux环境基础开发工具使用
Linux安装软件的方式:1 源代码安装2 rmp安装 -- Linux安装包3 yam安装 : 解决安装源, 安装版本, 安装依赖这些问题说简单一点yam就类似于应用商店rzsz这个软件是实现Linux和windows之间消息互传sudo yum install 软件名字 : -y是不询问sudo yum remove 软件名字: -y是不询问有一些软件官方下载源里面没有, 如果我们要去安装的话就要先去安装扩展源。
2025-07-12 19:08:14
1174
原创 STM32单片机_3
摘要:本文介绍了IIC和SPI通信协议的实现方法,包括软件模拟和硬件配置。在IIC部分,详细说明了起始信号、地址寻址、应答机制等关键时序,并给出了STM32的软件模拟代码示例。SPI部分则讲解了模式0的实现,以及W25Q64 Flash存储器的读写操作流程。此外,还介绍了STM32的RTC模块使用,包括备份寄存器的读写和实时时钟的配置方法。文中提供了完整的代码实现,涵盖初始化、寄存器读写、数据收发等关键操作,并对硬件配置注意事项进行了说明。
2025-07-10 16:31:58
1151
原创 Linux_常见指令和权限理解
Linux操作系统基础与权限管理摘要 Linux是一款开源、稳定、安全的操作系统,广泛应用于服务器后端、智能设备和嵌入式场景
2025-07-08 13:14:41
888
原创 STM32单片机学习_2
本文介绍了STM32 ADC和DMA模块的使用方法。第七章详细讲解了ADC单通道和多通道的配置,包括初始化时钟、GPIO设置、ADC参数配置及校准流程。第八章介绍了DMA的基本原理和应用,包括存储器到存储器的数据传输,以及DMA与ADC多通道的结合使用,实现了高效的数据采集。第九章阐述了串口通信的实现,包括发送和接收数据的方法,以及通过状态机机制处理数据包的技巧。文中还提供了丰富的代码示例和详细解释,如ADC初始化、DMA配置、串口发送接收等,为嵌入式开发者提供了实用的参考。
2025-07-04 15:04:13
932
原创 stm32单片机学习入门_1
这篇博客记录了STM32单片机学习笔记,主要包含以下内容:1) DMA直接内存访问功能;2) 标准库工程创建方法;3) GPIO配置与使用(输入/输出模式);4) 中断系统(外部中断、定时器中断);5) PWM应用(呼吸灯、舵机控制、电机驱动);6) 输入捕获测量频率/占空比;7) 编码器测速实现。重点讲解了各类外设的初始化配置流程,并通过代码示例详细说明GPIO、定时器、PWM等模块的使用方法,包括时钟配置、结构体参数设置和典型应用场景。笔记还对比了STM32与51单片机的差异
2025-06-30 18:08:19
754
原创 python_入门基础语法(2)
本文主要介绍了Python基础语法中的条件语句、循环语句、函数定义与使用、列表/元组/字典操作以及文件读写等内容。在条件语句部分讲解了if-elif-else结构;循环语句介绍了while和for循环,特别说明了Python特有的range函数和可迭代对象概念;函数部分重点讲解了参数传递、返回值和作用域规则;数据结构部分对比了列表和元组的异同,详细说明了字典的使用方法;文件操作部分介绍了文件路径、打开方式及读写方法。文章还提及了Python特有的编程规范要求,如缩进规则和PEP8规范
2025-05-26 21:33:35
1126
原创 python_入门基础语法(1)
本文主要介绍了Python基础语法与C++/Java的主要区别。Python采用动态类型,变量类型在运行时确定,且整型无大小限制,浮点型仅float一种但相当于双精度。字符串使用灵活,单/双引号等价,支持三引号处理复杂字符串。输入输出使用input()和print(),支持f-string格式化。运算符方面,算术运算包含**幂运算和//地板除;关系运算符可直接比较字符串;逻辑运算符支持and/or/not及短路求值。Python特有赋值方式如多元赋值(a,b=1,2)和复合赋值(+=),但去除了易混淆的++
2025-05-25 17:57:38
980
原创 C++_AVL树
本文介绍了多种搜索数据的方法,包括暴力搜索、二分搜索、二叉搜索树、二叉平衡搜索树(如AVL树和红黑树)、多叉平衡搜索树(如B树)和哈希表。重点讨论了AVL树,它是一种自平衡二叉搜索树,通过确保每个节点的左右子树高度差不超过1来维持平衡。文章详细阐述了AVL树的概念、节点定义、插入操作、旋转操作(包括左单旋、右单旋和双旋)以及验证和删除操作。AVL树在查询时具有高效的时间复杂度(O(log N)),但在频繁插入和删除时性能较低,因此适合用于数据静态且需要高效查询的场景。
2025-05-19 22:20:54
1167
原创 C++_STL_map与set
关联式容器与序列式容器的主要区别在于存储结构。序列式容器如vector、list等,底层为线性序列,存储元素本身;而关联式容器如map、set等,存储键值对,数据检索效率更高。键值对由key和value组成,key用于唯一标识元素,value存储与key关联的信息。STL中的关联式容器分为树形结构和哈希结构,树形结构包括map、set、multimap、multiset,底层使用平衡搜索树(红黑树),元素有序。set存储唯一元素,不允许修改,查找时间复杂度为O(log n)。
2025-05-16 18:49:53
1224
原创 C++_进阶_异常
C语言传统的错误处理方式主要包括终止程序(如使用assert)和返回错误码。终止程序的方式在发生严重错误时使用,但用户体验较差;返回错误码则需要程序员自行处理错误,常见于系统库函数中。C++引入了异常处理机制,通过throw抛出异常,try/catch捕获和处理异常。异常处理允许在函数无法处理错误时,将错误传递给调用链中的上层函数处理。C++异常处理机制包括异常抛出、捕获、重新抛出、异常安全、异常规范和自定义异常体系等。异常处理的优点在于能够清晰展示错误信息,简化错误处理流程,但缺点包括执行流混乱、性能开销
2025-05-15 12:31:13
1097
原创 c++——二叉树进阶
本节内容主要围绕二叉搜索树(BST)展开,旨在通过二叉搜索树的学习,进一步理解map和set等数据结构的特性。二叉搜索树是一种特殊的二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的性质。文章详细介绍了二叉搜索树的基本操作,包括查找、插入和删除,并提供了递归和非递归的实现方式。此外,还探讨了二叉搜索树在实际应用中的两种模型:key搜索模型和key-value搜索模型。最后,文章通过几道LeetCode题目,展示了二叉搜索树在面试题中的应用,如二叉树的字符串表示、最近公共祖先、二叉搜索树
2025-05-10 23:30:44
1389
原创 c++ 中的继承
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。1很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设 计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO(面向对象)语言都没有多继承,如Java。3. 继承和组合(1)继承和组合的区别就是:组合在类里面有定义其他的类,两者都是一种复用,都能用相应的成员和函数。
2025-05-02 12:43:15
1154
原创 模板--进阶
【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2025-04-28 22:20:00
1122
原创 stack __ queue(栈和队列)
下面用一些题来深入理解栈的压入、弹出序列_牛客题霸_牛客网这一题就不能找规律,这样就会陷入死胡同,正确的解法就是我们判断的一样我们判断就是通过想着一个模拟实现的栈,只要这个栈的top与出栈开头不同就入栈,相同pop最后看这个栈是否全出了这里里面用out来判断是否出完(若没出完就入,当入完的时候就是false)150. 逆波兰表达式求值 - 力扣(LeetCode)这里涉及到了表达式求解如正常的一个表达式 2+1*3这个表达式是前缀表达式,计算机是无法进行运算的,但是后缀表达式就可以。
2025-04-25 12:28:21
1082
原创 反向迭代器的实现
再写一个反向迭代器,只是在++的地方变为--,--的地方变为++同时rbegin 和rend与我们想象的指向位置不同。不是针对谁去写反向迭代器,而是去针对所有的类型。让解引用进行了错位,可以让便利正常进行。1要啥就传过来,如T* 和 T&2走一个萃取,可以把T 萃取出来。反向迭代器与正向迭代器是。但是写的模板不知道T类型。
2025-04-25 12:28:12
180
原创 list的模拟实现和学习
说白了就是带头循环双向循环链表stl 的两大组件就是容器和算法 ,他们两个之间是通过迭代器进行联系的这三种算法函数迭代器的种类 性质(容器底层结构决定)单项:++ forward_list /哈希(unordered_xxx)双向:++ / -- list/map/set随机:++/--/+/- vector /string/deque。
2025-03-23 23:04:51
537
原创 STL 简介+string
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。
2025-03-10 17:55:13
1124
原创 模板-初阶
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>(也就是必须显式实例化),然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
2025-03-01 13:10:42
322
原创 c/c++内存管理
new的原理1. 调用operator new函数申请空间(最底层还是用malloc)2. 在申请的空间上执行构造函数,完成对象的构造delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间(还是用free)new T[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申 请2. 在申请的空间上执行N次构造函数delete[]的原理。
2025-02-27 21:34:34
727
1
原创 类与对象(中)
我么可以看见 ,虽然默认会生成构造函数 但是这也是祖师爷留下的一个坑,就是不会去初始化(有函数)c++类型分为1内置类型/基本类型 ----语言本身定义的基础类型 int/char.double 指针等等2自定义类型,用struct/class等定义的类型注意上面就是在定义d1的时候传的参数!!!但是什么时候要自己写构造函数呢?(最终还是要自己写构造函数--->对自定义类型)1内置类型成员完成值拷贝/浅拷贝2自定义类型会调用他的拷贝构造问题 1 析构两次,报错 2一个修改会影响另一个。
2025-01-15 08:28:24
1692
原创 c++入门 LESSON1
但当n时动态对象时 结果是不确定的(n空间被销毁)(如果栈帧没有被清理 结果侥幸正确 但要是被清理 结果就是随机值)展开相当于暴露到全局 ---即若定义了全局变量 同时展开了namespace里面的同名变量会报错。1 做参数 (1输出型参数如 Swap函数)(2提高效率---》大对象/深拷贝)即 函数名相同 参数相同 返回值不相同(就是函数的参数) 不构成重载!在取别名的时候才会有权限的概念(函数返回的时候也会出现临时变量)但是指定展开麻烦 但是展开又会有冲突(即不要轻易的展开)
2025-01-01 16:35:49
479
原创 c++入门 LESSON0
2 整体而言 Java方向的学习成本和c++学习成本差不多。c++ 学完后就不会再想用 c写代码了。c++确实就是最难学的语言之一。1java的语法学习比c++简单。要做笔记(知识点很多)4. 如何学习C++
2024-12-29 22:31:27
347
原创 数据结构:排序
因为外面一层为logN 经过预排序后 里面的循环分两端(gap 很大 和gap很小)但都是N。两个有序区间归并的思路:依次比较,小的尾插到新空间(思路和后序遍历差不多)与gap有关 N*logN (底数就是gap)----这个是可以近似看为。比如间隔为3 的分为一组 一共分了三次 (能使大的更快的跳到后面)选出一个基准值 key 把他放到正确的位置(最终排好序要蹲的位置)1:预排序 ---目的是为了使数组接近有序 ————分组排序。插入排序法: 时间复杂度为O(N)~O(N^2)
2024-12-28 21:26:07
487
原创 二叉树 概念和结构
DFS :深度优先遍历(一般用递归) :走到无路可走就往回退(最经典为前序遍历)(三种序列都是深度优先遍历 但是要看有没有严格要求什么时候访问节点)BFS:广度优先遍历(一般用队列) :对于二叉树就是层序遍历(针对二叉树)向上调整建堆:从上向下看,调整次数少,节点个数少,到最后两个都多,在堆中插入元素时要操作的是数组 但在逻辑上看是操作的是二叉树。目前学的二叉树(普通)没有作用,用二叉树来存储数据就更高大上嘛?物理结构:实实在在在内存中是如何存储的(就是树下面的数组)4.二叉树链式结构及实现。
2024-12-22 16:01:19
415
原创 数据结构 :栈和队列
数组模拟链表---就是结构数组 一个是data 一个是下一个元素的下标。函数调用 里面 栈 操作系统,内存区域划分。要是用链表(单链表)也可以(此时是头插和头删 尾删不能实现)malloc 堆。局部变量 变量储存 栈 数据结构。是两个学科 不同的名字。
2024-12-16 16:28:25
273
原创 链表的概念和实现
1 存储的数据 2, 指针(指向下一个节点)这个链表不可能为空,插入不需要再判断空指针的情况。在创建带头双向循环链表是要用到初始化函数。尾插时先找到为尾节点,用while循环。哨兵位的next指向第一个元素。顺序表和链表是数据结构的内容。尾的next指向哨兵位的头。物理结构:不一定是线性的。链表是由一个一个节点组成。逻辑结构:一定是线性的。链表也是线性表的一种。
2024-12-11 16:58:38
218
原创 单片机的介绍
模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用。单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制。
2024-12-11 16:58:31
2013
原创 算法的时间复杂度和空间复杂度
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度。因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。大部分的空间复杂度为O(N)或者O(1)
2024-12-01 16:18:01
278
原创 数据结构初阶 LEASSON1
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。(在内存当中管理数据)剑指offer等学完了数据结构就可刷题。代码一定要自己能写出来就可以了。c++初阶后就可以刷力扣。
2024-11-30 14:49:00
223
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人