- 博客(38)
- 收藏
- 关注
原创 C++智能指针 —— 朝花与未来邂逅,昔日的誓言永不忘却
1>.什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。2>.内存泄漏的危害:普通程序运⾏⼀会就结束了出现内存泄漏问题也不⼤,进程正常结束,⻚表的映射关系解除,物理内存也可以释放。
2025-03-31 08:00:00
1250
80
原创 C++:异常的深度解析
Hello,大家好,今天这篇博客是我们关于C++语法部分的倒数第二篇博客了,我们大家在公司中完成一部分代码后,就会产生一个问题,就是这个代码的正确性,今天我们就针对这个检测来看一看,这个异常的分析。
2025-03-24 08:00:00
2301
101
原创 C++11 —— 人中龙凤尚且举步维艰,我等鱼目又怎能一生顺遂
Hello,大家好,当我们走到这里时,就说明我们关于C++的大部分知识就已经学的差不多了,接下来,我们来学习一下C++11这个补充知识,这部分知识相对来说其实也是比较重要的,因此,我在这里建议大家这部分内容需要我着重掌握。
2025-03-17 08:00:00
1877
97
原创 封装哈希表实现unordered_map和unordered_set
Hello,大家好,今天的这篇博客我们来讲解一下如何封装哈希表从而实现unordered_map和unordered_set这两个容器,众所周知,这两个容器的底层均是哈希表实现的,但是是怎么实现的呢?我们话不多说,接下来就为大家来讲解这一部分的知识。(下面的内容可能涉及到哈希表相关的知识,链接如下:)
2025-03-10 08:00:00
2591
94
原创 数据结构——哈希表的实现
目录1 哈希概念 1.1 直接定址法 1.2 哈希冲突 1.3 负载因子 1.4 将关键字转成整数 1.5 哈希函数 1.5.1 除法散列法 / 除留余数法 1.5.2 乘法散列法 1.5.3 全域散列法 1.5.4 其他方法 1.6 处理哈希冲突 1.6.1 开放地址法 1.6.1.1 线性探测编辑 1.6.1.2 二次探测 1.6.2 代码实现开放地址法 1.6.2.1 扩容操作 1.6.2.2 Key不能取模的问
2025-03-03 08:00:00
2297
95
原创 unordered_set和unordered_map的使用
1>.unordered_set的声明如下,Key就是unordered_set底层关键字的类型。2>.unordered_set默认要求Key支持转换为整形,如果不支持或者是想按照自己的需求走的,可以自行实现支持将Key转化成整形的仿函数传给第二个模板参数,也就是Hash。3>.unordered_set默认要求Key支持比较相等,如果不支持或想按照自己的要求走的话则可以自行实现支持将Key比较相等的仿函数传给第三个模板参数。
2025-02-24 08:00:00
1603
96
原创 封装红黑树实现map和set
Hello,大家好,前面我们已经学习了红黑树的底层结构,并且也已经知道了map和set的底层结构其实就是封装了一棵红黑树,但是如果大家了解过map和set的实参个数的话,会发现map需要我们传递2个参数,而set只需要我们传递1个参数,说到这里就有同学好奇了,set的实际传递参数的个数和红黑树所需要的参数个数明显不一致,这个要怎么封装呢?接下来,我就来为大家展示一下map和set如何封装红黑树。
2025-02-17 08:00:00
1863
82
原创 数据结构——红黑树的实现
目录1 红黑树的概念 1.1 红黑树的规则 1.2 红黑树是如何确保最长路径不超过最短路径的2倍的? 1.3 红黑树的效率2 红黑树的实现 2.1 红黑树的结构 2.2 红黑树的插入 2.2.1 红黑树插入节点的大概过程 2.2.2 情况1:只变色,不旋转 2.2.3 情况2:单旋+变色 2.2.4 情况3:双旋+变色 2.2.5 红黑树插入的代码实现 2.3 红黑树的查找 2.4 红黑树的验证 2.5 红黑树的删除 2.2 红黑树
2025-02-10 08:00:00
5861
123
原创 数据结构——AVL树的实现
Hello,大家好,这一篇博客我们来讲解一下数据结构中的AVL树这一部分的内容,AVL树属于是数据结构的一部分,顾名思义,AVL树是一棵特殊的搜索二叉树,我们接下来要讲的这篇博客是建立在了解搜索二叉树这个知识点的基础之上的,因此,我在这里建议大家可以先去看看我之前写过的那片有关搜索二叉树内容的博客,为了方便大家寻找,链接就放到下面了:搜索二叉树,效率的进一步upgrate!-优快云博客Hello,大家好,我们关于C++的大部分语法知识就可以宣告结束了,不知道聪明的你有没有掌握扎实呢?
2025-01-20 08:00:00
3807
208
原创 map和set的使用,相信我,超简单的!
class set;//T是关键字类型,用来构造二叉搜索树的时候会用到;Compare是一个仿函数,默认set类的底层的那棵二叉搜索树是左边的关键字永远比根小,右边的关键字永远比根大;Alloc是一个内存池,我们现在不需要看这个参数。2>.set类默认要求T支持小于比较,如果不支持或者作者想按自己的需求走的话我们可以自行实现仿函数传给第二个模板参数。3>.set底层存储数据的内存是从空间配置器中申请的,如果需要我们可以自己实现内存池,传给第三个参数。4>.一般情况下,我们都不需要去传后两个模板参数。
2024-12-23 08:00:00
2842
243
原创 数据结构——搜索二叉树的实现
Hello,大家好,我们关于C++的大部分语法知识就可以宣告结束了,不知道聪明的你有没有掌握扎实呢?好了,不管各位掌握的情况如何,我们从这一篇博客开始就要进入下一个阶段了,这个阶段就是大家期待已久的高阶数据结构的部分,对于数据结构这个 " 东西 " 想必大家对它定是又爱又恨,哈哈哈,但是不要担心,相信大家在看过这一篇博客之后定然会明白的。
2024-12-16 08:00:00
2452
221
原创 C++草原三剑客之一:继承
继承机制是面向对象程序设计使得代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称之为是派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触到的是函数层次的复用,而我们这里的继承是类设计层次的复用,我们接下来通过一段代码来说明一下这个继承知识的意义(原因):(我们这里写一个老师和学生的相关信息及其活动等操作)
2024-12-02 08:00:00
8423
255
原创 函数模板(进阶)
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有的目标文件链接起来形成单一的可执行文件的过程我们将其称为分离编译模式。我们在这里若是想要去了解并且弄明白这里的模板为何不能分离编译的话,我们就要在这里弄明白编译器的处理过程。(在讲解之前,我们先把三个文件中的相关代码写好再开始)//Func.h文件//这里在Func.h这个文件中对函数模板做了一个简单的声明。//Func.cpp文件}//对模板进行定义。//Test.c文件int main()
2024-11-25 08:00:00
2351
266
原创 STL(C++)——stack类和queue类模板
我们接下来的这篇博客所要讲的内容就是我们前面在数据结构部分已经讲过的stack和queue部分的内容,与之不同的是,我们这里来讲讲它的模板,这里模板的底层实现和我们在数据结构中所讲述的知识基本上是如出一辙的,主要还是以使用的讲解为主要讲解部分。我在这里为大家推荐一个英语的相关网站,希望对大家在学习STL时能够有所帮助。
2024-11-18 08:00:00
1799
248
原创 list类,这不是一看就懂吗!
list这个类就是属于STL的一部分,list在这里是一个类类型的模板,简单来说,list就是我们之前所学过的带头双向循环链表这个数据结构。
2024-11-11 08:00:00
1852
244
原创 vector类,so easy!
vector这个类就是属于STL的一部分,vector在这里是一个类类型的模板,简单来说,vector就是我们之前所学过的顺序表这个数据结构。
2024-11-04 08:00:00
2519
213
原创 string类,难吗?这不简简单单!
这里再为大家补充一个知识:就是string类类型的对象中的成员变量里有两个可以存储元素的变量,一个是数组指针,这个数组指针指向堆中的一块空间,还有一个_buff数组(char类型的),这个数组的空间有16个空间,多加一个数组的意思是说,当字符串的有效元素个数<=16时,这个字符串是存放在_buff数组里面的,反之,存放就会存放到数组指针指向的那块空间中,也就是说,如果我们在不做任何初始化的情况下,调用capacity()这个函数的话,得到的空间数是16,而不是0(这就完美解释了5.2中最后的那个问题)。
2024-10-21 08:00:00
2021
263
原创 C/C++内存管理
(1).new的原理1>.调用operator new函数申请空间。2>.在申请的空间上执行析构函数,完成对象的构造。(2).delete的原理1>.在空间上执行析构函数,完成对象中资源的清理工作。2>.调用operator dalete函数,释放对象的空间。(3).new [T]的原理1>.调用operator new[ ]函数,在operator new[ ]中实际调用operator new函数完成N个对象空间的申请。2>.在申请的空间上执行N次析构函数。(4).delete的原理。
2024-09-16 08:00:00
3435
374
原创 函数模板(初阶)
Hello,大家好,我们大家都知道,C++这个编程语言是由C语言继承而来的,因为是继承,所以我们的C++就要做出一些区分,要不然的话,就和C语言没有本质上的区别了,我们现在在社会中使用比较多的是C++而非是C语言,是因为这里我们C++的祖师爷在C语言的基础之上又设计了一个模板相关的内容,这个模板就受到了很多人的欢迎。
2024-09-13 17:00:00
1680
247
原创 C++类和对象(上)
(1).class为定义类的关键字,后面紧跟这个类的名字,{ }中为类的主体,注意类定义结束时后面的分号不能省略掉。类中的内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为是类的方法或者成员函数。(C++规定:类的名字就是类的类型)class date//date是类的名字int a;int b;int c;//a,b,c是类的成员变量void print(int x,int y)//print函数是类的成员函数{ }int main()date d1;
2024-08-05 14:49:21
1338
166
原创 C++入门基础
(1).定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{ }即可,{ }中即为命名空间的成员,命名空间中可以定义变量/函数/类型等,例。namespace zyb//zyb是这个命名空间的名字//命名空间中的成员(2).namespace本质上是定义一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,因此,这样就可以有效的避免上面遇到的冲突的这种情况,例。(3).C++中域有函数局部域,全局域,命名空间域,类域;
2024-07-28 21:26:52
5781
102
原创 这么精彩的排序算法,确定不来看一下?
Hello,各位未来的高级程序员们,大家好,今天我就来为大家讲解一下有关排序的内容,我们常见的排序就是我们接下来要讲的这八个排序,我们平常所说的排序有十大排序,我们这里的八大排序是我们生活中最为常见的八大排序,而剩下的两个排序是桶排序和基数排序,这两个排序我们不做具体的精彩讲解,因为这两个排序属于是又复杂又没用的排序,因此,我们在这里不做具体的介绍,只介绍剩余的八大排序,OK,话不多说,我们现在开讲。 首先,我们这里先写一下八大排序中可能会用到的一些辅助函数:
2024-06-19 18:41:12
2161
77
原创 树和二叉树居然这么简单(二)!
OK,各位未来的高级程序员们,大家好,今天我们来讲解一下二叉树这个部分的第二种存储结构---------链式存储结构,相信大家对这部分内容已经很期待了,但是,这里我们在开讲之前,要先补充一个知识,这个知识本应该是出现在前面一篇博客的内容,之前由于种种原因,就没有写上,那么,现在在这里给大家补上,请谅解。补充:TOP-K问题:N个数中找最大的前K个。方法1:建立一个N个数的大堆,空间复杂度:O(N), 然后再PopK次 时间复制度:
2024-06-16 15:58:28
1359
139
原创 树和二叉树居然可以这么简单(一)
这里我们还是和上面一样来为大家解释一下过程,我们大家都是学习数据结构的,相比大家肯定都或多或少的通听过堆排序吧,每错,接下来,我就为大家来介绍一下堆排序的过程,说起堆排序,想必大家的脑海中第一个印象就是建立一个第三方数组,来帮助进行排序(我们要想实现堆排序,首先就得建立一个堆),这样也是可以的,但是这样的话,会让空间复杂度上升的,我们这里有更好的方法可以去实现堆排序,就是我们直接在原数组上建堆。也就是这一个篇章,树和二叉树的精彩讲解。
2024-06-14 18:26:27
1396
184
原创 双向链表,这也太简单了吧!(C语言实现)
由上图我们可知,双向链表是有一个头节点的(也叫哨兵位),这个头节点在双向链表中起到的就是头指针的作用,双向链表是一种循环链表,是双向可循环的一种链表,哨兵位在这里虽然它是存在在双线链表当中的,但是在这里我们不会去访问它的,也就是说,他在这里只是起到一个头指针的作用。我们在讲实现的的步骤之前,我们先要了解一下,其实这个头指针它在链表这里面是指的是一个哨兵位节点,他其实也属于一个节点,只不过我们不去访问这个哨兵位节点,因此,它在这里实际上就是只起到一个节点的作用,它其实也没有我们想的那么高级。
2024-05-31 23:45:26
1648
201
原创 C语言实现单链表
if ((*pphead)->next == NULL)//除了单链表为空这种情况以外,还有一种情况需要我们考虑一下,就是单链表中有几个节点,如果单链表中只有一个节点,那么最后一个节点就是第一个节点,将最后一个节点的空间释放掉之后,相应的头指针就会变成一个野指针,有一定的风险,因此,这种情况下,要将头指针置为NULL,反之,如果单链表中的节点在两个及其以上的化,就不需要将头指针置空。//因为是要删除第一个节点,我们就得保证单链表中至少有一个节点,因此,我们也要对*pphead执行一下断言操作。
2024-05-24 23:42:30
1477
113
原创 C语言实现顺序表
/在写之前,我们先来讲解一下思路:当我们向头部插入元素的时候,不仅要让元素成功的插入到数组中,还要保证数组中原来的元素不会丢失,因此,我们要将原数组的元素统一向后面移动一位再将要插入的元素插入到头部位置就可以了(这里有一个点需要我们大家注意一下,就是我们在进行向后移动的时候,要从后面开始,往前进行循环移动元素操作)。//在进行尾插操作之前还要先看一下数组中的空间够不够,如果不够,则需要再重新扩充空间或开创空间,否则,无法进行尾插操作。
2024-05-21 23:52:21
1359
153
原创 栈和队列LeetCode精彩题目讲解
但是不要紧,今天我来给大家慢慢的分析一下这道题目,这道题的意思其实就是说,设计一个循环队列,这个循环队列的空间是固定的(这里以4个空间为例展开讲解),我们每向我们设计的队列中插入一个元素,那么队列中对应的空间就会少一个,当这个队列中的空间全部都装满的时候,此时,我们就无法向这个队列中再去插入元素了,唯一的方法就是删除掉队列中的第一个元素,将新的元素插入到此队列中的第一个位置即可,再插入一个元素,再删除掉第二个元素的位置,将其插入到第二个元素的位置,以此类推。
2024-05-19 23:42:53
1841
107
原创 栈和队列,怎么可能不懂呢?
通过上述讲解,我们知道了_top指向的是栈顶元素的下一个位置,大家可以通过我们自己的聪明的大脑想一想,_top的值是不是就是栈中有效的元素个数,没错,是的,因为_top他指向的是栈顶元素的下一个位置,并且数组中的第一个元素的下标是由0开始的,如果说到这里大家还是不太了解的话,请看下面的这幅图,大家也可以自己尝试的去画一画图,画完之后应该就理解了。否则,数组空间是固定的,存放的元素是固定的,那么这个栈的实用性就不强。栈中的元素遵循先进后出的原则。} 头指针++,向后面移动一位,就可以了,不。
2024-05-15 13:09:03
1305
104
原创 C语言:【项目实现】贪吃蛇
(3).GetStdHandle函数:用于从一个特定的标准设备(标准输入(例如键盘),标准输出(屏幕),标准错误)中获得一个句柄(换句话说,就是你想要去操作一个设备,你就得去获得这个设备的一些数据,(比如说:你现在想要去使用锅,那么你就得抓住这口锅的手柄,这样你才能去操作这口锅)这里的句柄和锅的手柄是一个道理,当我们得到这个句柄之后,我们就可以去操作这个设备了)。//(HANDLE是句柄的类型,DWORD是GetStdHandle参数的类型,nStdHandle是参数的取值)
2024-05-10 16:46:12
1701
115
原创 环形链表LeetCode经典题目讲解
这道题在刚开始解答的时候,大家在尝试做这道题的时候,会感觉到无从下手,那么,在这里,我来给大家讲一下具体的方法:先定义两个指针(fast和slow),再定义一个cur指针让其指向head指针,让它们两个和上一题一样fast指针一次走2步,slow指针一次走1步,找到它们两个相遇的那个点,定义一个meet指针,让其指向slow和fast指针相遇的地方,然后meet一次走1步,cur指针一次走1步,若cur指针和meet指针相遇,则说明它们相遇的那个地方就是入环的第一个节点的位置。但是他真的无法相遇吗?
2024-05-09 21:54:28
1619
89
原创 C语言数组
arr数组在内存中开辟了五个字节的空间,他们分别存储着1,2,3,4,5这5个元素,在使用时,用数组名[下标]来代表它们的元素,注意下标,从0开始,例如:arr[0]=1,arr[1]=2,…由上图可知,前五个元素位于第一行,中间五个元素位于第二行,最后五个元素位于第三行,它们的地址每个之间都相差了四个字节,也就是一个整形的位置,由此可以断定它们在内存中是连续存放的。如图所示,arr数组中存放六个元素分别为1,2,3,4,5,6这六个元素。例如: int arr[5] = { 1,2,3,4,5 };
2024-04-06 15:04:28
1172
72
原创 C语言循环结构
在执行完语句后,如果遇到continue语句,则立马终止本次循环,然后进行下一次循环。ⅱ.表达式1为循环变量赋值,表达式2为循环条件,表达式3为循环变量增值。ⅱ.只要当循环条件的表达式成立,就执行循环体语句,反之停止循环。ⅱ.表达式中为循环条件,条件成立,进行循环条件不成立,停止循环。在执行语句完之后,如果遇到break语句,则直接跳出循环。ⅲ.执行顺序:表达式1,表达式2,语句,表达式3。②.continue语句:终止本次循环。①.break语句:提前终止循环。ⅰ.while(表达式) 语句。
2023-12-03 11:38:18
790
39
原创 C语言——分支结构
ⅰ.a&&b&&c:当a&&b为真时,你要判断b&&c,当a&&b为假时,则不需要判断b&&c。ⅱ.a‖b‖c:当a‖b为真时,则不需要判断b‖c,当a‖b为假时,则需要判断b‖c。括号中的表达式是执行条件,一旦条件满足进行相对的语句,一旦不满足往下进行。else if(表达式n) 语句n。ⅲ.if(表达式1) 语句1。else if(表达式2) 语句2。else if(表达式3) 语句3。>算术运算符>关系运算符>&&和‖>赋值运算符。ⅰ.if(表达式) 语句1。
2023-12-03 11:16:29
874
39
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人