- 博客(52)
- 收藏
- 关注
原创 使用c++实现红黑树的构建和插入
红黑树实际上和AVL都属于一棵用于存储数据的平衡二叉搜索树,但是这棵树并不是使用平衡因子去维持平衡的,而是结合限制条件对结点标红标黑去让树达到类似平衡的效果。
2025-02-13 18:25:56
287
原创 c++实现AVL树的构建和插入结点
AVL实际上就是一颗存储数据的树,可以在通过中序遍历达到数据顺序展示的效果,而且对于查找,相比正常的二叉搜索树效率要高,因为在二叉搜索树变成单枝树的时候,时间复杂度就重新变为了O(N),单枝树如下所示:根右子树右子树而AVL树则能通过对平衡因子的限制,从而保证树相对平衡,而达到好的搜索树效果o(log2 n)。平衡因子主要是通过判断两边树的高度差来限定的,在AVL树中,平衡因子是限定为-1到1,如果不在这个范围,出现2,-2说明这棵树需要平衡处理了。
2025-02-08 16:47:49
524
原创 c++进阶---c++三大特性之一---多态
在上面的例子中,出现了virtual关键字,在对象成员函数前面加这个的函数就叫做虚函数,虚函数主要是为了用于实现多态。当子类和父类中函数的返回值和参数均一致,且父类有virtual时就会构成重写,当子类或者父类中出现一个虚函数,另外一个出现一个不是虚函数的对应函数称之为重定义。
2025-01-22 22:15:47
669
原创 c++入门->内存管理(new与delete的详细介绍)
如果是生成单个空间,那么和(1)一致,否则会在前面生成一定的字节数(看编译器)去存放[]了多少个空间(用于析构函数)3.delete (核心:析构函数+operator delete)(1)释放申请的单个空间对于自定义类型和内置类型均一致:使用delete直接去进行释放,能不能使用delete(自定义类型)?不能!
2024-11-24 17:52:06
284
原创 c++入门-->初始化列表,隐式类型转换,static
例如:但是,你应该也发现了,在这里写的话自定义类型的变量写的也是=(实际上也可以={1} ),这就和初始化列表有所差异,但是呢,实际在走的时候,是先走初始化列表,如果初始化列表没有写,才会来这里找初始值。这里a并不是1,而是0(vs中初始化列表中b默认的随机值是0,看编译器)所以呢,这里你去引用的时候发现不行,也不是因为1和它的类型不同,是在这个过程中产生了临时变量(具有常性)。但是实际上,编译器会优化这个过程,它会不进行这样繁琐的过程,会隐式转换直接进行aa的构造。
2024-11-22 17:56:30
456
原创 c++入门->const对this指针的作用以及取地址运算符重载
有一个细节的地方,就是你在这里可能会疑惑,那为什么this可以直接被传回去?很明显是不会的,因为你只是把i这个值给了j而已,只是一个拷贝,你的j再怎么玩,你都不会影响到i(this同理,出来这个函数,你是有我值的另外的你了,跟哥们没关系了),因为你不是指针。这也符合我们的预期,如果它没被const修饰的话,那本来是对这个对象进行处理,进去之后反而改为对别的对象进行处理,这显然是不合理的。像这种被const修饰的,由于存在权限放大的错误,编译器会不让你过,所以c++提供了一种解决这个的方式。
2024-11-22 13:55:18
161
原创 c++入门-->一篇文章吃透拷贝构造函数以及operator运算符重载
首先是他相当于是构造函数的一个函数重载,第一个参数必须是传入他的引用(后续会说明是为什么),后面你也可以加入参数,但是如果你加了参数,就不会被当成拷贝构造函数被使用,如果没有自备的拷贝构造函数,对于内置类型,系统就会使用默认的拷贝构造函数,对于这一个拷贝,是一个浅拷贝,对于自定义类型,就会去使用自定义类型自己的一个拷贝构造。(1)在return的时候,如果你的对象是在函数中生成的,那么你不能使用&返回,你得用值返回让他去进行拷贝,因为出了函数,那个对象的生命周期就结束了,你把它的引用传出去,那不是造孽吗?
2024-11-19 15:58:19
811
原创 vs编译器缺陷:在清理二叉树时,使用二级指针仍然不能时后续的结点置空(若有误解麻烦指出)
最后你去debug的时候却看到是这样的,由于使用的是二级指针,所以正常来说应该是都会被置空的(也就是bcdefgh...),但是编译器却没有置空,我认为是编译器存在的问题,如果是我的问题麻烦指正一下。printf("右子结点data为:%c ", new_root->right->data);printf("左子结点data为:%c ", new_root->left->data);printf("左子结点没有值\n");printf("右子结点没有值\n");printf("没找到");
2024-11-19 10:16:54
631
原创 c++构造函数和析构函数
对于内置类型的它没有要求太多,如果没有自定义的构造,那么就是生成随机值,但是对于自定义的就需要有自定义的构造函数去初始化,如果没有就会出现报错(需要用后续的知识解决)。3.与构造函数类似,q1会直接去调栈的析构函数(你就算自己写一个在Myqueue里面也是没用的,会全都调用,Myqueue中的会调用,栈里面的也会调用)c++为我们提供了一种在生成对象的时候直接进行一次初始化的构造函数(我们自己选择写的情况,不写会直接使用默认构造,后续说明)。全缺省构造,无参构造,自定义类型的自动构造均属于默认构造。
2024-11-16 17:52:55
609
原创 c++入门->类的定义以及this详细解析
实际上每次传入参数的时候都是有个隐藏的this指针(在第一个参数那个位置),但是你传的时候不能传(正常应该是(&date1,year,month,data),这样是不是很烦,直接让编译器传不爽吗?可以在内部定义变量还有函数,而其中的public是声明这里面的东西是共有的,可以调用也可以修改,但是private则是声明这里面的东西是私有的不可以被改变的,但是在类里面共有的是可以使用私有的。按上面那么说,函数也是一样的,私有的里面还是一样的,那是如何保证每个对象是不一样的呢?2.对象在外部进行定义。
2024-11-16 16:13:25
194
原创 c++入门-->inline与宏定义
也就是说,你头文件不能放个inline void f()声明,然后在源文件去写那个inline void f()的实现,编译器在链接的时候如果是函数,那么是可以找到对应的函数地址的,但是如果是inline是找不到,编译器在源文件中会认为f已经在对应的源文件展开,那还给啥地址啊。(例如:下图中inline.cpp中写实现,inline.h中写声明,在test中调用的时候就会报错,找不到目标函数。解决方法就是直接在inline.cpp中写完整的inline.h)2.1inline的使用。
2024-11-16 14:42:10
311
原创 c++入门--引用与指针,const与引用,NULL与nullptr
函数返回的时候是生成了一个临时变量,这个变量具有常性,是不能对这个值进行修改的。但是如果返回的是int&的话,那么就是它的别名,那当然是可以进行操作的。在c++中,新增了一个nullptr,这个是(void*)0,但是把它当参数传入时,它会自动类型转化。(1)引用不需要开空间,但是指针需要开空间(但是实际上在汇编层引用实际上就是用指针的方式实现的)(4)sizeof引用看的是引用的对象,但是指针看的是平台的。(5)引用一定是需要初始化的,但是指针是不一定需要的。(3)引用在c++中没办法改变指向的对象。
2024-11-15 21:29:57
187
原创 c++初级--->namespace关键字,输入输出,缺省参数,函数重载
但是需要注意的是,给半缺省的时候,只能从右往左给,但是在调用的时候,不给参数的话只能从左向右给,不能出现这种(a=1,b,c=1)(a=1,b,c)均是有问题的。4.函数重载,c++支持函数重载,也就是同名函数可以多次定义,但是要注意的是定义的同名函数需要参数不同(个数,类型),不能是返回值类型不同。正如上图所示就是使用cout<<(这里是要输出的东西), 后面的<<endl实际上就是输出了一个空格。通过这个关键字,可以解决函数在文件展开的时候会因为引用头文件中有相同的变量名而导致的报错;
2024-11-14 22:31:49
451
原创 结构体内存对齐与位段
1.结构体的第一个成员对齐到结构体变量的起始位置(偏移量为0处)。2.其它成员要对齐到对齐数的整数倍的地址处(编译器默认对齐数(vs默认为8,gcc没有默认只看变量)与该成员变量所占字节的较小值。3.结构体总大小为最大对齐数的整数倍4.如果嵌套了结构,则该嵌套的结构体的最大对齐数是自己成员中最大对齐数的那一个的整数倍处。第3条规则就改为了还要看结构体里面的成员的最大对齐数,和非嵌套的那部分的成员,所有成员中对齐数最大的那一个1.char c1;char c2;int n;
2024-09-30 22:43:42
845
原创 在一个字符串中寻找第一个只出现一次的字符
整个代码时间复杂度为o(n),空间复杂度需要考虑你的c_count的初始化方式,在这个代码中可以认为是o(1)简单讲解一下这个代码,
2024-09-30 19:20:04
232
原创 浮点数在内存中的存储
首先举个例子说明这个公式怎么用5.5(十进制)转化为2进制为 101.1(0.5=1/2=2^-1)用科学计数法表示这个数为1.011*2^2为了提高精度,会默认的把M中的首位的1去除,以达到提高一个bit的精度。.因为蓝色框中存储的是无符号的整型,但是实际存储的时候可能有负数,所以规定先加127在放入。3.M少的部分用0补充。
2024-09-27 15:34:01
790
原创 整数在内存中的存储(c语言)
当一个数的时候,不存在原码反码补码的差别,也就是一样的;当一个数的时候,以-1为例子,对这个过程进行讲解。1000 0000 0000 0000 0000 0000 0000 0001 原码(实际我们看到的)1111 1111 1111 1111 1111 1111 1111 1110 反码,(符号位不变也就是最左边的那个,其余的把原码中为0的变为1,1的变为0)
2024-09-26 20:07:33
1092
原创 str函数的模拟(包括strn函数的模拟)
/这里只用最难的方法if (*s1) {elsereturn 0;这里使用了的方法,如果需要看指针,数组用计数器count的方法看之前发的文章string函数的模拟即可;讲解一下这个函数的作用:这个函数能,直到找到'\0',如果找不到就会生成随机数。注意点:这些str函数返回值一般都是unsigned int 类型,但是我的模拟函数都是返回int型,如果用库函数的话,做减法要注意不会出现负值。
2024-09-24 16:07:45
916
原创 c——通讯录的模拟
for (j = i;printf("请开始输入要添加的信息(名字,年龄,性别,电话)\n");printf("通讯录中没有找到该用户\n");printf("通讯录中存在该用户\n");printf("通讯录中存在该用户\n");printf("通讯录中存在该用户\n");printf("该用户不在通讯录中\n");printf("请输入你要查找的用户\n");printf("不存在该用户\n");printf("通讯录暂时还没有用户\n");printf("通讯录中暂时没有用户\n");
2024-04-16 14:59:22
1581
原创 c-结构体内存对齐,位段
首先就是解释为什么要这么处理:处理器在处理已经对齐的变量时只需要一次就能够读取,而没对齐时可能就需要将该变量读取两次,(既4个字节,读了前三个字节,还剩一个字节就需要再读取一次)2.从第二个开始每一个存放时都要放在偏移量为(默认值与字节数较小值)的整数倍处。为了减小损耗一般在没有固定要求的情况下把小字节的变量放前面进行定义。3.最后得出来的那个值要是(几个变量字节最大的那个)的整数倍处。0~7加起来刚好8个是4的整数倍,所以不需要额外扩展一个空间。1.第一个直接放在偏移量为0的地方,不管是什么类型的变量。
2024-04-14 11:02:02
241
原创 c---内置函数模拟(memset,memcmp,memcpy,memmove)
assert(s1);return ret;return 1;return -1;return 0;else {return ret;return ret;
2024-04-12 18:10:13
357
原创 c语言字符串函数(模拟实现)
/真正的strlen是unsigned int。//能够判断为不为空指针。用递归的方式完成strlen。用指针的方法完成strlen。用数组的方法完成strlen。
2024-04-08 11:19:15
205
原创 c语言进阶之函数指针的使用(计算器的模拟,以及qsort函数的模拟)
void *的指针是不能直接解引用的,因为void相当于与个存放器,是为了方便存放(无具体类型的指针)在下面这个例子中作用体现得就很明显。//函数指针//这里的取地址符合是可以省略的。//*号是为了便于理解,其实是摆设。printf("请输入你要选择的运算1:加法,2乘法,3减法,4除法\n");printf("请输入你想选择的操作数\n");
2024-04-02 20:29:10
769
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人