- 博客(43)
- 收藏
- 关注
原创 【C++11】范围for循环与nullptr详解
C++11引入了基于范围的for循环和nullptr关键字来改进代码可读性和安全性。范围for循环简化了数组和容器的遍历,其语法为for(auto& e : array),但要求迭代范围必须确定且对象支持++和==操作。nullptr则解决了C++98中NULL宏的二义性问题,专门用于表示空指针,避免函数重载时的歧义。建议在C++11及以上版本中使用nullptr替代NULL或0来表示空指针,以增强代码健壮性。这些新特性使C++代码更简洁、更安全。
2025-08-23 08:52:57
509
原创 【C++]揭秘内联函数:C++性能优化的秘密武器
内联函数会在调用它的地方展开,导致这个函数没有地址,而其他文件如果要调用这个函数就需要链接它。2.在 debug 模式下,需要对编译器进行设置,否则不会展开(因为 debug 模式下,编译器默认不会对代码进行优化,以下给出 vs2013 的设置方式)因为 inline 被展开,就没有函数地址了,链接就会找不到。如果在上述函数前增加 inline 关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。的函数叫做内联函数,
2025-08-22 14:24:44
201
原创 【C++】函数重载原理与实战
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,中国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!是函数的一种特殊情况,C++允许在声明几个功能类似,这些同名函数的,常用来处理实现功能类似数据类型不同的问题。调用重载函数可以自动识别类型的顺序不同不是形参的顺序不同,是类型的顺序不同,我们要理解 Cpp 对函数名字的修饰原理下图函数不构成重载。
2025-08-21 08:53:37
861
原创 【C++】命名空间与缺省参数全解析
C++通过命名空间(namespace)解决命名冲突问题,相比C语言能更灵活地管理标识符。其输入输出使用cout/cin流对象,支持自动类型识别。C++还引入缺省参数功能,允许函数参数指定默认值,分为全缺省和半缺省两种形式。这些特性使C++在代码组织和函数调用方面比C语言更具优势,但需注意命名空间展开可能引发的命名污染问题,以及缺省参数在声明和定义中的一致性要求。
2025-08-21 08:39:20
560
原创 【数据结构】递归与非递归:归并排序全解析
归并排序的递归实现,核心思想是 “分治 + 合并”—— 将数组不断分割为更小的子数组,待子数组有序后,再将它们合并为更大的有序数组。归并排序核心步骤:归并排序的单趟思想就是合并两个有序数组;把数组拆成两半 → 递归拆到最小(单个元素)→ 逐层合并成有序数组。
2025-08-20 23:38:37
533
原创 【数据结构】快速排序算法精髓解析
下面我们先理解快速排序排一趟的过程:如果选择最右边的值让右边的 end 先走选择最右边的值作为 key 需要 begin 先走,不然排序会出问题找大是找一个比基准值 key 大的数,第一个数是 6 比 5 大,end 找到比基准值小的数 4 时,将 4 和 6 交换到达中间位置时将中间数据和 key 交换一趟我们就可以把一个数组分成三个部分比 key 小的子数组,key,比 key 大的子数组。
2025-08-20 23:33:30
1029
原创 【数据结构】直接选择排序
在剩余的 array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余 1 个元素。每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的。若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。在元素集合 array[i]--array[n-1]中选择关键码最大(小)的数据元素。2.遍历数组中的元素,找出当前区间最小和最大数据的下标;时间复杂度:O(N^2)
2025-08-20 23:21:12
126
原创 【数据结构】希尔排序:高效分组的插入排序优化
当 gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就。gap 越大,前面大的数据可以越快到后面,后面小的数可以更快到前面。希尔排序的时间复杂度不好计算,因为 gap 的取值方法很多,导致很难去计算,因此在好些树中给出的。gap 越小越接近有序,如果 gap==1 其实相当于直接插入排序就有序了;这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。希尔排序是对直接插入排序的优化。希尔排序的时间复杂度都不固定。
2025-08-20 23:18:57
100
原创 【数据结构】揭秘直接插入排序:玩扑克也能学算法
简单来说:就是将待插入的数据与序列中的数据一一对比,然后插入序列合适的位置;实际中我们玩扑克牌时,就用了插入排序的思想。我们可以创建一个数组测试一下。
2025-08-20 23:16:55
144
原创 【数据结构】排序算法全解析:概念与接口
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且 r[i]在 r[j]之前,而在排序后的序列中,r[i]仍在 r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。:数据元素全部放在内存中的排序。:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
2025-08-20 23:05:46
391
原创 【数据结构】使用队列解决二叉树问题
本文介绍了二叉树的层序遍历和完全二叉树的判断方法。层序遍历通过队列实现:根节点入队后,循环取出队首节点并访问,同时将其左右子节点入队,直到队列为空。对于完全二叉树的判断,同样使用队列进行层序遍历,在遇到第一个空节点后检查队列剩余节点是否全为空,若存在非空节点则不是完全二叉树。文章以二叉树A(BC(DEF))为例,详细演示了层序遍历ABCDEF的执行流程,并给出了两种算法的C语言实现代码。
2025-08-19 23:32:20
368
原创 【数据结构】二叉树-堆(深入学习 )
本文介绍了二叉树的基本概念和操作实现。主要内容包括:1.二叉树链式结构的基本实现方式,通过手动创建简单二叉树进行学习;2.二叉树的三种遍历方式(前序、中序、后序)及其递归实现;3.层序遍历的概念;4.计算二叉树节点数的三种方法比较;5.求叶子节点数、第K层节点数的实现;6.查找特定值节点和销毁二叉树的递归实现。文章强调二叉树操作多采用递归实现,并提供了详细的代码示例,适合初学者理解二叉树的基本操作原理。
2025-08-19 23:25:13
804
原创 【数据结构】用堆解决TOPK问题
该算法使用大堆结构高效找出数组中最小的k个数。关键实现包括:1)处理边界条件(k<=0或k>=数组长度);2)构建k大小的大堆;3)遍历剩余数组元素,替换堆顶元素并调整堆结构。通过从最后一个非叶子节点开始构建堆,确保时间复杂度为O(nlogk)。算法内存使用合理,直接返回堆空间作为结果,避免额外拷贝。HeapDown函数严谨实现大堆特性,包含子节点比较和边界检查,保证了代码健壮性。该方法相比全排序更高效,特别适合处理大规模数据。
2025-08-19 23:13:56
418
原创 调试技巧(vs2022 C语言)
启动调试,经常用来直接跳到下一个断点处(F5通常和F9配合使用,打了断点按F5程序可以直接运行到断点处,这样提高了调试效率)F10和F11有区别,F11可以进到Add函数内部(但是现在的编译器一般不支持调试库函数),F10不会,所以F11更加细致。创建断点和取消断点(可以在程序的任意位置设置断点,这样可以让程序在随意的位置停止执行,继而一步步执行下去)逐语句,即每次执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数的内部(这是最常用的)调试可以看函数堆栈,反汇编,寄存器等。
2025-08-18 09:15:20
642
2
原创 【数据结构】堆中插入数据,删除数据
堆插入数据我们是从尾部插入,插入数据不应该改变堆的性质(即不改变堆之前大堆或小堆的性质),比如在小堆时,如果插入的数据比插入位置的父结点小就不需要进行额外操作,但是如果插入的数据比插入位置的父结点大就需要进行相应调整,让其依然是小堆。比如上图的堆要插入的数据是13,应该如何进行调整?我们可以发现插入的数据只是对一条路上的数据有影响,我们只需要调整这一条路的数据即可。调整的方法我们使用向上调整算法1.通过插入位置坐标得到插入结点(我这里还是叫child)的父亲结点;
2025-08-18 09:11:36
469
原创 【数据结构】“令冒泡排序的我叹为观止”-堆排序
−1)(如第 1 层2^0=1个结点,第 2 层2^1=2个结点,…−2),调整次数1(因为下一层就是叶子结点),贡献2^((高中的知识,忘记了可以复习一下,用到了错位相减法)−1)的非叶子结点,最多需要向下调整到叶子结点(第。层),因此最大调整次数为 “层数差”:调整次数=,冒泡排序的时间复杂度是:N^2;=1):结点数2^0,调整次数。=2):结点数2^1,调整次数。这样就可以将一个数组排成降序。可以看出堆排序的效率更高;根结点为第 1 层,−1,贡献2^0×(−2,贡献2^1×(−1):结点数2^(
2025-08-17 08:16:43
250
原创 【数据结构】堆-“此堆非比堆”
如果有一个关键码的集合K = { k0,k1 ,k2 ,…,k(n-1) },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K(2i+1)且 Ki<= K(2i+2)(Ki>=K(2i+1)且Ki>=K2i+2) i = 0,1, 2…,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。大堆:(没有规定左右孩子谁大谁小)完全二叉树。
2025-08-17 08:15:42
919
原创 【数据结构】二叉树概念及结构
摘要:二叉树是每个节点最多有两个子树的树结构,子树分左右且不可颠倒。其重要性质包括第i层最多有2^(i-1)个节点、深度为h的树最多有2^h-1个节点、叶节点数n0=度为2的节点数n2+1等。存储方式分为顺序存储(适合完全二叉树)和链式存储(分二叉链和三叉链)。完全二叉树的节点关系可通过数组下标计算父子节点位置。这些特性使二叉树成为高效的数据结构基础。
2025-08-16 14:25:36
1124
原创 【数据结构】树的概念及结构
摘要 树是一种非线性数据结构,由具有层次关系的节点集合组成,形似倒挂的树形结构。树的基本概念包括根节点、子树、节点度(子节点数量)、叶节点(度为0)、分支节点、父子关系、兄弟节点等。树的度指树中节点的最大度数,深度指节点的最大层次。树结构可以通过多种方式表示,常用的有孩子兄弟表示法。树结构在实际应用中主要用于表示层次关系,如文件系统的目录结构,而非单纯存储数据。树具有递归定义的特点,森林则是多棵互不相交树的集合。
2025-08-16 14:17:02
240
原创 【数据结构】队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头。
2025-08-15 23:12:18
234
原创 【数据结构】搞懂何为“栈”?
栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈/压栈/入栈,出栈:栈的删除操作叫做出栈。基于栈的相关功能实现。
2025-08-15 23:09:49
257
原创 理清C语言中内存操作的函数
C语言内存操作函数(memcpy、memmove、memset、memcmp)是处理二进制数据的核心工具。memcpy实现高效内存复制但不处理重叠,memmove则能安全处理重叠内存的复制。memset用于内存初始化(按字节填充),memcmp提供二进制数据比较功能。这些函数以字节为单位操作,适用于任意数据类型,但使用时需注意内存边界、重叠问题和数据类型特性。与字符串函数不同,它们不依赖终止符,适合处理原始内存数据。正确使用这些函数能提升程序效率和安全性。
2025-08-10 14:51:31
967
原创 【数据结构】链表
本文详细介绍了单向链表和双向链表的实现原理及基本操作。在单向链表部分,讲解了链表结构定义、打印、尾插/头插、尾删/头删等操作的实现方法,重点分析了指针传递问题(需使用二级指针修改头节点)。双向链表部分则展示了带头双向循环链表的结构优势,详细说明了初始化、插入、删除等操作的实现逻辑,强调通过画图辅助理解指针操作。文章还对比了两种链表的特点:单向链表结构简单但功能有限,适合作为子结构;双向链表结构复杂但操作高效,适合单独存储数据。所有代码示例都配有详细注释,帮助理解指针操作和边界条件处理。
2025-08-08 11:34:53
1091
原创 【数据结构】顺序表实现-增删查改
本文介绍了线性表的基本概念及其实现方式。线性表是n个具有相同特性数据元素的有限序列,在逻辑上呈线性结构,物理存储上可采用数组或链式结构。重点阐述了顺序表的两种实现方式:静态顺序表(定长数组)和动态顺序表(动态数组)。详细讲解了动态顺序表的核心操作实现,包括尾插、尾删、头插、头删等基本操作,以及空间扩容、数据查找、指定位置插入/删除等功能的实现逻辑。通过代码示例展示了如何通过动态内存管理实现顺序表的增删查改操作,并提供了完整的工程代码结构,包含头文件定义、接口函数实现和测试用例。
2025-08-07 21:58:32
906
原创 理清C语言中动态内存管理相关函数
本文详细介绍了C语言中动态内存管理的四个核心函数:malloc、calloc、realloc和free。这些函数声明在<stdlib.h>头文件中,用于在程序运行时进行内存分配、调整和释放。malloc分配未初始化的内存块,calloc分配并初始化为0的内存块,realloc用于调整已分配内存的大小,而free则负责释放内存。文章对比了各函数的异同,阐述了它们之间的依赖关系和使用注意事项,包括返回值检查、内存泄漏防范、野指针处理等。特别强调了realloc的特殊行为和使用技巧,为程序员正确使用动
2025-08-07 21:40:51
741
原创 搞懂什么是数据结构与算法
摘要: 数据结构是数据的组织与存储方式(如数组、链表、树、图等),决定了数据存取效率;算法是解决问题的步骤(如排序、查找等),影响处理数据的性能。两者密不可分:数据结构为算法提供操作对象,算法则基于数据结构实现高效处理。选择合适的数据结构(如哈希表快速查找)和优化算法(如降低时间复杂度)是提升程序效率的关键。
2025-08-06 23:15:32
549
原创 如何测试一个机器是大端还是小端
要判断一台机器是大端(Big-Endian)还是小端(Little-Endian),可以通过编程来测试。这两种模式指的是。
2025-08-06 23:11:14
196
原创 解决Cubemx生产的 .ioc文件不能外部打开的方法
2.重新安装一次cubemx,在安装的时候选择为我安装,而不是为所有用户安装;1.首先检查java环境是不是装的JAVA8,如果是的话进行第二步操作;但是当图标白色的时候,无法通过直接点击这个文件进入cubemx。正常来说,cubemx生成的文件会有图标。
2025-03-27 23:12:12
475
原创 DMA 之FIFO的作用
1,减少AHB带宽的占用,减少AHB总线的仲裁,让CPU能够在AHB总线上占用更大的带宽而不需要和DMA经常竞争总线。假如没有FIFO,数据进来一次就立刻通过流输出,DMA占用了总线CPU就不能占用总线了,而总线的带宽一般是32为,一个字节进来就打断一次,效率太低了。假如没有FIFO,数据进来一次就立刻通过流输出,DMA占用了总线CPU就不能占用总线了,而总线的带宽一般是32为,一个字节进来就打断一次,效率太低了。但是有了FIFO,可以先存够相应字节再一起发出去,提高了资源的利用率;
2025-03-27 23:04:03
509
原创 通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形
ARR (Auto-Reload Register):决定PWM频率。频率公式:PWM频率 = 定时器时钟 / (ARR + 1)示例:pulse1[0] = 1000 → 频率 = 100MHz / 1001 ≈ 99.9 kHzpulse2[0] = 5000 → 频率 = 100MHz / 5001 ≈ 20 kHzRCR (Repetition Counter Register):控制脉冲个数。脉冲个数公式:脉冲数 = RCR + 1示例:
2025-03-27 22:58:47
1704
原创 (万字图文解析!!!)单片机组成(内核+架构+外设),代码下载及运行原理总结
架构的定义:在计算机领域,“架构”指的是 计算机系统的设计蓝图,它定义了硬件和软件之间的交互规则。类比:就像一座房子的设计图,规定了房间布局、门窗位置、水电管道等。计算机架构决定了CPU如何执行指令、如何访问内存、如何处理数据等核心功能。指令集架构(ISA) 是架构的核心部分,可以理解为 CPU的“语言”:ISA本身是规范,既需要硬件实现,也需要软件遵循。硬件角度:ISA定义了CPU能理解和执行的所有指令(如加法、跳转、数据加载等)。
2025-03-15 19:11:18
1656
原创 算法的时间复杂度和空间复杂度
一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法(估算)。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)
2024-11-03 09:27:10
1079
原创 (C语言)结构体,联合体,枚举
位段的声明和结构是类似的,有两个不同:1.位段的成员必须是int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。int _b : 4;int _c : 8;A就是一个位段类型联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)。//4个字节char b;//1个字节int main()union Un u;
2024-11-01 16:43:46
1777
原创 (C语言)动态内存管理,柔性数组
size是要申请的字节数,这个函数最后回返回开辟这个空间的起始地址内存开辟失败返回空指针理解内存泄漏的概念:如果开辟一块空间,用完之后没有释放,即没有还给操作系统,其他的变量也用不了这块空间,就相当于这块空间丢了,这种情况就叫做内存泄漏int main()return 1;//返回1说明是异常返回i < 10;i++)i < 10;//free释放这块空间存放的东西,但是p指向的地址没有被释放p = NULL;//让p为空指针return 0;
2024-11-01 16:27:16
1709
原创 通讯录(C语言练手小项目)1
首先,新建项目,创3个源文件,分别为test.c , contact.c , contact.h。contact. c 通讯录相关的实现。contact. h 通讯录相关的声明。这是静态版本,后面会有动态版本。test. c 测试功能。
2024-10-28 10:52:37
263
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人