- 博客(57)
- 收藏
- 关注
原创 C++继承 -- 讲解超详细(上)
这里person是基类(也称作父类),student和teacher都是派生类(也称作子类)。这些方式有什么区别?派生类继承方式public继承protetced继承private继承基类的public成员派生类的public成员派生类的protect成员派生类的private成员基类的protect成员派生类的protect成员派生类的protect成员派生类的private成员基类的private成员派生类的private成员派生类的private成员。
2026-04-21 17:16:25
384
原创 STL容器priority_queue -- 讲解超详细
本文摘要: C++ STL中的priority_queue是一种容器适配器,基于堆结构实现(默认大顶堆),支持高效插入/删除操作。底层容器需支持随机访问(如vector或deque)。关键接口包括top()、push()、pop()等。通过模拟实现发现,原生代码无法同时支持大堆和小堆,需引入仿函数(重载operator()的类)来灵活定制比较逻辑。仿函数相比普通函数具有内联优化和多态优势,能处理指针等特殊类型的比较。完整实现需在模板参数中加入比较器(如Less/Greater),通过调整堆算法实现动态优先级
2026-03-20 11:02:45
361
原创 STL容器stack和queue的模拟实现
关于deque将从如下几个方面介绍:1)什么是deque?2)为什么STL容器要选择deque来作为容器适配器?3)deque的基本结构是怎样的?4)deque实现的大致原理?5)deque有什么缺陷吗?1)什么是deque?deque:是一个双端队列,是一种可以在队列头部和尾部都高效进行插入、删除操作的数据结构。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组。(具体还需结合底层结构理解)
2026-02-11 00:37:39
622
原创 STL容器stack和queue -- 讲解超详细
容器适配器是STL中的转换器,通过封装底层容器接口实现代码复用。stack和queue作为适配器,可以选择vector或list作为底层存储,只保留特定操作(如stack的push_back/pop_back,queue的push_back/pop_front)。
2026-02-10 22:37:31
549
原创 STL容器list的模拟实现
1)list是双向链表,存储的数据不单单是数据,还有指针,封装为结构体便于更好的管理(即结点的核心任务是存储数据 + 维护前后指针)。2)list容器的职责是管理结点集合,提供插入、删除、遍历等对外接口,修改结点结构不会影响容器的业务逻辑,反之亦然,这符合面向对象的设计原则,同时也跟C++库里面的设计保持一致!3)设计为模板,是为了适配任何数据类型,更加方便操作。
2026-02-06 23:15:18
842
原创 STL中容器list -- 讲解超详细
(1)list是 C++ 标准库<list>头文件中的双向链表容器,属于STL序列式容器的一种,用于存储有序的元素集合。(2)list的底层:是一个双向循环双链表,每一个结点都包含数据,前向指针,后向指针;结点在内存中非连续存储(元素节点分散在内存中,通过指针连接,无需预留连续内存空间),所以增删元素仅需修改指针指向,无需移动其他元素(可频繁的插入/删除元素)(3)list支持双向迭代,同时由于结点是动态申请和释放,不存在容量和大小的区别,也就没有reserve()和capacity()成员函数。
2026-02-01 23:54:06
699
原创 STL中容器vector -- 讲解超详细
在上一节已经学习了string的接口和模拟实现,vector的接口和string大差不差,重点是vector的模拟实现和迭代器失效的问题!!!
2025-11-09 20:57:17
1075
原创 STL容器string的模拟实现
在上一节已经学习了string的一些常用的接口,那这些接口如何实现?那下面就来学习string接口的模拟实现过程!!!如果_str初始化为nullptr,那么程序会崩溃!!为什么会崩溃呢?这里同样的,在开辟空间的时候要预留一个空间给'\0'!!如果不给预留空间,而是用nullptr初始化,这里的strlen(s)就会对空指针解引用,导致程序崩溃!
2025-10-29 17:09:20
1158
原创 STL中容器string -- 讲解超详细
在学习string之前,我们得先了解STL容器,什么是STL容器呢?STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的。
2025-10-19 19:38:38
2432
原创 C++模板初阶 -- 讲解超详细
基于此函数距离编译还差一个实例化<T>,这个T只有.cpp知道,但是每个文件又是单向操作,我在编译的时候是不知道的,但是编译时头文件:就是告诉编译器,你不用管待会儿给你,你先运行,但是链接的时候我去找编译器要,欸没有,这不是欺诈吗?简单理解:就相当一个模具,我们需要什么类型的物品就使用什么模具,在程序中就是当我们要传不同的参数,编译器可以套模板自动完成加减。模板是泛型编程的基础。这里提一下:普通函数声明定义分离是可以的,但是模板函数和类是不支持分别定义在.h和.cpp文件的,会出现链接错误,至于为什么?
2025-10-10 16:47:08
1009
2
原创 C++内存管理 -- 讲解超详细
在C语言中,我们已经初步学习过内存管理,即内存里面分为栈区,堆区,静态区和常量区。今天就来进一步学习。前情回顾:先来看一道题(1)栈又叫堆栈--非静态局部变量/函数参数/返回值等等,。(2)内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。(3)堆用于程序运行时动态内存分配,堆是可以上增长的。(4)数据段(静态区)--存储全局数据和静态数据。(5)代码段(chang'liu'a)--可执行的代码/只读常量。
2025-09-29 19:32:37
1034
原创 类和对象(下)-- 讲解超详细
(虽然在主函数里面我们已经实例化一份d1,但是并没有对成员变量初始化,如果不写默认构造,成员变量可能会是随机值,当然不同的编译器结果不同)
2025-09-19 21:05:27
640
原创 用C++实现日期类
在上学的时候,总是在计算还有多少天放假;在上班的时候,总是在计算还有多久发工资?我们一般通过日历得到结果,那自己能不能实现一些基本的功能呢?答案是可以的!
2025-09-04 20:40:21
398
原创 C++类和对象(中)- 默认成员函数
无参构造函数,全缺省构造函数,不显示写编译器自动生成的构造函数都是默认构造。但是需要注意的是上面的三个默认构造不能同时出现,只能出现一个。比如无参构造函数和全缺省构造函数,在上一节说明了,同时存在编译器不知道调用谁。不显示和前两个不能同时存在应该能理解。
2025-09-02 21:07:14
945
原创 C++类和对象(上)
(1)class为定义类的关键字,date为类的名字,{}中为类的主体(注意类定义结束时后面分号不能省略)类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。//int day;//一般这样写int _year;int _month;int _day;
2025-08-24 16:32:22
961
原创 C++初识(下)中引用,内联和nullptr的概念(建议收藏)
在上一节我们已经接触了C++的一些基本语法,这一次我们介绍一些新内容。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间, 它和它引用的变量共用同一块内存空间。比如:水壶传中李逵,宋江叫"铁牛",江湖上人称"黑旋风";林冲,外号豹子头;在之前我们学指针的时候对于&(取地址)操作符肯定不陌生,在这里我们又会使用。使用方法:类型& 引用别名=引用对象;这里通过地址我们可以发现,a和ra,b和rb的地址是一样的。画个图注意:引用类型和实体必须是同一类型!!!(1)引用在定义时必
2025-08-16 00:19:10
937
原创 C++入门(上) -- 讲解超详细
1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.命名空间本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。//命名空间的定义int main()//这里默认访问的是全局rand函数指针//这里访问的是命名空间域里面的randreturn 0;
2025-08-08 22:25:51
922
原创 初识排序(下)-- 讲解超详细
在上一节中介绍了排序的相关方法,接下来继续讲解快排和其他排序方法。上一节讲述了交换排序中的冒泡排序,现在来介绍交换排序的快排方法。
2025-08-08 15:18:12
901
原创 排序初识(上)-- 讲解超详细
发现没有,当我数组越接近有序的时候我直接插入效率就更高了!!!所以希尔排序再其基础上改进,它的效率肯定是要高于直接插入排序的!!
2025-07-24 15:53:02
1269
1
原创 牛客刷题 -- 二叉树遍历
这道题的大致意思是:用户自己输入字符串,我们根据输入的字符串按照遍历方式(前/中/后序遍历)创建一棵二叉树,和根据二叉树创建数组相反,是不是感觉挺有意思?1.创建二叉树结点,判断arr[i] == '#'?不成立,存储到二叉树,继续遍历。特别注意: 不要盲目的调用不返回创建的结点!2.中序遍历打印显示。
2025-07-23 14:37:30
456
原创 力扣刷题 -- 144.二叉树的前序遍历
1.我们既然要用数组去保存二叉树的内容,是不是得先有一个数组?所以需要动态开辟一块空间给数组。2.那么数组大小如何确定?我们是不是得遍历二叉树,根据得到得二叉树结点的个数创建数组!同理中序遍历和后续遍历也是一样的道理,只需要改变遍历方式即可。3.这里我们需要用前序遍历的方式遍历,即根左右。这里的前序遍历,题目给了我们一棵二叉树,我们的任务是用数组保存二叉树的内容!
2025-07-23 13:08:05
372
原创 力扣刷题 -- 572.另一颗树的子树
思路大概是这么个样子,那感觉和上次说的判断相同的树是不是类似?只不过这里我每一个分叉就要和subRoot进行比较!那就是说既然要找分叉,那岂不是我的每一棵子树都要和subRoot进行比较,看是否完全相同?分析题目可以知道,另一颗子树就是原树木的一支分叉,就是包含关系。情况2:有一颗树为空树,不满足要求。情况1:两棵树都为空树,满足要求。话不多说,我们画图分析!
2025-07-22 22:07:58
603
原创 力扣刷题 -- 101.对称二叉树
对称二叉树,说白了就是镜像对称,要解决这道题,我们需要分析镜像的特点。再进一步看,欸发现 2 结点的左孩子和右侧 2 结点的右孩子是相同的;结点的左孩子的值和结点右孩子的值一样,结点右孩子和结点左孩子一样。左侧 2 结点的右孩子和 右侧 2 结点的左孩子相同;就以示例1来说:根结点的左孩子和右孩子的值相同;这里我们要注意传参,如果只有根结点那还挺好处理,欸,有人问为什么要传2个参数?千万不能漏掉这两种情况!欸,是不是我只要满足。就可以解决这道题呢?
2025-07-22 21:34:51
353
原创 堆的应用(讲解超详细)
说起排序,我们并不陌生,前面的冒泡排序就是其中之一,现在介绍一种新的排序方法 -- 堆排序。前面我们刚了解了堆排序可以得到最大/小值,那么这里我们能不能用堆排序来解决问题呢?第1步:建立有效的堆(什么叫有效的堆?-- 就是上节我们说的大根堆/小根堆);我们要找到前K个最大值,那是不是跟1个值比较,只要比它大,我就存放数据。说白了就是让我们找出前K个最大值/最小值。这里存放数据我们又得需要一个数组了。第2步:进行升序和降序操作。
2025-07-10 22:39:40
402
原创 快速通关二叉树秘籍(上)
(2)除根结点之外,其余的结点被分成互不相交的结点的集合,每个集合我们又可以看作一个子树(子树的结构和树的结构是类似的),这些子树的根节点有且只有一个前驱结点,可以有0个或者多个枝杈。因此在二叉树中常常使用递归来解决问题。注意:树形结构:每棵子树不能有交集非树形结构如图所示,子树存在相交的情况,都是非树形结构总结:(1)子树不相交;(2)每棵子树有且仅有一个根节点;(3)一个N个结点的树有N-1条边。
2025-07-03 00:30:47
945
原创 力扣刷题 -- 232. 用栈实现队列
2)插入数据往PushST插,判断PopST是否为空,如果为空直接往PopST出数据;如PopST不为空,就先把PopST的数据先出栈;1)创建两个栈空间,PushST,PopST;3)PopST全部出队列。
2025-06-03 21:28:45
283
原创 力扣刷题 -- 225. 用队列实现栈
2)将非空队列的前size-1个元素挪到空队列;3)将非空队列的队尾元素出队列,并返回栈顶元素。思路:1)往非空队列里插入数据(入队列);
2025-06-03 21:06:02
418
原创 力扣刷题 -- 20.有效的括号
第二步:观察示例,我们可以发现示例三是回文结构,示例四又是对称结构,看到这里还是没有思路。第一步:先看题目理解大意。题目中说左括号必须遇到。即()配对,{ }配对,[ ]配对。欸,这个思路好像可以!
2025-05-28 11:57:43
259
原创 快速通关栈和队列秘籍
栈的底层可以是数组,也可以是链表。不过相对于链表,数组的时间和空间复杂度都更低,所以一般使用数组。队列可以看作是栈的孪生兄弟,为什么这么说呢?:只允许一端进行插入数据,另一端只允许进行删除数据的特殊的线性表,具有。的原则(通俗理解就是后来者居上),我们把输入和删除的一端称为。栈是一种特殊的线性表,不过他很独特,他只能从。同样的道理,队列的实现的底层是什么呢?:删除数据叫出栈,删除数据也在栈顶。:插入数据叫入栈,插入数据在栈顶。出队列:删除数据的一端称为队头;Stack.c 文件。Queue.c 文件。
2025-05-28 11:28:15
515
原创 快速通关双链表秘籍
注意这里的带头链表中的head中是无效数据,只是占位置,也就是哨兵位!第一个有效节点是d1!在前面我们已经讲过单链表,但是链表只有这一种形式吗?虽然有这么多的链表的结构,但是我们实际中最常用法还是两种结构:单链表和双向带头循环链表。双链表全称:双向带头循环链表。
2025-05-16 12:03:32
326
原创 快速通关单链表秘籍
我们都看过火车吧,我们看到的火车是有一节一节的车厢相连接,这个链接的纽带我们可以抽象的看作指针链接,我们通过车厢链接去找到下一节车厢,在单链表中我们可以通过指针链接去找到下一个节点。同理我们也可以去修改对应的地址,去访问不同的结点空间。根据这幅图,我们plist就是头结点,通过plist里的存放的地址我们可以找到下一结点的位置,要找到下一节点,我们就必须的有它对应的地址,因此。:结点都是独立申请的(即需要插入数据时才去申请一块结点的空间),我们需要通过指针变量保存下一结点的地址才能找到下一个结点。
2025-05-16 00:19:17
1071
原创 快速掌握顺序表的秘籍
在前面我们已经学了C语言,C语言之后的又一大关卡就是数据结构。今天我们需要了解数据结构第一重大板块:顺序表。再这之前我们先来介绍一个线性表!!
2025-05-03 13:43:08
869
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅