- 博客(37)
- 收藏
- 关注
原创 list的模拟实现和学习
说白了就是带头循环双向循环链表stl 的两大组件就是容器和算法 ,他们两个之间是通过迭代器进行联系的这三种算法函数迭代器的种类 性质(容器底层结构决定)单项:++ forward_list /哈希(unordered_xxx)双向:++ / -- list/map/set随机:++/--/+/- vector /string/deque。
2025-03-23 23:04:51
491
原创 STL 简介+string
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。
2025-03-10 17:55:13
1061
原创 模板-初阶
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>(也就是必须显式实例化),然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
2025-03-01 13:10:42
287
原创 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
692
1
原创 类与对象(中)
我么可以看见 ,虽然默认会生成构造函数 但是这也是祖师爷留下的一个坑,就是不会去初始化(有函数)c++类型分为1内置类型/基本类型 ----语言本身定义的基础类型 int/char.double 指针等等2自定义类型,用struct/class等定义的类型注意上面就是在定义d1的时候传的参数!!!但是什么时候要自己写构造函数呢?(最终还是要自己写构造函数--->对自定义类型)1内置类型成员完成值拷贝/浅拷贝2自定义类型会调用他的拷贝构造问题 1 析构两次,报错 2一个修改会影响另一个。
2025-01-15 08:28:24
1639
原创 c++入门 LESSON1
但当n时动态对象时 结果是不确定的(n空间被销毁)(如果栈帧没有被清理 结果侥幸正确 但要是被清理 结果就是随机值)展开相当于暴露到全局 ---即若定义了全局变量 同时展开了namespace里面的同名变量会报错。1 做参数 (1输出型参数如 Swap函数)(2提高效率---》大对象/深拷贝)即 函数名相同 参数相同 返回值不相同(就是函数的参数) 不构成重载!在取别名的时候才会有权限的概念(函数返回的时候也会出现临时变量)但是指定展开麻烦 但是展开又会有冲突(即不要轻易的展开)
2025-01-01 16:35:49
444
原创 c++入门 LESSON0
2 整体而言 Java方向的学习成本和c++学习成本差不多。c++ 学完后就不会再想用 c写代码了。c++确实就是最难学的语言之一。1java的语法学习比c++简单。要做笔记(知识点很多)4. 如何学习C++
2024-12-29 22:31:27
320
原创 数据结构:排序
因为外面一层为logN 经过预排序后 里面的循环分两端(gap 很大 和gap很小)但都是N。两个有序区间归并的思路:依次比较,小的尾插到新空间(思路和后序遍历差不多)与gap有关 N*logN (底数就是gap)----这个是可以近似看为。比如间隔为3 的分为一组 一共分了三次 (能使大的更快的跳到后面)选出一个基准值 key 把他放到正确的位置(最终排好序要蹲的位置)1:预排序 ---目的是为了使数组接近有序 ————分组排序。插入排序法: 时间复杂度为O(N)~O(N^2)
2024-12-28 21:26:07
468
原创 二叉树 概念和结构
DFS :深度优先遍历(一般用递归) :走到无路可走就往回退(最经典为前序遍历)(三种序列都是深度优先遍历 但是要看有没有严格要求什么时候访问节点)BFS:广度优先遍历(一般用队列) :对于二叉树就是层序遍历(针对二叉树)向上调整建堆:从上向下看,调整次数少,节点个数少,到最后两个都多,在堆中插入元素时要操作的是数组 但在逻辑上看是操作的是二叉树。目前学的二叉树(普通)没有作用,用二叉树来存储数据就更高大上嘛?物理结构:实实在在在内存中是如何存储的(就是树下面的数组)4.二叉树链式结构及实现。
2024-12-22 16:01:19
350
原创 数据结构 :栈和队列
数组模拟链表---就是结构数组 一个是data 一个是下一个元素的下标。函数调用 里面 栈 操作系统,内存区域划分。要是用链表(单链表)也可以(此时是头插和头删 尾删不能实现)malloc 堆。局部变量 变量储存 栈 数据结构。是两个学科 不同的名字。
2024-12-16 16:28:25
238
原创 链表的概念和实现
1 存储的数据 2, 指针(指向下一个节点)这个链表不可能为空,插入不需要再判断空指针的情况。在创建带头双向循环链表是要用到初始化函数。尾插时先找到为尾节点,用while循环。哨兵位的next指向第一个元素。顺序表和链表是数据结构的内容。尾的next指向哨兵位的头。物理结构:不一定是线性的。链表是由一个一个节点组成。逻辑结构:一定是线性的。链表也是线性表的一种。
2024-12-11 16:58:38
196
原创 单片机的介绍
模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用。单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制。
2024-12-11 16:58:31
1892
原创 算法的时间复杂度和空间复杂度
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度。因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。大部分的空间复杂度为O(N)或者O(1)
2024-12-01 16:18:01
253
原创 数据结构初阶 LEASSON1
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。(在内存当中管理数据)剑指offer等学完了数据结构就可刷题。代码一定要自己能写出来就可以了。c++初阶后就可以刷力扣。
2024-11-30 14:49:00
197
原创 顺序表专题
线性表是⼀种在实际中⼴泛使 ⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。, 线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表指的是具有部分相同特性的⼀类数据结构的集合 如何理解逻辑结构和物理结构?在增容时一般是成倍数增加 两倍或三倍(频繁的增容就会造成程序的运行效率降低)顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝。数据结构: 是计算机储存,组织是数据的方式。1,顺序表的概念及结构。
2024-11-27 15:59:05
143
原创 操作符详解
:两数的某二进制位都为1 那么就为1, 其中只要有一个不为1, 整体就为0 6&-7==0。移位操作符(移动的时二进制位)(移动的是补码)(浮点数不能移位)(移动的位数是正数)右移分为逻辑右移和算数右移(具体哪一种取决于编译器,但通常位算术右移)~:(前三个都是双目预算符, 这个是单目)就是把二进制位全部取反。|:同理只要其中有一个位1,那么就为1,两个数全为0, 才为0。算数右移左边用原符号位填充, 右边丢弃。^:对应的二进制位相同为0,相异为1。逻辑右移就是左边补0,右边丢弃。
2024-11-26 11:38:35
197
原创 扫雷游戏的实践
如果棋盘的大小为9*9,数组的大小就为11*11(大一圈 防止了越界)(创建时使用字符数组就可以 因为这样不用写两套数组)排查雷1:输入一个坐标 2:判断是否越界3:判断是否是雷, 若是雷就炸死,不是雷就显示周围雷的个数。雷的信息用二维数组来存放 用两个数组 一个放雷 一个放排查出的信息 都用字符数组。排查雷 这个位置是雷就炸死,游戏结束,不是的话就告诉这个地方周围有几个雷。’1‘-’0‘=1 就为 49-48。test.c-----扫雷游戏的测试。把所有位置都找到 游戏结束。
2024-11-23 14:55:56
218
原创 预处理详解
2. 更为重要的是函数的参数必须声明为特定的类型。宏的参数是类型⽆关 的。提⽰: 所以⽤于对数值表达式进⾏求值的宏定义都应该⽤这种⽅式加上括号,避免在使⽤宏时由于参数中的 操作符或邻近操作符之间不可预料的相互作⽤。的时候,如果参数带有副作⽤,那么你在使⽤这个宏的时候就可 能出现危险,导致不可预测的后果。#define机制包括了⼀个规定,允许把参数替换到⽂本中,这种实现通常称为宏(macro)或定义宏 (define macro)。1. 每次使⽤宏的时候,⼀份宏定义的代码将插⼊到程序中。
2024-11-17 22:17:02
406
原创 文件操作
ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。缓 冲区的⼤⼩根据C编译系统决定的。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。
2024-11-15 22:18:58
1586
原创 动态内存管理
包含柔性数组成员的结构⽤malloc ()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤。所以如果我们对申请的内存空间的内容要求初始化,那么可以很⽅便的使⽤calloc函数来完成任务。C99 中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。返回栈空间地址的问题(即用malloc开辟空间返回就可以)sizeof 返回的这种结构⼤⼩不包括柔性数组的内存。**malloc申请的空间和数组的空间有什么区别呢?情况2 :2会将旧的数据拷贝到新的空间。1,动态内存的大小是可以调整的。
2024-11-11 11:45:07
253
原创 自定义类型——枚举和联合
联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合 ⾄少得有能⼒保存最⼤的那个成员)。当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。联合的⼤⼩⾄少是最⼤成员的⼤⼩。(不一定位最大成员的大小)*空间是重复的即不能同时使用两个成员,联合体在一定程度上可以节省空间。写代码多了就会感悟到枚举的作用。结构体的关键字:struct。联合体的关键字:union。枚举的关键字:enum。枚举关键字 enum。
2024-11-08 21:55:22
176
原创 自定义类型:结构体
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃 剩余的位还是利⽤,这是不确定的。总结(优点): 跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。
2024-11-06 23:14:54
767
原创 数据在内存中的存储
存储规律 同理short也可以推 signed int 和unsigned int 无太大用重要的是如何看待(就是打印时用的是%d %u)c语言中 char的符号不确定 大部分为signed char %d 打印有符号数 %u打印无符号数 而且打印时会发生整型提升。例子 10进制5.5 2进制 5.5==101.1 要看每一位的权重 S = 0 M = 1.011 E=2;关键为*(char*)&a的值 (char)a是不对的 因为拿的字节不一定为最低位的。1. 整数在内存中的存储。
2024-11-04 22:33:24
316
原创 c语言内存函数
但用vs库里面memcpy能实现这种重叠(相当于vs里面memcpy的功能实现的跟memove一样)这是一种特里。例如把arr1的内容拷贝到arr1中(可能会出现重叠)memcpy(arr1+2,arr1,20);注意对于重叠的内存,交给memmove来处理(memcpy函数不负责重叠内存的拷贝)1. memcpy使⽤和模拟实现--内存拷贝 任何类型都可以拷贝。2. memmove使⽤和模拟实现--内存移动。3. memset函数的使⽤--内存设置。mem-memory--记忆--内存。
2024-11-02 22:50:23
201
原创 字符函数和字符串函数
注意 0--数字0 '0'--ASCII是48 ‘\0’----\ddd ddd表示1~3个8进制数 \0----ASCII值为0。C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。为什莫strcpy函数的返回值为char* 为了实现链式访问 返回的是目标空间的起始地址修改后为。若arr2 放arr1从拷贝的字符串时 若给的个数大于arr1中的字符个数时不够的补\0。strerror---将错误码对应的错误信息的字符串的起始地址返回(获得字符串)
2024-11-02 21:05:42
354
原创 深入理解指针4
strlen统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间⼤⼩的,单位是 字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。且sizeof是操作符而不是函数 strlen是函数,求字符串的长度。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。
2024-10-27 16:54:22
186
原创 深入理解指针4
回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。两个名字比较大小(字符串)用strcmp来比较(比较的不是长度 而是对应位置上字符的大小)4 comper 函数的地址(这个函数是用来比较两个元素)-> 结构体指针->成员名(不用再用解引用). 结构体变量.成员名。
2024-10-25 20:25:57
293
原创 辅元连读和叠音失爆同化
如 take it stand up hook up not at all pick it up find out。如 big big wold black board sit down keep quiet。1前一个单词以辅音结尾 后一个单词以元音开头 那么把这两个字母连成一个音。爆破音有/p/ /b/ /t/ /d/ /k/ /g/前一个辅音将结尾,后一个相同辅音开头(读音相同)前一个末尾和后一个开头都是爆破音。
2024-10-23 12:15:57
214
原创 深入理解指针3
但是⽤相同的常量字符串去初始 化不同的数组的时候就会开辟出不同的内存块。char* p = 'abcdef' 这里的赋值是将字符串首元素的地址赋值给p(常量字符串地址不能被改变)且pf == Add,即Add(3,4)=pf(3, 4)==(*pf)(4,5)其实就是 数组指针--指向数组的指针--数组指针变量中存放数组的地址。⼆维数组传参本质上也是传递了地址,传递的是第⼀ ⾏这个⼀维数组的地址。1 是数组 是存放指针指针的数组 char* arr[5]即存放函数的地址(函数也有地址)
2024-10-13 12:03:18
264
原创 深入理解指针2
数组名是数组⾸元素的地址;那么在数组传参 的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址 (用指针变量来接受也i可以如int *arr 或者int arr[])指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?除此之外其他都是首元素的地址 数组的地址&数组名 &数组名+1指跳过整个数组。总结:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。1:sizeof(数组名)这里数组名表示的是整个数组的大小。2:&数组名:也是表示的是整个数组的地址。
2024-10-08 22:51:14
150
原创 指针初学第一节
指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使⽤这个指针访问空间的 时候,我们可以把该指针置为NULL。指针初始化 如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL. NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。答案是:指针变量中。• 注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。
2024-09-27 21:43:39
359
原创 新手一枚,
我是一个刚刚学习c语言的小萌新,我学习编程的目标是与我的大学专业相结合,能够提升自己的实力,既在学校学习编程,也在网上找视频学习,每天要花两个小时以上学习编程,目标IT公司还没有,以后会有。
2024-09-09 12:15:58
115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人