- 博客(25)
- 收藏
- 关注
原创 适配器stack和queue的实现及双端队列deque的原理
适配器是一种设计模式,设计模式是经过长期实践的经验总结.它的本质是将一个类的接口,转换为另一个类的接口.在之前我们实现栈和队列的底层的时候,我们使用的是数组和链表来实现它们的增删改查.但是在stl中,我们可以用vector和list来进行转换成stack和queue的形式.
2025-04-16 11:27:48
299
原创 list的使用以及模拟实现
int b;:a(a),b(b)假设我们有这么一个类.我们对这个类list<C> c;while (it!我们要访问struct的成员变量的时候,如果这个类没有实现它的流插入流提取运算符重载.我们需要主动取访问它的内部的变量去间接访问.我们可以提前再迭代器实现->去直接访问它的内部的成员变量.再这里也存在const对象的问题.我们仍然需要传一个模板参数.具体参考代码。
2025-04-10 21:32:17
878
3
原创 vector的使用即模拟实现
i++)在这里面我们并没有用memcpy,我们采用的是一个一个拷贝,因为自定义类型会调用它的赋值运算符重载,完成深拷贝,而memcpy是浅拷贝.
2025-04-08 10:51:53
743
原创 双向链表增删改查的模拟实现
0.双向链表的基本结构1.双向链表的初始化2.头插尾插3.头删尾删4.查找与打印5.在指定位置之前插入数据/在指定位置之后插入数据6.在指定位置之前删除数据/在指定位置之后删除数据7.销毁链表
2025-04-05 17:32:52
648
原创 链表的增删改查的模拟实现
0.链表的基础结构1.头插尾插2.头删尾删3.查找4.在指定位置之前插入数据/在指定位置之后插入数据5.删除pos结点的数据/删除pos结点之后的数据6.销毁链表
2025-04-05 12:11:49
964
原创 string的模拟实现
string的模拟实现成员变量构造析构.迭代器,遍历相关插入删除相关字符串相关关系操作符的重载构造与赋值运算符重载随机插入和删除查找以及截取字串相关流插入流提取相关
2025-04-01 14:43:58
1027
2
原创 string常见的接口使用(3)
1.Element access类的接口2.Modifiers类的接口3.String operations类的接口。
2025-03-22 20:22:41
1144
原创 stl介绍与string容器常见接口的使用
sti是标准模板库,是c++标准库的重要组成部分.它不仅是一个模板库,更包含各种数据结构和算法.对于stl来说.从它发布至今,已经有许多版本,最早的开始的是有惠普实验室研发,并开源的.最后纳入c++标准之中.允许修改,并且商用.但是唯一的条件是它们如果做出有效的修改,也一定要开源.stl随着多年的迭代更新已经有了许多不同的版本对于我们现在所使用的环境vs22来说,它的底层采用的是jp版本的由P. J. Plauger开发,继承自HP版本.被微软采用.而我们平常学习的是SGI版本。
2025-03-20 12:11:03
895
原创 C++的内存管理及初识泛型编程(模板)
对于c++和c的内存管理的方式,二者在内置类型上并无区别,但是对于c来说,自定义类型的内存管理,初始化的方式就非常困难,而c++的delete和new就能解决这个方式.class Apublic:: _a(a)~A()private:int _a;定义一个类A对于上四者来说,第一个只会申请空间,对于第二个,它会在给a分配空间的同时去调用默认构造,对于第三个来说,它会用三去调用它的构造函数,对于第四个,它它会给这个块连续的空间调用5次构造函数,并且最后一种也支持用花括号进行初始化.
2025-03-19 13:57:16
568
原创 类和对象的拓展补充及默认成员函数(取地址重载和const成员函数)
根据两个的运算符重载来看,他们都返回了一个istream和ostream类型的引用.如果我们这个函数直接写在类里面就会导致它的第一个参数是this指针,而根据运算符重载的规则,对于二元操作符来说,它的第一个操作数对应的是左操作数,第二个操作数对应的是右操作数.那么我们就会在调用的时候相反了变成了。4.c++11支持在成员变量声明的地方给缺省值,这个缺省值主要是给没写在初始化列表的成员变量进行初始化的,如果在初始化列表写了,就会用显示写的那个,而不用声明给的.
2025-03-13 22:31:13
1010
原创 默认成员函数(运算符重载和赋值运算符重载)
当进行自定义类型比较,加减乘除等操作的时候,如果我们直接使用+,-等操作符的时候,就会发生歧义.一个自定义类型里有很多成员,那我们究竟是对什么进行加减,赋值操作呢.为了解决这个问题,c++提出了运算符重载,用operator关键字加上操作符的特殊函数,对原先的操作进行重新的定义.让它具有新的含义从而可以使自定义类型进行上述操作。2.运算符重载的函数的参数列表应该和该运算符的操作数一致,对于二元及以上的运算符来说,它的参数从左往右,第一个参数对应第一个操作数,第二个参数对应第二个操作数.
2025-03-10 21:26:16
488
2
原创 tihs指针和类的默认成员函数(构造,析构,拷贝构造)
在前面的类的内存大小的地方,我们提到,类的成员函数,会存储在一个公共代码段中,当去调用成员函数的时候,公共代码上函数会通过汇编转换为指令,这个函数第一行指令的地址就是这个函数的地址,通过这个地址去调用成员函数.同一个类里不同对象调用的成员对象实际是一个函数,7.我们解释下为什么拷贝构造传值是语法上的无限递归,当我们传值调用拷贝构造,用其他对象进行初始化的时候,自定义变量作为形参,还需要调度拷贝构造,此时就把这个d传给下一个拷贝构造的d,循环往复,就像是击鼓传花,但永远都不会停下一样.
2025-03-08 22:07:24
773
3
原创 归并排序(包括文件外排序)与计数排序
我们不妨定义这个数组的大小为最大值-最小值+1,+1是因为数组索引的特性原因,它和实际的个数总是差一,遵循不对称原则.这样即使再这期间有没有出现的元素,空间上的浪费也要好于第一种.而当我们需要这个元素的时候,只需要当前元素的索引+最小值即可,这个数组就是一个映射出来的.feof也可去定义两个变量去接收输入函数的返回值.再这个数组中1出现了3次,2出现了1次,3出现了2次,4出现了一次,7出现了一次,9出现了两次.我们再按照顺序放回到原数组中,1,1,1,2,3,3,4,7.9,9,这样就排好序了.
2025-03-06 10:35:33
872
原创 类和实例化对象
类用class定义,后接{},同时还有;,不能省略.类的定义与结构体定义相似.类中可以定义成员,叫做类的属性或者成员,相对于c中的结构体,它可以再其中定义函数.c++中的struct,也可以定义类,再c++中struct定义的变量,也可以定义函数直接定义再类中的函数默认是加上inline修饰的,(函数定义和声明分离的不算)public:a = b;b = tmp;int d = 2;
2025-03-05 13:20:41
965
原创 c++入门
1.定义命名空间,需要用到关键字namespace这个关键字,在这个关键字后面跟着这个命名空间的名字,用空格隔开,接着跟着一堆{},在这个花括号里面可以定义命名的空间的成员,函数,变量,声明等。2.namespace本质上是定义一个域,在c阶段我们知道了全局域,局部域。对与这两个域来说,他们都各自有自己的生命周期和作用规则,在c++阶段,我们会再学习两个域,命名空间域和类域这两个域只影响作用规则,因为二者只能定义在全局。所以他们并不影响生命周期,他们的生命周期仍然是全局的。
2025-03-04 12:40:19
835
原创 快速排序实现及基准值寻找方法
我们在进行循环的时候要首先往栈中压入两元素,也就是这个序列的左右索引,然后进入循环,取出两元素,寻找基准值,如果左右序列不是一个有效的序列,也就是它的左边的序列大于等于右边的情况,等于的时候说明它只有一个元素,大于的情况说明它是空的,关于压栈的时候要注意,根据栈的特性后进先出,我们要先压入右边的元素,再去压入左边的元素,这样循环取堆顶的时候,才能是顺序的。对于快排来说,它的时间复杂度,它的最好的情况是一颗完全二叉树,logn,最坏的情况,没次划分都有一颗子树是空的,此时的时间复杂度就是n²。
2025-02-26 16:58:39
709
原创 选择排序(直接选择和堆排)的实现与时间复杂度
在这里需要提及一个特殊的点,当元素的最大值刚好为begin的时候,我们需要特殊处理,我们,我们拿9,6,3这个数组举例,当遍历完找到最大值和最小值的时候,我们找到最大值和最小值9和3的下标为0和2,我们如果不进行特殊处理的话,直接让最小值和起始位置begin进行交换,此时数组变为3,6,9.最大值的下标仍然指向0,然后最大值和最后一个位置交换,数组又变回了9,6,3,此时数组就无法达到一个排序的需求。这里有一个非常精妙的i点,我们定义一个索引的变量,最后一个元素的索引是n-1,而这个值也正是有效个数减1.
2025-02-25 17:24:28
933
原创 插入排序的实现和时间复杂度
我们能够明显的感觉大部分的情况下,它的时间复杂度是要小于n方的,这与我们c语言阶段学习的冒泡排序相反,对于冒泡的排序的情况,它最好的情况是给一个完全排好序的序列此时的的时间复杂度是n,而大部分的情况都是无序的,那么此时它的复杂度就是n方,从时间复杂度上来讲,直接插入排序的是要优于冒泡排序的。当我们插入第i个元素的时候前面的第i-1,i-2,i-3,i-4的元素都已经是有序的了,我们此时已经排好序的元素,和待排序的元素比大小,找到的它的位置插入,在找好位置之后,它之前的位置都是比它大的,我们就可以停止了。
2025-02-20 16:57:48
366
原创 二叉树的层序遍历和判断是否为完全二叉树的方法
对于多个文件的声明一定要注意,如果二叉树的声明和队列的声明,放在了两个不同的头文件中,如果要在队列的头文件中使用二叉树的头文件的结点用typedef出来的变量一定要在前面提前声明,还有一定要加上struct关键字。说人话就是除最后一层,其他层都是满的,最后一层的结点只能按从左往右的顺序排列,不存在只有右节点没有左节点或者最后一个叶子结点的父节点的度是2,而前面的父节点度是0或1的情况。然后判断的它的左右孩子是否为空,如果不为空进入队列。而我们拿来举例的这张图,就不是完全二叉树,在b的位置,它的度是1.
2025-02-15 23:19:43
363
原创 二叉树的遍历和增删改查-2
二叉树的销毁采用后续遍历的方法,因为采用前序遍历的话,我们没法保证左右子树完全销毁,造成内存泄漏的问题,因为在先序遍历和中序遍历中,根结点总是在右子树之前遍历,最坏的结果就是整个左右子树完全内存泄漏,或右子树内存泄漏,所以采用后序遍历的方法,其他的与后续遍历的方法相似。该方法与遍历二叉树的结点个数的方法类似,所以仍然采用递归的方法,前序遍历的方法,有所差异的是,它会分别遍历左右子树的深度并返回其中的较大值(每次递归都会进行)。叶子结点因为度为0的缘故,它的左右结点都为空,这是它的主要特征。
2025-02-15 17:09:39
796
原创 二叉树的遍历
子树已经遍历完,然后去遍历它的右节点,a的右节点c是一颗单独的子树,然后去遍历c的左节点,对于c的左节点e来说,它的左右结点皆为空,返回,打印e,e的函数栈帧结束,返回上一级结点,对于c来说它的左节点已经遍历完,然后来到f结点,f结点的情况同e结点,在c的左右结点遍历完,回到a结点,打印a,对于a来说它的左右结点已经遍历完,整颗二叉树已经遍历结束。对于中序遍历它采用的是先遍历左结点,然后遍历它的根结点,最后遍历它的右边的结点。后序遍历遵循的是左右根的规则,先遍历左结点然后遍历右节点,最后遍历根节点。
2025-02-13 22:23:55
799
原创 C语言数据类型与变量
c语言为我们提供了大量的数据类型供我们使用,数据类型能够为我们描述我们常见的数值,和字符。例如int 类型(整型)来去描述整数,char(字符型)去描述字符,float类型,去描述浮点数也就是小数。所谓我类型也就是该类数据所具有的共同特征该小节主要进行对数据类型中的c语言提供的类型去进行介绍,关于自定义类型,结构体,联合体等,我会在后续的文章中进行分享。我们首先数据类型进行一个大体认知(1)字符型char(2)整型//短整型short//整型intsigned int//长整型。
2024-12-09 22:51:43
804
1
原创 C语言常见概念(2024-12-7)
当我们第一次打开vs的时候要,创建我们的第一个项目的时候只需点击创建新项目然后按照作者的配置去设置如果你的vs2022在进行到这一步时什么也没有,请在你的电脑中找到vs的安装器(第二排第三个)在这里点击修改勾选c++桌面开发然后在你的右下角你会出现点击静待,然后重新启动你vs重复上述过程点击空项目下一步在这里修改项目名称,位置(最好不要设在默认地址因为不好找)然后就正式的进入了我们的vs界面在右边的解决方案资源管理器中找到我们的源文件,右键打开添加 ,新建项。
2024-12-07 22:39:14
808
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人