- 博客(36)
- 收藏
- 关注
原创 初知C++:C++11
• 对于像string/vector这样的深拷贝的类或者包含深拷贝的成员变量的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的第⼀个参数都是右值引用的类型,他的本质是要“窃取”引用的右值对象的资源,而不是像拷贝构造和拷贝赋值那样去拷贝资源,从提高效率。• 对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个包时,我们还要提供用于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应用模式,获得扩展后的列表。我们通过在模式的右边放⼀个省略号(…
2025-03-07 17:03:52
5732
7
原创 初知C++:继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。下面我们看到没有继承之前我们设计了两个类Student和Teacher,Student和Teacher都有姓名/地址/
2024-11-03 22:48:08
1127
21
原创 初知C++:二叉搜索树
场景1:小区无人值守车库,小区车库买了车位的业主车才能进小区,那么物业会把买了车位的业主的车牌号录⼊后台系统,车辆进入时扫描车牌在不在系统中,在则抬杆,不在则提示本小区车辆,无法进⼊。场景2:商场无人值守车库,入口进场时扫描车牌,记录车牌和入场时间,出口离场时,扫描车牌,查找入场时间,用当前时间-入场时间计算出停车时长,计算出停车费用,缴费后抬杆,车辆离场。场景3:统计⼀篇文章中单词出现的次数,读取⼀个单词,查找单词是否存在,不存在这个说明第⼀次出现,(单词,1),单词存在,则++单词对应的次数。
2024-10-31 11:12:19
1117
9
原创 初知C++:多态
多态是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2024-10-31 11:12:05
1099
6
原创 初知C++:红黑树
c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。如果p是g的左,c是p的右,那么先以p为旋转点进⾏左单旋,再以g为旋转点进⾏右单旋,再把c变⿊,g变红即可。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c⼀定是新增结点,u存在且为黑,则c⼀定不是新增,c之前是黑色的,是在c的⼦树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。
2024-10-30 09:33:43
768
4
原创 初知C++:map和set的使用
• set的声明如下,T就是set底层关键字的类型• set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第⼆个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持。
2024-10-30 09:33:33
851
6
原创 初知C++:AVL树
• AVL树实现这⾥我们引⼊⼀个平衡因⼦(balancefactor)的概念,每个结点都有⼀个平衡因⼦,任何结点的平衡因⼦等于右⼦树的⾼度减去左⼦树的⾼度,也就是说任何结点的平衡因⼦等于0/1/-1,AVL树并不是必须要平衡因⼦,但是有了平衡因⼦可以更⽅便我们去进⾏观察和控制树是否平衡,就像⼀个⻛向标⼀样。•场景1:h>=1时,新增结点插⼊在e⼦树,e⼦树⾼度从h-1变为h并不断更新12->15->10平衡因⼦,引发旋转,其中12的平衡因⼦为-1,旋转后10和12平衡因⼦为0,15平衡因⼦为1。
2024-10-12 19:05:43
848
1
原创 初识c++:模板详解
如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码),那将会节省许多头发。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演, 将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些 错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板。此时,就需要对模板进行特化。
2024-08-04 22:06:49
1089
5
原创 初识c++:stack和queue详解
目录#stack和queue详解#1.容器适配器2.stack的介绍和使用2.1 stack的介绍2.2 stack的使用3.stack的模拟实现4.queue的介绍和使用4.1 queue的介绍4.2 queue的使用5.queue的模拟实现6.priority_queue的介绍和使用6.1 priority_queue的介绍6.2priority_queue的使用7.priority_queue的模拟实现1.容器适配器。
2024-08-02 07:27:47
751
原创 初阶数据结构.排序(2.2冒泡排序)
上图其中利用flag是为了判断是否有序,提交前结束循环,提高效率。(排的是升序,如果想要排降序,可以修改一下if判断中的数组元素比较符号)
2024-08-02 07:27:24
283
1
原创 初识c++:list详解
例如,要访问列表中的第六个元素,必须从已知位置(如开始或结束)迭代到该位置,这需要在这些之间的距离上花费线性时间。排序是通过与每个元素的关联在内部保持的,即指向它前面的元素的链接和指向它后面的元素的链接。(4)与其他基本标准序列容器(数组,向量和deque)相比,列表通常在容器内的任何位置插入,提取和移动元素时表现得更好,并且因此在密集使用这些的算法中也表现得更好,例如排序算法。构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都由该范围内的相应元素构造,顺序相同。
2024-07-31 10:08:15
858
原创 初阶数据结构:排序详解
任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排 序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列。
2024-07-31 10:08:07
1077
原创 从入门到大佬:二叉树(3)
目录#二叉树链式结构的实现1.前置说明2.二叉树的遍历2.1.前序,中序以及后续遍历2.2层序遍历1. 前置说明在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于方便大家更容易理解,降低大家学习成本,此处手动快速创建一棵简单的二叉树。注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。在再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是:1. 空树2. 非空:根结点,根结点的左子树、根结点的右子树组成的。
2024-07-29 05:00:00
648
原创 初识c++:vector全方面讲解及其代码模拟实现
目录vector全方面讲解及其代码模拟实现1.学习vector方法2.vector的使用2.1 vector的定义2.2 vector iterator 的使用2.3 vector 空间增长问题2.4 vector 增删查改2.5 vector 迭代器失效问题(重点)3.vector 深度刨析4.vector的模拟实现1. 学习vector方法学习使用vector的方法和使用STL的境界是一样的,要能做到以下三点:(1)能用(2)明理(3)能扩展这样才可以对vector展现很好的理解。
2024-07-29 05:00:00
917
1
原创 初识c++:string类(2)
如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给 出。一般情况都是按照深拷贝方式提供。下面是代码的实现:!!
2024-07-24 19:59:12
731
3
原创 从入门到大佬:二叉树(2)
(3)堆的插入,先利用元素个数和空间大小相不相等来判断空间是否足够,不足则进行空间的扩容,再把元素插入到堆的最后一个元素的后面,再进行向上调整算法来调整该元素所在堆应在的位置。下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算 法,把它构建成一个堆。删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调 整算法。(5)堆的删除,将第一个位置和最后一个位置的元素交换,size--,即可。再将第一个元素向下调整,建堆。
2024-07-20 17:42:02
829
4
原创 从入门到大佬:二叉树(1)
对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。4. 若规定根结点的层数为1,具有n个结点的满二叉树的深度,h=log2(n +1). (ps: log2(n +1)是log以2为底,n+1为对数)如上图:B、C、H、I...等结点为叶结点 非终端结点或分支结点:度不为0的结点;双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;2. 若规定根结点的层数为1,则深度为h的二叉树的最大结点数是2^h-1。
2024-07-20 11:42:27
1120
1
原创 复杂度的oj练习题
(2)异或法定义一个中间变量sum=0(为了好给出一个返回值),分别与i和数组元素异或(利用a^a=0,a^0=a,来做),最终只剩下一个缺少的数,即为所求。(1)逆置:思路为数组前n-k个逆置,后k个逆置,在整体逆置就可以达到轮转的效果了。(1)利用数组求和来计算0~n的总数和再减去数组中的元素,所求得剩下的则为剩下的数字。(2)将前数组前n-k个拷贝到新数组后面,后k个拷贝到新数组前面。本节习题结束,over。
2024-07-19 21:11:56
346
1
原创 算法的时间复杂度和空间复杂度
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。基本操作执行最好N次,最坏执行了(N*(N+1)/2次,通过推导大O阶方法+时间复杂度一般看最 坏,时间复杂度为 O(N^2)。并且有的算法存在最好,平均和最坏情况,但在实际情况下,我们特别关注的是最坏运行情况。
2024-07-19 13:37:25
338
2
原创 c/c++内存管理
(2)operator new 实际也是通过malloc来申请空间,如果 malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常(一般来说new操作符的使用不会出错)。如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申 请空间失败时会抛异常,malloc会返回NULL。
2024-07-19 09:26:26
1114
1
原创 习题一:日期差值
(2)yearDay来记录0~年的天数,monthDay来记录0~n月的天数。CountDay函数来记录该日期与0000年0月0日距离的天数。判断是否是闰年,并且该日期月份是否大于二月,是则月份累计天数则得加1,因为闰年的二月为29天。(1)作出一个数组记录平年一月到n月的天数。(全局变量,这个数组在全局都可以使用。(3)abs为求n1-n2的绝对值,由题意给的例题可知,差值得加1。1. 分别求出每一个日期与0000年0月0日距离的天数。2. 两个距离天数相减即可得到两个日期相差的天数。
2024-07-18 20:55:47
323
原创 初识c++:类和对象(4)
(1)之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。(3)内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考 虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其 他地⽅都⽤不了。建议声明顺序和初始化列表顺序保持⼀致。
2024-07-18 20:13:20
871
原创 初识c++:类和对象(3)
像Stack这样的类,虽然也都是内置类型,但是_a指向了资源,编译器自动生成的拷贝构造完成的值拷贝/浅拷贝不符合我们的需求,所以需要我们自己实现深拷贝(对指向的资源也进行拷贝)。6. 传值返回会产生⼀个临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名(引用),没有产生拷贝。3. 没有显式实现时,编译器会⾃动⽣成⼀个默认赋值运算符重载,默认赋值运算符重载⾏为跟默认构 造函数类似,对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型 成员变量会调⽤他的拷⻉构造。
2024-07-17 18:16:52
1004
原创 初识c++:类和对象(2)
析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的, 函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对 象中资源的清理释放⼯作。构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并 不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化 对象。5. 跟构造函数类似,我们不写编译器⾃动⽣成的析构函数对内置类型成员不做处理,⾃定类型成员会 调⽤他的析构函数。
2024-07-12 14:14:14
630
原创 初识c++:类和对象(1)
(2) 类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。类中的函数称为类的⽅法或 者成员函数。(5) 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。(1)类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤::作 ⽤域操作符指明成员属于哪个类域。
2024-07-11 21:05:29
728
原创 初阶数据结构.排序(2.1快速排序)
(4)总体循环结束条件为,如果pi移动到ps相等的位置或者大于ps的位置则结束总循环,ps先走,ps所在元素如果大于keyi所在元素,则ps--,碰到小于的,则停下来,然后pi开始判断,如果pi所在元素小于keyi所在元素,则pi++,碰到大于的pi停下,最后将pi所在元素值与ps所在元素的值互换,然后进行下一次循环,同上。(5)最后将keyi所在的元素的值与pi所在元素的值互换,这样就构成keyi左边元素的值全部小于keyi所在元素的值,右边元素的值全部大于keyi所在元素的值。(本文只讲解一种版本)
2024-07-10 10:39:58
309
原创 初阶数据结构.排序(1.归并排序)
(6)这是当上述两个数组结束比较,其中肯定有一个未结束判断,如果是begin1未结束,则将begin1所在数组数组元素依次放入temp数组,相反将begin2未结束,将其中所在数组的元素依次放入temp数组中。(1)a为我们需要排序的数组,temp为我们创建的第三方数组,最后面会讲解其作用,begin为a数组的首个元素,end为a数组的位于末尾的元素。(2)判断a数组中的元素是否只有一个值,就返回,或者开始就判断该数组是否含有元素,如果没有就返回,大于两个元素,则进行下面的归并排序。
2024-07-09 21:20:21
360
原创 c++入门知识点讲解
(6)使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊ 输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。在c/c++中,变量,函数,和类都是大量存在的,而这些的名称都将存在于全局作用域中,可能会导致很多冲突。(1)定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。
2024-07-09 09:31:44
1302
原创 栈的初步认识及实现
我们需要使用typedef这个关键词来给int定义一个新的名字STDataType(当然可以取为其他的名字),这样是为了防止以后我们栈中插入的数据类型不一,可以直接对int进行更改(例如:int->char),以免进行大量的更改。显而易见上图,先要判断栈中数据是否为空,为空就进行报错,不为空则返回下标为top-1的数据。2.if (ps->top == ps->capacity),是用来判断栈中的数据是否和容量相等,相等的话,则需要进行扩容操作。栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
2024-06-05 19:28:39
274
原创 c语言内存函数
我们是将arr1数组中的起始位置开始的20个字节拷贝到arr1+2的起始位置开始。(1)函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个则是将src的数据复制到dest中,count是复制的字节个数,直到count--到0,跳出循环。(1)memmove和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。2,memmove的使用和模拟。
2024-06-01 17:50:51
267
原创 链表部分OJ面试题讲解(c语言)(题目来自LeetCode)
直接cur->next指向copy,但因为我们需要找到下一个节点也就是节点2,所以我们需要先改后面那个也就是节点2(利用cur->next将节点2存起来),在这之前需要先将copy->next指向节点2(cur->next),再将cur->next指向copy,这样就很好地解决了找不到节点2了的问题。然后呢由上图可以看出2的random指向1,则我们复制链表的4的random指向2的random->next(也就是指向3),而这一步则是最为精华的一步解决了random的随机指向。
2024-05-18 10:36:21
768
原创 深入学习指针(1)
假如你有个朋友叫小可,而小可则住在一栋大学教学楼的五楼,但是五楼十几个个编号如下图的房间,这样一个一个的找,无疑会效率很低,费一番力气才能找到小可的房间。const如果放在*的右边,修饰的是指针变量本身,保证指针变量的内容不能修改,但是指针指向的内容,可以通过指针发生改变。const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容,不能通过指针来改变,但指针变量本身的内容可变。这样我们的const就可以派上用场了。p的左边是int *,*指的是p是指针变量,int是指p指向的是整型类型的对象。
2024-05-02 21:01:52
1734
3
原创 雷界解码者(代码的实现在最后面)
而这第二部我们需要用的生成随机地雷呢,所以我们需要用到rand,另外也需要包含头文件#include<stdlib.h>和#include<time.h>来使用我们的rand,这样我们的随机地雷就出来啦!首先我们需要一个头文件和一个点c文件,来声明并且实现我们的代码,当然还需要一个测试文件,来检测我们的代码是否和我们所想的一样运行。首先呢我们排查雷肯定需要一个坐标来表示我们扫雷要扫的一个位点呢,所以我们就用x和y来表示咯,例如这样(x,y)的一个的坐标啦!最为重要的第三步,就是代码来实现了!
2024-04-21 13:35:21
311
1
原创 C语言:分支和循环语句
在while循环和for循环的{}中的语句使用break则会直接跳出循环,continue则是不再执行它后面的语句直接进行下一次循环,do-while循环也是如此。上图则是do-while循环的基本结构了,与其他循环不同的是它是先执行语句再来判断。如上图,如果i<=10的话则会循环执行{}中的语句,当i>10的话则会脱离循环不再执行该{}中的语for循环。(在c语言中零表示假,非零则表示真,所以我们也可以使用一些数字来执行该语句或者不执行该语句都是可以的。上图则是while的基本结构了。
2024-01-26 17:31:30
1741
1
原创 人生第一篇博客
最后我想值得一提的是我想加入哪家IT公司?但我现在能力不行但我相信我自已可以通过不断的努力去接近我的目标!和我一样正在努力的伙伴们!再者我打算在学习编程这件事花费每周至少三天毕竟我现如今还有其他私有的事情需要去处理,但我相信我自己将来学习编程的时间会不断的提高来达到我对学习编程的渴望。首先呢我学习编程的目标是创造实用且高效的软件解决方案,以来解决生活上的问题,并为使用软件的用户提供更加良好的体验。欢迎来到我的博客,我是“我不是蠢蛋呀”一个对编程充满热情的人。我来自中国,现居江西九江。
2024-01-16 19:06:55
410
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人