- 博客(29)
- 收藏
- 关注
原创 弦歌不绝:【string 的使用】代码世界的字符之舞
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架2. STL的版本 :原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本P. J. 版本由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异RW版本。
2025-06-02 20:21:04
832
3
原创 C++:类和对象(下)---镜中万象:C++类的抽象之境与对象的具体之象
三个角度详解了一下初始化列表为了引出explicit关键字,我们引入了隐式转化的概念,先分析的隐式转化,再引出explicit关键字,在static成员中,我们叙述了概念以及分条讲解了它的成员特性,在友中,我们从友元函数以及友元类那两个方面讲解,同时引出了内部类的概念。(ps:其实感觉无论是构造函数还是拷贝构造函数,他们的完全体应该前面都写初始化,因为初始化不仅可以初始化,它本身也是一种赋值,在函数内赋值时,可以直接在初始化的时候就赋值,然后初始化完成不了的事情再交给函数里面去做)因为cout的输出流对。
2025-05-13 20:29:59
656
9
原创 C++:类和对象(中)---镜中万象:C++类的抽象之境与对象的具体之象(万字精讲)
补充了this指针,详解了类的六个默认成员函数,最后完整的实现了日期类。
2025-05-05 19:58:39
790
8
原创 C++:类和对象(上)---镜中万象:C++类的抽象之境与对象的具体之象
每个根据相同的类,就好比喻,图纸创建出了不同对象中在每个对象中成员变量是不同的,而成员函数几乎是相同的,都在做相同的事,成员变量就好比寝室里的每个人的床,而成员函数就好比洗水池,不需要每个人都有一个洗水池,只需要创建一个洗水池即可,成员变量创建一次成员,函数创建一次,每个对象都保存了一份相同的代码,也就是成员函数的代码相同,代码保存多次会浪费空间,所以计算类的大小时只需在乎成员变量,不用在乎成员函数。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类。
2025-04-26 21:01:21
1074
18
原创 C++引用:代码世界中的“镜中月”与“水中花”
前言引用本质上是一个变量的别名,和指针不同,引用,它是一个变量的别名,它并没有开辟空间,与那个变量共用同一块内存空间,而指针它开辟了空间,它要用那空间来存那个变量的地址。
2025-04-24 20:16:22
581
3
原创 C++:函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了,函数重载就相当于是定义了同名的函数,且仅限于名字相同前言”重载“ 是一种允许使用相同名称的函数或操作符,但它们的参数列表或返回类型不同,以实现不同功能的机制。以下是关于 C++ 函数重载的详解:一、什么是函数重载?函数重载定义 :在同一个作用域内,允许定义多个同名函数,这些函数的参数列表不同,即参数的数量、类型或顺序不完全相同,但函数名相同。
2025-04-24 15:34:21
697
2
原创 C++:详解缺省参数
return 0;在test.cpp中,可以看到由于声明和定义中都出现了缺省参数,编译器无法编译通过,编译器之所以这么做,是为了防止当你声明和定义位置同时出现缺省参数,而你给的缺省参数却不一样的时候,他不知道该听哪个缺省参数也是默认值,这时候会出现歧义。他为了防止出现这个歧义,他就必须把声明或定义中的参数的默认值去掉一个int main()add();return 0;
2025-04-23 09:16:14
751
4
原创 C++:详解命名空间
主要讲解命名空间是什么?为什么有命名空间?以及它的用法// 命名空间中可以定义变量/函数/类型int* a;int size;}slsit;return 0;namespace xx 就是一个命名空间,在这里面可以定义变量,函数,类型命名空间的作用:避免命名冲突 : (避免不同模块或库中的标识符相互冲突。通过将标识符放在不同的命名空间中,即使它们的名称相同,也不会发生冲突。)+逻辑分组 :(命名空间可以将相关的代码组织在一起,使代码结构更加清晰。
2025-04-20 23:58:45
1201
2
原创 双指针算法(部分例题解析)
双指针,它通过设置两个指针来遍历数据,从而实现高效的查找、排序、去重等操作。双指针算法的核心在于通过合理地移动这两个指针,减少不必要的遍历,提高算法的效率。283. 移动零 - 力扣(LeetCode)283. 移动零 - 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
2025-04-19 22:57:06
1035
原创 排序算法的“武林秘籍”:掌握数据的制胜法宝(2)
时间复杂度:最坏情况下为 O(n^2) ,最好情况下为 O(n) (当序列已经有序时)。空间复杂度: O(1) ,只需要一个额外的存储空间用于交换QuickSort:时间复杂度:平均情况下为 O(nlog n) ,最坏情况下为 O(n^2) (当数组已经有序时:1 3 4 ...)。
2025-04-18 21:18:54
575
1
原创 排序算法的“武林秘籍”:掌握数据的制胜法宝(1)
就这样,每次从剩下的牌堆中抽一张牌,然后把它插入到已经排好序的序列中,直到所有的牌都被插入到有序序列中,整个排序过程就完成了。插入排序的原理也是如此,它通过逐步将未排序的部分的元素插入到已排序部分的合适位置,最终实现整个序列的有序排列。快排和希尔排序在数字多的情况下,由于堆排每次都将最小的数放在最上面,导致每次的向下排序都是落个n但快排和希尔排可能会因为数据的巧合性而不用那么费力气,但是堆排就要实打实的从最上面往下挪动所以它相较于快排和希尔排序可能更慢。然后,取,重复上述分组和排序的工作。
2025-04-18 19:31:19
694
原创 顺序表:数据结构的“上古神兽”
优点1. 随机访问高效:由于顺序表的存储是连续的,可以通过索引直接访问任意位置的元素,时间复杂度为 O(1)。这种特性使得顺序表在需要频繁访问元素的场景中表现出色。2. 存储密度高:顺序表的存储结构简单,除了存储数据元素外,不需要额外的存储空间来维护元素之间的关系,因此存储密度较高。缺点1. 插入和删除效率低:插入和删除操作通常需要移动多个元素以保持存储的连续性,时间复杂度为 O(n),其中 n 是表的长度。这使得顺序表在需要频繁进行插入和删除操作的场景中表现不佳。
2025-03-16 11:14:20
464
2
原创 二叉树链式结构:数据结构中的灵动之舞
在数据结构的世界里,二叉树是一种极其重要的结构,它以其独特的性质和广泛的应用场景而备受关注。顺序存储和链式存储。今天,我们将深入探讨二叉树的链式存储结构,从其基本概念、实现方式到实际,应用帮助大家全面理解这一强大的数据结构。二叉树的链式存储结构是一种强大而灵活的存储方式。它适用于各种复杂的二叉树操作,尤其是在处理非满二叉树时表现出色。通过本文的介绍,希望大家对二叉树的链式存储结构有了更深入的理解。在实际应用中,可以根据具体需求选择合适的存储方式,充分发挥链式结构的优势。
2025-02-14 17:29:10
952
8
原创 数据结构之堆:高效管理数据的“金字塔”
本文说明二叉树的顺序结构---堆及实现普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。堆是一种特殊的完全二叉树,它分为两种类型:最大堆和最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;而在最小堆中,每个父节点的值都小于或等于其子节点的值。
2025-02-10 19:57:10
983
原创 二叉树的初识:解锁数据结构的神秘力量
在计算机科学的世界里,数据结构扮演着至关重要的角色。它就像是一个精巧的容器,帮助我们高效地存储、组织和操作数据。而二叉树,作为数据结构家族中的一颗璀璨明珠,以其独特的结构和强大的功能,广泛应用于各种算法和程序设计中,本文主要说明树及二叉树的概念和结构.一、树概念及结构度:连了多少根线,相当于有几个孩子叶节点:往下没连线二叉树不存在度大于二的结点,二叉树的子树有左右之分,次序不能颠倒,相当于是进行了计划生育的树。
2025-02-10 11:43:00
663
原创 数据结构的时空天梯:复杂度攀登
2. O(1)不是代表一次,而是代表常数次,如循环100次,100次是确定的,那么时间复杂度就为O(1),用常数1代替运行时间🕙中所有的加法常数。O(n), O(n^2), O(log n)等。🌟🌟🌟:在实际中,一般情况关注的是算法的最坏运行情况也就是最差的时间复杂度,也就是O(n)-------------------完--------------------一个算法的时间复杂度,如果是O(n^2+n)那么他时间复杂度就为O(n^2)O(2N+10)==O(N),最后,时间复杂度为O(N)
2025-02-04 20:10:09
737
原创 栈和队列:数据结构的“双子星”
在队列的Pop中,由于一开始头指针和尾指针都为NULL,在Pop时如果是按单链表的头删,那么最后当头指针和尾指针指向同一块空间的时候,把这个空间释放掉后,将头指针置为空,但是此时没有给尾指针至为空,所以我们还要区分开,也就是当头指针的next的指针为空的时候,就要释放掉这个空间,并且将头指针和尾指针都置为空,具体看代码。-------------------完--------------------void STPush(ST* ps, int x)//压栈。void STPop(ST* ps)//出栈。
2025-02-03 22:05:42
688
原创 数据在内存中的“生存之道”
---任何冠冕堂皇的理由都阻止不了我追求自由的心1.整数在内存中的存储整数的二进制表示,方法有三种 1:原码 2:反码 3:补码,对正整数来说原、反、补码都相同而对于负整数来说,三种表示方法各不相同对于整形来说,数据存放内存中的是补码,因为使用补码可以将符号位和数值域统一处理大小端字节序和字节序判断。
2024-11-28 23:20:00
1163
原创 C语言结构体:隐藏在代码中的“魔法盒”
首先,c1对齐零,然后int i要对齐它的最小整数倍上面,最后是9个字节,不是最大对齐数(也就是int为4)的整数倍所以要一直加到12,为四的整数倍,则12是它的,结构体的大小。因为函数传参的时候,参数是需要压栈的,会有时间和空间上的系统开销,如果传一个结构体的对象,结构体对象很大的时候,参数压栈的系统开销就会变大,会导致性能的下降。性能原因:数据结构,(尤其是栈)应该尽可能的在自然边界上对齐,原因在于为了访问未对齐的内存处理器需要做两次内存访问,而对齐的内存访问仅需要一次访问。1.结构体类型的声明。
2024-11-23 14:22:16
1401
原创 C语言内存函数:玩转内存的魔法
在模拟实现的同时,这里展示了source和destination重叠的情况,复制的结果是未知的重叠的内存交给memmove。函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。void * memcpy:void *表示返回类型,返回的是目标空间的起始地址。如果source和destination有任何的重叠复制的结果都是未定义的。这函数在遇到'\0'的时候并不会停下来。2.memmove的使用和模拟实现。遇到'\0'并不会停下来。
2024-11-19 17:11:03
678
原创 深入理解指针(4)
回调函数就是一个通过指针调用的函数,如果你把函数的指针也就是函数的地址(门牌号)作为参数传递给另一个函数:func1(add),这里的add就是一个函数名,它作为了参数传给了func1。sizeof计算变量所占内存空间的大小单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占空间的大小 (sizeof(int)=4)(sizeof(char)=1)int_cmp//设定的一个函数,比较两个元素之间的大小,返回大于0,等于0,小于零的数字。sizeof(arr[0])//元素占几个字节;
2024-11-17 15:08:09
580
原创 深入理解指针(3)
]的优先级要高于 * ,不加上()来保证p先和 * 结合的话,p就会先和[]结合, 如:int*p[10] ,p就会先和[10]结合,会先表示是数组,再看后面的int *,表示他的数组成员是整型指针变量 ,如果加上(),P先和*结合,会先表明p是指针变量,再会去和[]结合,表示他这个指针变量指向的对象是数组。p会先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为十个整形的数组,数组指针变量是指针变量,存放的是数组的地址,是能够指向数组的指针变量。3.二维数组传参的本质。
2024-11-15 23:42:51
237
原创 指针“指”点江山:C语言中的神兵利器(2)
看这个代码结果,我们发现第一个和第二个是差了四个字节,第三个和第四个是差了四个字节,而最后两个之间则差了40个字节,所以对于&arr是数组的地址,加 1 操作是跳过整个数组的。1. sizeof(数组名):Sizeof中单独放数组名,这里的数组名表示,整个数组,计算的是整个数组的大小,单位是字节。这里我们使用&arr[0]的方式拿到的数组第一个元素地址,但其实数组名本来就是地址,而且是数组首元素的地址。数祖传参的时候传递的是数组名,也就是说本质上数组传参传递的是数组首元素的地址,2.使用指针访问数组。
2024-11-14 21:45:05
359
原创 指针“指”点江山:C语言中的神兵利器(1)
我们通过取地址a拿到了a的地址(*表示p是指针类型,%p表示打印出地址),我们此刻打印*p的时候,*p就是a,p就是a的地址,那我们可以看到&p把p的地址取出来,p它本身也是有地址的,他就像是一个房间,房间里面放的是a的地址,*p则可以通过房间里面放的a的地址来访问a(这就是所谓的间接访问),而p本身的门牌号,也就是他本身地址。指针变量的大小取决于地址的大小,在32位(x86)平台下的地址是32个比特位,(八个比特位为一个字节即四个字节),64位(x64)的平台下,地址是64个比特币,也就是八个字节,
2024-11-10 16:32:55
608
原创 重生到大一之操作符疑难点和记忆分享(2)
而且需要注意,我们拿来操作的数字,要看他的二进制数,开头是1还是0,是0就不用管是1就需要转换为补码,结果也是一样,如果结果的二进制数开头是1则需要把它转化,我们想要知道结果是哪个数字,则要把它转化为原码,但又因为开头那个数字也就是符号位是0,也就正数三个码都相同,所以说我们通过这串数字就可以直接推出数字是什么。然后按位与(其实类似于真假的关系,1表示真,0表示假,逻辑就像&&一样,都是真才为真(都是1则是1),有假则都为假(两边有0则为0)------>变量列表。1碰1为0,1碰0穿过为1,0碰0为0。
2024-10-11 23:42:14
589
原创 重生到大一之操作符疑难点和记忆分享(1)
同时需注意正数的原码 反码 补码都是相同的,而负数的各不相同,在&和|,以及按位取反中,一串二进制数可以直接推出结果来,那串二进制数字就是原码,而拿来操作的是补码,操作包括&,|,~。所以我们只需要注意,如果开头是零,就不用在乎原码转补码,但如果开头是1(也就是负数),则我们需要把计算后的结果,也就是计算出的二进制数,来取反+1,得到原码才能推出数字来 ,这里说的有点抽象😬😅。☆注意,除了~(全部取反),其他的取反,符号位是终始不变的,(相当于雷打不动的竖立着,来表示自己的身份(符号)
2024-10-09 23:57:01
578
1
原创 函数递归:代码里的“循环套娃”
每拿出一个套子都能获得一个大白兔奶糖,但是你必须得把套子都拿完,才能去拿套子上的糖,当你把套娃都拿完的时候,只剩下最小的套子的时候,你就从最小的套子的头上开始拿奶糖,一直拿到最大的套子头上的奶糖。4过后再打印3,1234/10=123,成功的把4干掉了 再123%10=3,倒数第二就打印三,以此类推,1是最不好得到的,但也是最先回归的。4是最容易得到的,那么我们可以把它作为第一个奶糖,也就是最大套娃上的奶糖,因为它是最后才能拿到奶糖——最后才打印4,举一个我能想象到的例子,都知道俄罗斯套娃吧,
2024-10-02 22:15:26
588
1
原创 C语言扫雷游戏:如何解决那些“炸”掉你进度的问题
(上文说到的方便)由于mine 和show用的都是char类型的所以说用一个函数iniboard就行mine棋盘中要都是字符0也就是'0'后续中用int x=rand()%9+1 int y=rand()%9+1 让(x y)随机坐标放到mine中去作为雷的坐标( 后续细讲)用同一个函数 我们的实参分别是'0'和'*',以及mine和show,那形参就可以只用一个字符set替代'0'和'*',用a来代表mine和show。1.任何一个数%上9的余数,范围是0到8。~~~~分界线~~~~~~~~~~
2024-09-27 19:40:59
848
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人