- 博客(49)
- 收藏
- 关注
原创 STL中容器vector -- 讲解超详细
在上一节已经学习了string的接口和模拟实现,vector的接口和string大差不差,重点是vector的模拟实现和迭代器失效的问题!!!
2025-11-09 20:57:17
1025
原创 STL容器string的模拟实现
在上一节已经学习了string的一些常用的接口,那这些接口如何实现?那下面就来学习string接口的模拟实现过程!!!如果_str初始化为nullptr,那么程序会崩溃!!为什么会崩溃呢?这里同样的,在开辟空间的时候要预留一个空间给'\0'!!如果不给预留空间,而是用nullptr初始化,这里的strlen(s)就会对空指针解引用,导致程序崩溃!
2025-10-29 17:09:20
1123
原创 STL中容器string -- 讲解超详细
在学习string之前,我们得先了解STL容器,什么是STL容器呢?STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的。
2025-10-19 19:38:38
2381
原创 C++模板初阶 -- 讲解超详细
基于此函数距离编译还差一个实例化<T>,这个T只有.cpp知道,但是每个文件又是单向操作,我在编译的时候是不知道的,但是编译时头文件:就是告诉编译器,你不用管待会儿给你,你先运行,但是链接的时候我去找编译器要,欸没有,这不是欺诈吗?简单理解:就相当一个模具,我们需要什么类型的物品就使用什么模具,在程序中就是当我们要传不同的参数,编译器可以套模板自动完成加减。模板是泛型编程的基础。这里提一下:普通函数声明定义分离是可以的,但是模板函数和类是不支持分别定义在.h和.cpp文件的,会出现链接错误,至于为什么?
2025-10-10 16:47:08
963
2
原创 C++内存管理 -- 讲解超详细
在C语言中,我们已经初步学习过内存管理,即内存里面分为栈区,堆区,静态区和常量区。今天就来进一步学习。前情回顾:先来看一道题(1)栈又叫堆栈--非静态局部变量/函数参数/返回值等等,。(2)内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。(3)堆用于程序运行时动态内存分配,堆是可以上增长的。(4)数据段(静态区)--存储全局数据和静态数据。(5)代码段(chang'liu'a)--可执行的代码/只读常量。
2025-09-29 19:32:37
1012
原创 类和对象(下)-- 讲解超详细
(虽然在主函数里面我们已经实例化一份d1,但是并没有对成员变量初始化,如果不写默认构造,成员变量可能会是随机值,当然不同的编译器结果不同)
2025-09-19 21:05:27
607
原创 用C++实现日期类
在上学的时候,总是在计算还有多少天放假;在上班的时候,总是在计算还有多久发工资?我们一般通过日历得到结果,那自己能不能实现一些基本的功能呢?答案是可以的!
2025-09-04 20:40:21
371
原创 C++类和对象(中)- 默认成员函数
无参构造函数,全缺省构造函数,不显示写编译器自动生成的构造函数都是默认构造。但是需要注意的是上面的三个默认构造不能同时出现,只能出现一个。比如无参构造函数和全缺省构造函数,在上一节说明了,同时存在编译器不知道调用谁。不显示和前两个不能同时存在应该能理解。
2025-09-02 21:07:14
916
原创 C++类和对象(上)
(1)class为定义类的关键字,date为类的名字,{}中为类的主体(注意类定义结束时后面分号不能省略)类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。//int day;//一般这样写int _year;int _month;int _day;
2025-08-24 16:32:22
933
原创 C++初识(下)中引用,内联和nullptr的概念(建议收藏)
在上一节我们已经接触了C++的一些基本语法,这一次我们介绍一些新内容。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间, 它和它引用的变量共用同一块内存空间。比如:水壶传中李逵,宋江叫"铁牛",江湖上人称"黑旋风";林冲,外号豹子头;在之前我们学指针的时候对于&(取地址)操作符肯定不陌生,在这里我们又会使用。使用方法:类型& 引用别名=引用对象;这里通过地址我们可以发现,a和ra,b和rb的地址是一样的。画个图注意:引用类型和实体必须是同一类型!!!(1)引用在定义时必
2025-08-16 00:19:10
861
原创 C++入门(上) -- 讲解超详细
1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.命名空间本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。//命名空间的定义int main()//这里默认访问的是全局rand函数指针//这里访问的是命名空间域里面的randreturn 0;
2025-08-08 22:25:51
862
原创 初识排序(下)-- 讲解超详细
在上一节中介绍了排序的相关方法,接下来继续讲解快排和其他排序方法。上一节讲述了交换排序中的冒泡排序,现在来介绍交换排序的快排方法。
2025-08-08 15:18:12
867
原创 排序初识(上)-- 讲解超详细
发现没有,当我数组越接近有序的时候我直接插入效率就更高了!!!所以希尔排序再其基础上改进,它的效率肯定是要高于直接插入排序的!!
2025-07-24 15:53:02
1200
1
原创 牛客刷题 -- 二叉树遍历
这道题的大致意思是:用户自己输入字符串,我们根据输入的字符串按照遍历方式(前/中/后序遍历)创建一棵二叉树,和根据二叉树创建数组相反,是不是感觉挺有意思?1.创建二叉树结点,判断arr[i] == '#'?不成立,存储到二叉树,继续遍历。特别注意: 不要盲目的调用不返回创建的结点!2.中序遍历打印显示。
2025-07-23 14:37:30
432
原创 力扣刷题 -- 144.二叉树的前序遍历
1.我们既然要用数组去保存二叉树的内容,是不是得先有一个数组?所以需要动态开辟一块空间给数组。2.那么数组大小如何确定?我们是不是得遍历二叉树,根据得到得二叉树结点的个数创建数组!同理中序遍历和后续遍历也是一样的道理,只需要改变遍历方式即可。3.这里我们需要用前序遍历的方式遍历,即根左右。这里的前序遍历,题目给了我们一棵二叉树,我们的任务是用数组保存二叉树的内容!
2025-07-23 13:08:05
330
原创 力扣刷题 -- 572.另一颗树的子树
思路大概是这么个样子,那感觉和上次说的判断相同的树是不是类似?只不过这里我每一个分叉就要和subRoot进行比较!那就是说既然要找分叉,那岂不是我的每一棵子树都要和subRoot进行比较,看是否完全相同?分析题目可以知道,另一颗子树就是原树木的一支分叉,就是包含关系。情况2:有一颗树为空树,不满足要求。情况1:两棵树都为空树,满足要求。话不多说,我们画图分析!
2025-07-22 22:07:58
579
原创 力扣刷题 -- 101.对称二叉树
对称二叉树,说白了就是镜像对称,要解决这道题,我们需要分析镜像的特点。再进一步看,欸发现 2 结点的左孩子和右侧 2 结点的右孩子是相同的;结点的左孩子的值和结点右孩子的值一样,结点右孩子和结点左孩子一样。左侧 2 结点的右孩子和 右侧 2 结点的左孩子相同;就以示例1来说:根结点的左孩子和右孩子的值相同;这里我们要注意传参,如果只有根结点那还挺好处理,欸,有人问为什么要传2个参数?千万不能漏掉这两种情况!欸,是不是我只要满足。就可以解决这道题呢?
2025-07-22 21:34:51
326
原创 堆的应用(讲解超详细)
说起排序,我们并不陌生,前面的冒泡排序就是其中之一,现在介绍一种新的排序方法 -- 堆排序。前面我们刚了解了堆排序可以得到最大/小值,那么这里我们能不能用堆排序来解决问题呢?第1步:建立有效的堆(什么叫有效的堆?-- 就是上节我们说的大根堆/小根堆);我们要找到前K个最大值,那是不是跟1个值比较,只要比它大,我就存放数据。说白了就是让我们找出前K个最大值/最小值。这里存放数据我们又得需要一个数组了。第2步:进行升序和降序操作。
2025-07-10 22:39:40
360
原创 快速通关二叉树秘籍(上)
(2)除根结点之外,其余的结点被分成互不相交的结点的集合,每个集合我们又可以看作一个子树(子树的结构和树的结构是类似的),这些子树的根节点有且只有一个前驱结点,可以有0个或者多个枝杈。因此在二叉树中常常使用递归来解决问题。注意:树形结构:每棵子树不能有交集非树形结构如图所示,子树存在相交的情况,都是非树形结构总结:(1)子树不相交;(2)每棵子树有且仅有一个根节点;(3)一个N个结点的树有N-1条边。
2025-07-03 00:30:47
891
原创 力扣刷题 -- 232. 用栈实现队列
2)插入数据往PushST插,判断PopST是否为空,如果为空直接往PopST出数据;如PopST不为空,就先把PopST的数据先出栈;1)创建两个栈空间,PushST,PopST;3)PopST全部出队列。
2025-06-03 21:28:45
251
原创 力扣刷题 -- 225. 用队列实现栈
2)将非空队列的前size-1个元素挪到空队列;3)将非空队列的队尾元素出队列,并返回栈顶元素。思路:1)往非空队列里插入数据(入队列);
2025-06-03 21:06:02
371
原创 力扣刷题 -- 20.有效的括号
第二步:观察示例,我们可以发现示例三是回文结构,示例四又是对称结构,看到这里还是没有思路。第一步:先看题目理解大意。题目中说左括号必须遇到。即()配对,{ }配对,[ ]配对。欸,这个思路好像可以!
2025-05-28 11:57:43
227
原创 快速通关栈和队列秘籍
栈的底层可以是数组,也可以是链表。不过相对于链表,数组的时间和空间复杂度都更低,所以一般使用数组。队列可以看作是栈的孪生兄弟,为什么这么说呢?:只允许一端进行插入数据,另一端只允许进行删除数据的特殊的线性表,具有。的原则(通俗理解就是后来者居上),我们把输入和删除的一端称为。栈是一种特殊的线性表,不过他很独特,他只能从。同样的道理,队列的实现的底层是什么呢?:删除数据叫出栈,删除数据也在栈顶。:插入数据叫入栈,插入数据在栈顶。出队列:删除数据的一端称为队头;Stack.c 文件。Queue.c 文件。
2025-05-28 11:28:15
485
原创 快速通关双链表秘籍
注意这里的带头链表中的head中是无效数据,只是占位置,也就是哨兵位!第一个有效节点是d1!在前面我们已经讲过单链表,但是链表只有这一种形式吗?虽然有这么多的链表的结构,但是我们实际中最常用法还是两种结构:单链表和双向带头循环链表。双链表全称:双向带头循环链表。
2025-05-16 12:03:32
299
原创 快速通关单链表秘籍
我们都看过火车吧,我们看到的火车是有一节一节的车厢相连接,这个链接的纽带我们可以抽象的看作指针链接,我们通过车厢链接去找到下一节车厢,在单链表中我们可以通过指针链接去找到下一个节点。同理我们也可以去修改对应的地址,去访问不同的结点空间。根据这幅图,我们plist就是头结点,通过plist里的存放的地址我们可以找到下一结点的位置,要找到下一节点,我们就必须的有它对应的地址,因此。:结点都是独立申请的(即需要插入数据时才去申请一块结点的空间),我们需要通过指针变量保存下一结点的地址才能找到下一个结点。
2025-05-16 00:19:17
1025
原创 快速掌握顺序表的秘籍
在前面我们已经学了C语言,C语言之后的又一大关卡就是数据结构。今天我们需要了解数据结构第一重大板块:顺序表。再这之前我们先来介绍一个线性表!!
2025-05-03 13:43:08
828
原创 力扣刷题 - 203.移除链表元素
即当newTail!=NULL,因为如果原链表为空链表时,newTail为空指针,空指针是无法解引用的!:在这里我们已经有了一个链表,我们要在链表中去实现删除指定值的节点,返回新的头节点。因此,我们创建一个新链表,新链表的话就得有新的头节点和尾节点!这是就有人问为什么要有尾节点,那肯定是因为我们链表是有始有终的,如果没有尾节点我们就不知道链表末尾的情况。这里注意:我们创建的链表最开始肯定是空链表,但当我们插入一个节点后,就不再是空链表了!创建好之后,我们就开始遍历链表,找不为val的节点,存放到新链表。
2025-04-20 17:59:49
234
原创 力扣刷题 88. 合并两个有序数组
由于题目中已经告诉了这是一个有序数组,所以要将数组合并,我们可以先把nums2数组中的元素尾插到nums1中,再利用排序的方法实现有序。这里我们利用比较简单的冒泡排序:我们一趟一趟的去比较大小,调整数据的位置。当我们去运行代码的时候,系统报错说超出时间限制,这和前面的轮转数组类似,是因为时间复杂度太大(O(n^2)),所以存在更好的解决办法。
2025-04-17 15:56:53
248
原创 力扣刷题 -- 轮转数组
要实现轮转,我们可以先将最后一个元素nums[numSize-1]给拿出来,拿出来之后将数组中的所有数据整体往后移动1位,再把拿出的元素放到数组下标为0的位置,如此重复三次就能实现轮转。这里的方法1报了一个错误:时间超出限制!这是因为什么?这是因为我们的时间复杂度太大。至于到底什么时间复杂度?我会在下一篇会为你解答!这里时间超出限制说明我们的算法还不够最优,所以我们就要去思考第二种解决办法。写到这里我们以及优化了一次代码!那能不能在进一步优化呢?--- 答案当然是可以的。
2025-04-14 17:38:48
351
原创 力扣刷题--移除元素
要实现轮转,我们可以先将最后一个元素nums[numSize-1]给拿出来,拿出来之后将数组中的所有数据整体往后移动1位,再把拿出的元素放到数组下标为0的位置,如此重复三次就能实现轮转。
2025-04-14 17:31:43
286
原创 动态内存管理
在C语言中,我们创建变量需要向内存申请足够的空间来存放我们的数据。int main()//申请空间int a = 10;return 0;但是通过观察你会发现:(1)申请的空间大小都是固定值。(2)声明或者使用的时候必须确定空间大小。这个时候我们就想要一个可以自己定义的可变的空间大小,这就需要动态内存开辟的函数。万一还是有人不明白动态内存的具体含义呢?不要着急,往下看:例子:六年级4班班上总共30张座位,就说明这个班级有30个学生。
2025-03-29 16:21:36
821
原创 文件管理初识(下)
在上篇文章中,我们介绍了什么是文件?文本文件和二进制文件的区别?在文章最后还讲述了三组顺序函数。那么通过这篇文章我们再进一步学习文件管理!精彩内容,不要错过哦~
2025-03-22 21:39:32
326
原创 文件管理初识(上)
硬盘(磁盘)上的文件是文件。我们在代码的过程中,我们写的程序中的数据存储在电脑的内存中,如果程序退出,那么内存会回收所占用的空间,此时数据丢失。但你再次运行程序的时候,我们是看不到上次运行的数据结果。如果要将数据持久化保存,我们就可以创建文件。我们说所得文件一般分为两类:程序文件和数据文件。
2025-03-20 19:12:14
1081
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅