自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 C++模板进阶 -- 讲解超详细

什么是非类型形参呢?

2026-04-04 14:18:04 403

原创 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的模拟实现

vector的模拟实现 -- 超级详细

2026-01-30 22:47:06 588

原创 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

原创 双指针系列3

【代码】双指针系列3。

2025-10-29 00:03:40 224 2

原创 双指针系列2

【代码】双指针系列2。

2025-10-28 23:55:55 194

原创 双指针系列1 - 283. 移动零 和 1089. 复写零

【代码】双指针系列1 - 283. 移动零 和 1089. 复写零。

2025-10-19 19:59:50 230

原创 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

原创 力扣刷题 -- 100.相同的树

注意:有几种特殊情况。

2025-07-21 22:00:23 338

原创 力扣刷题 -- 965.单值二叉树

【代码】力扣刷题 -- 965.单值二叉树。

2025-07-21 21:39:52 185

原创 快速通关二叉树秘籍(下)

在前面我们讲了底层是数组的二叉树,今天讲以链表为底层的链式二叉树。

2025-07-15 20:11:05 675

原创 堆的应用(讲解超详细)

说起排序,我们并不陌生,前面的冒泡排序就是其中之一,现在介绍一种新的排序方法 -- 堆排序。前面我们刚了解了堆排序可以得到最大/小值,那么这里我们能不能用堆排序来解决问题呢?第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关注的人

提示
确定要删除当前文章?
取消 删除