- 博客(60)
- 收藏
- 关注
原创 C++异常与智能指针
关于异常/错误的处理,C语言时期的方法是通过错误码的形式来处理错误。错误码类似于一个map,C语言内核会为每一个错误码附带一个错误信息,发生异常后便会给出错误码,接着我们需要拿着错误码去找错误信息,比较麻烦。在C++中异常处理机制得到了改善,使用的是异常的抛出与捕获方法。当程序出现问题的时候,我们通过抛出(throw)一个对象来触发一个异常,接着由catch判断类型是否符合。每一个try都至少会匹配一个catch,否则就会报错。
2025-10-14 23:25:30
705
1
原创 C++ 11包装库,lambda的用法
lambda表达式本质是一个匿名函数对象,但是他可以定义在函数内部,一般来说,我们可以直接使用auto的对象来接收lambda对象。其中,capture-list是捕捉列表,用于获取函数内的局部变量来给lambda函数使用。编译器是根据"[]"的存在来判断这个是否为lambda函数。所以,即使我们什么也不需要捕捉,将其为空也不可以省略。lamda的捕捉有两种方法,传值捕捉和引用捕捉。传值捕捉的参数不能在lambda函数体内修改,但是传引用捕捉的可以。
2025-10-04 13:38:36
329
原创 C++11学习:可变参数模版
可变模版参数是C++11新引入的机制,其本质是模版的模版,一个可变参数模版支持可变数量参数的函数模版和类模版。和普通模版函数一样,你在函数界面可以传值,也可以传左值引用或者万能引用。其基本语法规则是在定义模版处需要在参数类型前加上三个点,然后再函数中需要在函数类型后加上三个点。注意,引用符号要放在点前类型后。如果使用引用传参,依旧遵循引用折叠的规则。
2025-09-28 10:44:51
355
原创 C++11中的列表初始化,右值引用与移动语义
C++11是C++11的一个重要的大更新版本,其中增强了许许多多的特性的语法规则,提高了代码的运行效率,当然也增加了学习成本,我将分几小章分别介绍C++11中常用的语法规则。首选今天要介绍的就是列表初始化,右值引用和移动语义。
2025-09-25 21:12:41
509
原创 哈希表与unorder_set,unorder_map的学习
哈希(hash),是一种理论思想,与各种各样的树一样,其是一种数据组织的方式。依据我的理解,哈希的本质就是映射,将一组数据根据某种规则(哈希函数)映射到一个有序可查的表中。这个表里存放size_t(unsigned int)类型的数据,用于直接访问。因此,哈希表的增删查改的时间效率为O(1),效率很高。但是其也有缺点,就是其得出的结果不会有序,因此哈希的本意为散列,就是散乱的数列。
2025-08-17 17:08:21
953
原创 红黑树的结构
相比于AVL树,红黑树在工作中其实更为常见。作为map和set的底层数据结构,红黑树有四个绝对准则:1.每个结点只有两种颜色,红色或是黑色2.根节点root一定是黑色的3.r=如果一个节点是红色的,那么他的两个子节点一定是黑色的,不会出现两个连续的红色节点4.对于任意一个节点,从其起始到其所以NULL结点的路径上,均有相同数量的黑结点这四个准则间接引出了一个准则,也就是最长路径比最短路径不会长超过2倍,这就保证了红黑树相对的平衡。
2025-08-12 15:43:44
320
原创 AVL树的四种旋转
AVL树是c++中很常用的数据结构,其独有的特点使得其增删查改的效率都是logn级别。AVL树中最核心的是四种旋转方式,我将从代码入手去分析四种旋转的特点,具体图例就不画了。
2025-08-09 19:38:29
247
原创 cpp中的多态
多态的实现依赖于继承,在继承的基础上实现。多态需要基类和派生类的目标函数完成三同:名字同,返回值同,参数类型同。想要实现多态,还有两个重要条件:1.必须是基类的指针或者引用调用了虚函数。只有基类的指针或者引用才能即指向基类又指向派生类。2.被调用的必须是虚函数,并且完成了虚函数的重写/覆盖。使得基类和派生类有不同的函数。
2025-08-01 16:22:45
685
原创 C++继承
继承,顾名思义,就是从长辈那边获得一些东西。cpp中的继承指的是子类从父类继承函数,变量的手段,并在这个的基础上进行扩展,产生新的类。继承设计的核心就是减少代码的编写,提高编码效率。例如胡萝卜和上海青都是蔬菜,那就可以继承蔬菜这个父类的一些变量,比如维生素含量啥啥的,然后可能胡萝卜还有自己的胡萝卜素的含量,再另外处理。继承最本质就是父类和子类还有继承方式,代码中Student就是子类,Person是父类,protected是继承方式。
2025-07-30 16:29:57
985
原创 模版进阶知识及其小知识点
模版参数的类型分为和。指的是出现在模版参数列表中的,前面会跟着class或者typename。一般来说就是用一个常量作为类或者函数模版的一个参数,在该模版中可以将这个参数作为常量来使用。类似于#dfine 但是非类型模版参数只作用于模版中。浮点数,类对象和字符串是不可以作为非类型模版参数的!
2025-07-29 16:48:34
314
原创 stm32 蓝桥杯 物联网 独立键盘的使用
在蓝桥杯物联网平台里面,有5个外接设备,其中有一个就是6个独立按键。首先,我们先看一下按键有关的电路图。
2025-03-09 19:19:25
745
原创 stm32 基于蓝桥物联网赛 oled屏使用
在.h文件中实现一些宏定义,首先定义oled和按键的刷新时间,这代表了oled和按键工作函数每几秒工作一次。接着是按键的宏定义。无需严格写成这样子,只要三个数据不同即可。#define Oled_Min_Time 200 //定义oled和按键的最小刷新时间#define Asw_None 0x00 //定义按键,为后续的逻辑运算做准备#define Asw_1 0x01 //二进制为0001#define Asw_2 0x02 //二进制为0010 #define 后面不需要加;号。
2025-03-07 20:49:38
1153
原创 stm32(hal库)学习笔记-时钟系统
时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单片机的脉搏。在我常用的stm32F1系列中,分别有HSE(高速外部),LSE(低速外部),HSI(高速内部),LSI(低速内部)。高速的两个一般用于滴答时钟,低速的两个一般用于RTC。其中还有两个比较少见的,分别是CSS(时钟安全系统)和FCLK(自由运行时钟)。CSS作用为若HSE启动失败,自动切换HSI,且其可以进NMI中断。FCLK用于采样中断和调试模块记时。休眠时仍然有效。
2025-03-01 19:43:59
918
原创 stack,queue,priority_queue学习知识点
在c++常用的容器中,有的是以容器迭代器为核心,而有的则以容器适配器为核心。较为常用的就包括queue和stack。接下来我将简单的以queue和stack的模拟实现介绍其特点。在以下的模拟实现中,class Con就是我们的容器适配器,他用于传一个容器,默认为deque类模版,deque模版是一种奇妙的模版,他在头部插入和删除时,效率很高,扩容效率也高,但是其不适合遍历。当我们想要实现某个类,而刚好这个类可以用其他类的功能来直接实现,那么我们就可以将这个类用另一个类包装起来。
2025-02-24 23:32:03
445
原创 List模拟实现
list,链表容器是一种能够高效进行数据存储的容器,与前面已经提到的一些容器相似,list也是用迭代器进行遍历和控制数据。但是list的迭代器实现起来较为复杂,因为其不是原生指针的typedef,如果我们要模拟实现一个list类型,需要自己重新定义一个类来实现。STL原文件实现的是双向带头节点的链表,此次我们实现的也相似。
2025-02-19 16:46:42
531
原创 vector的综合学习与OJ
首先我们需要知道,vector需要存储不同类型的数据,可以是存一堆整形也可以是存一串串的字符串,甚至可以存vector,因此,我们需要用模版来实现vector。并且,由于模版类声明和定义不可分离,因此我们大部分代码都要写在.h文件中在STL原装库中,vector是通过3个迭代器来进行定义的,分别是_start,_finish与_endof_Storage,名字可能略有不同,但是具体功能都在下文表示出来了。public:////////private:// 指向数据块的开始。
2025-02-16 10:53:35
901
原创 string类的模拟实现
string类是我们平时经常使用的一种类,他是c++中的字符串。通过自己手动写代码实现string类可以有效促进我们对string类的理解。
2025-02-09 20:12:59
430
原创 2025.2.1(迭代器,auto,for遍历)
迭代器是cpp中STL的重要组成部分,主要负责数据的遍历以及删改,//迭代器,形如指针,一些地方就是指针,begin返回这块空间开始的迭代器,end是最后一个数据的下一个位置的迭代器,很有可能是'\0',it需要解引用所以真的很像指针。
2025-02-01 11:34:19
348
原创 模块初阶学习
函数模版代表了一个函数家族,与特定具体类型无关,函数模版里面T1等参数由使用时决定类型,根据输入的实参推断出,此时T1......Tn应该是什么类型。
2025-01-25 21:40:08
395
原创 类和对象的学习(下)
在类和对象中,我们介绍过一种成员变量初始化的方法,那就是函数体内初始化。这种初始化依赖于函数体的缺省值和实参,并且无法初始化部分数据,如被const修饰的数据。构造函数体内也无法初始化引用成员变量。因此,我们在此介绍另一种成员变量初始化的方式:初始化列表。初始化列表的格式为在构造函数后面以‘:’开始,‘,’分隔,并且在成员变量后面的括号里放初始值或者表达式。这样,就完成了初始化列表。需要注意的是,初始化列表中的每个成员变量只需要初始化一次,多次初始化会到导致报错!
2025-01-22 21:53:23
1030
原创 类和对象学习(中)
在C++的类中,有6个默认的成员函数,当我们不写的情况下编译器会默认生成。这六个里面最重要的是前4个,最后两个相对而言重要性较低。因此,我们重点介绍前四个函数。
2025-01-20 01:08:42
912
原创 类和对象(上)
在cpp中,class是定义类的关键字,例如以下代码,class是关键字,Date是类的名字,{}中是类的主体。该主体中可以放成员函数和成员变量。注意,{}后面的分号‘;’是不可以省略的。在cpp中,class与struct基本等价,但是一般我们还是用class来定义类。根据不同公司,不同学校的习惯,我们一般会把成员变量加一个特殊标识,在我的习惯中,便是在成员变量前加上一个_a以表示这是一个成员变量。cpp的成员函数默认是inline的,因此当成员函数的代码较少的时候,会展开为代码行。
2025-01-15 22:26:07
890
原创 C++基础入门
在学完了C语言和基础数据结构以后,我们可以开始逐渐开始学C++了。C++作为目前市场上最为热门的几款语言之一,也被人们称为最难的语言。C++有着强大的功能与复杂的语法,需要我们尽全力去好好学习他,掌握他,以提高自己的综合能力。因此,从今天开始,我将慢慢在优快云上更新我的学习笔记,若有错误之处,烦请您指出来,无尽感激。C++是大量包含了C语言语法的,因此,你直接在C++的编译器里面写C语言理论上也是没问题的。但是既然C++是plusplus,当然有他的改进与独到之处。
2025-01-13 23:44:17
693
原创 基于esp32-idf的FreeRTOS系统学习
1.运行当任务实际执行时, 它被称为处于运行状态。任务当前正在使用处理器。如果运行RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。
2024-11-08 15:16:06
1370
原创 常见排序算法总结
排序,既将一串数据,无论其原先是有序还是无序状态,都将其变成有序的一个过程。在C语言中,排序有很多种方法,本次主要介绍其中几种,他们的空间复杂度和时间复杂度都可能有所不同。接下来我将以此讲解。
2024-10-08 12:22:26
806
1
原创 二叉树堆的建立与排序
在数据结构中,二叉树是非常好用的一种数据结构,这节暂时按下不表。这节课主要介绍堆的建立与使用。堆,是二叉树中一种很特殊的结构,首先,他必须是满二叉树,也就是除了最后一层以外,其他层都是满的。堆对于节点数据也有要求,其基本按照某种规律进行排序。首先堆分为大堆和小堆。大堆上大小大小堆上小下大。有非常大的差距。并且在堆中每个节点也满足完全二叉树的父子节点规律,既child=parent*2+1 | 2,1和2取决于是子左节点还是右节点。
2024-09-22 21:13:27
914
原创 回环相关知识
回环是链表中一个比较有意思的类型,指的是一条链表尾部的节点连接了链表中某一个节点,导致这个链表会无限遍历,具体表现为如下图所示那么,在回环链表中我们要探索什么呢?第一,我们要探索一个链表是否有无回环;第二,我们要找到链表的回环入口。
2024-09-11 11:32:23
354
原创 贪吃蛇游戏设计学习
在过去几个月,我陆续学习了简单的数据结构,为了能更好的知识学以致用,在此我们设计一款基于开发台的贪吃蛇小游戏,其基于Win32 API设计。贪吃蛇游戏的总体设计思路为,接着我们就先从初始化游戏开始讲。
2024-08-01 20:27:10
724
原创 单链表的学习与基础运用p
先创建一个节点newnote,接着判断链条是否为空链条,若是空链条,则将*pphead直接赋一个newnote,若不是,则开始判断pos的数值,若pos为0的话,那么就执行前插函数,若pos不为0,则在进行下一步。头删也是比较简单的,在头删函数中,我们首先需要先判断到底有没有数据,利用assert函数完成,如果有,再判断有几个数据,如果只有一个,那便是将头地址给删除,如果多于一个,那就将原先的头地址赋给一个值做备份,接着将头地址改变为下一个节点地址,再释放掉之前的头地址,即可完成头删。
2024-07-07 16:01:54
513
原创 顺序表的学习与通讯录的模拟实现
当我们把这些代码写完以后,我们需要把他们串在一起,并在main函数中使用。首先是各个c文件的头文件,两个头文件对自己的函数进行声明,并包含了所需要的库函数。并且为了后续数据以及类型的方便转换,我们还使用了#define对数据进行了定义。因为struct seqlist 与struct man在c文件的重命名无法直接在头文件里面使用,因此我们需要在头文件中重新进行一次命名。int size;}SL;//4int age;}x;
2024-05-08 18:04:24
587
原创 预处理详解
c语言设置了许多的预定义符号,是可以直接使用的,预定义符号也是在预处理阶段进行直接处理的,下列就是一些比较常见的预定义符号。FILE表示该文件保存到哪里,LINE表示当前行数,DATE表示编译时的日期,TIME表示编译时的时间int main()return 0;而在运行以后,也确实打印出了对应的内容。#define的机制包含一个规定,它是允许把参数替换到文本中的,这种实现方法被称为宏,或者叫做定义宏,下面是我举的一个小例子。
2024-05-01 11:33:44
384
1
原创 编译与链接
假设我创立了两个文件分别叫data.c.和main.c,然后main.c中需要用到data中的函数add,在前面的步骤由于都是独立进行的,所以无法使用到这个函数,编译器会暂时把这个搁置,在链接阶段链接器会根据名字进行索引,找到相应的函数的地址,然后将原先搁置的地方变成这个地址,对于这个过程就叫做重定义。我们在把代码以人类能够看懂的形式写好以后,它是不能直接使用的,它需要经过俩个环境,分别是翻译环境和运行环境:翻译环境会将源代码转换成可执行的机器指令,也就是二进制指令。接下里具体介绍编译阶段中的分阶段。
2024-04-27 18:14:09
367
原创 文件操作与使用
在前文提到过,如果文件读取结束,会根据原因留下不同的标识符,feof的功能是判断是否为文件末尾标识符,ferror的功能是判断是否为出错标识符,如果是对应的操作符,那么就会返回一个非0整数,如果不是,那么就会返回一个0.fputc的功能是将一个字符写入当前文件指向的位置,并使得文件指针向后移动一个单位,若写入成功,那么就返回这个字符,若写入失败,则返回EOF并在当前文件指针处设置一个错误标识符。ftell该函数的功能也不算复杂,它的功能就是计算当前文件指针距离文件最开始的地方的偏移量并返回这是值。
2024-04-27 15:29:52
758
原创 动态内存管理
如果原有空间后面已经没有足够大的空间了,那么realloc函数就会另外找一份内存空间,大小满足开辟以后的大小,然后将原空间中所有的数据放到新空间中,然后此时函数返回的地址就是新空间的地址。该函数会向内存申请一块连续可用的空间,并且会返回该空间的指针,因为尚不确定该空间到底会存入什么类型的数据,所所以返回的是void*类型的指针,一般我们会根据要求将他强制类型转换为int*等等。但是我们对于内存的使用是非常灵活的,我们有时候不需要死板的固定内存,我们需要的是灵活的方法。第二个是free函数,其声明如下。
2024-04-26 18:16:28
378
原创 Ds18B20理解与运用
首先,我们先来判断该数据的正负,我们先将该数据与上0xf800,判断符号位是否为0,若符号位都为0,表示温度为正数,则if通过,进入下面的语句,先将Temp右移4位,舍弃4位小数位,保留整数位,接着将Temp放大十倍,有人会疑惑为什么放大十倍,若我们的数据假设是23.3,这是一个浮点数,不好处理,我们将数据放大10倍以后就是一个整数了,处理起来比较容易。后面再让LSB与上0x0f,取出LSB的低4位,再乘以0.0625(分辨率)再乘以10,最终加上已经是整数的Temp,就得到了一个要求的小数。
2024-04-04 17:37:55
590
原创 结构体具体知识
通过查询指针的地址,我们可以直接找到另一个结构体,这是一个非常节省空间的方法,very good.并且,对于想要结构体传参,直接传过去一个结构体也是不合理的,太大了。如图所示,我这串代码就是建立了一个student 类型的结构体,并往里面放了3个数据,分别是类型为char的name,int类型的age,int类型的height,并在最后建立了一个student类型的变量a。4.如果结构体中有结构体,那么二次结构体的成员对齐到结构体成员中最大对齐数的整数倍数,二次结构体的大小就是最大对齐数的整数倍。
2024-04-02 16:17:13
447
原创 数据在内存中的存储
那么,关于数据的符号类型,我们分为了有符号数据与无符号数据。在内存中,-1原码是1000 0001,补码是1111 1110,补码是1111 1111,因为b是无符号字符,那么他在看到1111 1111时,他会认为这是一个所有位数都是数据的数字,那么就得到了255.第二个是一个有符号字符a被赋给了-128的数据,但是由于这是一个char类型数据,所以在打印的时候会发生整形提升,因为这个数字是负数,所以发生整形提升的时候填充的是1,然后填充了原本属于-128的数据,在计算以后,答案就是4294967168。
2024-04-01 21:46:32
324
原创 字符,字符串函数,与内存库函数的使用以及模拟
该函数进行的是两个字符串的大小比较,他会同时从两个字符串的初始位置开始,一个一个的往后进行比较,字符串的比较依托的是ascii值,如果字符串1查询到的ascii值大于字符串2,则返回1,若小于,则返回-1,如果直到最后的\0两者都相等,则返回0.以下是模拟实现。他的本意是若找到另一个字符串,则返回在第一个字符串中字符串2第一次出现的地址。该函数是用于在字符串中找到第一个分割符并进行分割,并用\0结尾,返回该地方的指针,一般来说strtok函数作用于临时拷贝的字符串,因为strtok会改变被操作的字符串。
2024-03-27 20:12:01
803
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅