- 博客(25)
- 收藏
- 关注
原创 C++模拟实现priority_queue(优先级队列)
从上图我们可以看出, priority_queue也是一个容器适配器,我们使用vector容器来模拟实现priority_queue。我们主要实现的接口便是push、pop、top、size、empty。在这里为什么要使用vector来模拟实现priority_queue呢,因为实现priority_queue就和我们实现堆一样,我们要实现对找到父亲和孩子节点,就必须要使用数组进行查找,所以实现priority_queue的底层是vector。对于堆的知识可以移步:二叉树详解_二叉树原理详解-CSDN
2024-08-18 19:23:29
793
原创 C++stack和queue的模拟实现
stack和queue并不属于容器,他们是容器适配器,他们的实现不再像之前一样利用数组和指针进行实现,而是利用已经封装好的容器进行实现的。 我们翻看文档可以发现,stack和queue都是属于容器适配器,而他们的底层实现是通过deque容器来实现的,deque容器我们之前并没有见到过,我们只需知道deque是vector和list的结合体,deque分别拥有vector和list的特性。这些就是模拟实现stack的接口,其中对于构造函数stack()我们可以不写,因为我们是利用deque来实现stac
2024-08-18 17:39:11
469
原创 C++list的模拟实现
list的重要接口就是上面这些接口,我们主要实现的就是这几个接口。要模拟实现list,我们需要定义三个类,一个是list的节点类,一个是list的迭代器类,还有就是list类,与我们c语言实现链表相比,只是多了个迭代器类。这就是list的节点类,该类用于存放节点的数据,像节点的值、前驱和后继指针。在这我们要实现一个构造函数,将链表的节点进行初始化:将val赋给_val,将前驱和后继指针置为空即可。 这就是list的迭代器类,在实现迭代器时,我们用到了三个模版参数,T表示迭代器指向节点的数据
2024-08-17 11:39:25
849
原创 C++vector的模拟实现
为了防止与标准库当中的vector区分,我们将自己模拟实现的vector放在命名空间bit中。这是无参的构造函数,我们实现这个这个函数只需将三个成员变量设置成空指针即可。但C++支持成员变量设置缺省值,所以我们有更简洁的写法。给成员变量一个缺省值空指针即可。这个构造函数可以使用n个value来初始化vector,我们先用reserve开好n个空间,最后将value依次尾插到开好的空间即可。这是用一段迭代器区间来对vector进行初始化,迭代器区间是其他容器的迭代器区间,对于其他容器的
2024-08-14 20:07:28
881
原创 C++string类的模拟实现
模拟实现string类,主要就是实现string类中的一个个函数接口,我们来看看标准库中的string类中共有多少种函数接口。这些就是string类的接口,我们在实现string类时,为了避免与标准库中的string类发生冲突,所以我们模拟实现的类要放在自己定义的命名空间内。下面我们来看下我们要实现的接口:迭代器主要就是返回string的首尾位置。begin就返回字符串首元素的位置,end返回_str+_size就是最后一个元素的位置。构造函数:在初始化时,我们将字符串初始化为空指针,可以
2024-08-11 10:41:33
913
原创 C++模版
首先我们来了解一下为什么要使用函数模版,在学习C语言的时候,我们会写一个相加的add函数,可是我们所写的函数只能满足一种类型的相加,不能满足其他类型的相加,如果要满足其他类型的相加,就只能再写一个函数,但函数的逻辑其实是一样的。所以,在C++中引入了模版的概念,只需写一个函数,就能满足多种类型的相加。模版的写法:下面我们来写一个相加函数模版:上面便是通过函数模版来实现不同类型的相加。结果:当然我们也可以定义多个类型,就像下面那样。 我们来看下面的代码:这就是多种类型模版的使用,编译器
2024-07-25 21:50:34
901
原创 C++类和对象(下)
这就是经典的初始化列表,初始化列表紧跟在默认构造函数之后,形式比较奇怪:主要通过 、 和 实现初始化。每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义 初始化的地⽅。2.引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。我们来看上面的代码,成员变量_t没有默认构造函数,_ret是引用,_n是const类型变量,这三种类型的变量如果不在初始化列表中定义的话,就会引发编译报错。 所以引⽤成员变量,const
2024-07-23 16:57:42
535
原创 C++类和对象(中)
上面的代码就是三种构造函数的写法,要注意的是第二种带参构造函数不是默认构造函数,只有不传实参就可以调用的构造函数才是默认构造函数,一般在写构造函数时建议写成全缺省的构造函数。在上面的代码中,定义了两个类,一个是Stack,一个是MyQueue,在Stack类中用malloc动态开辟了一段空间,所以在Stack类的析构函数要自己写去释放动态开辟的空间,而MyQueue类的析构函数不用写,因为自定义类型会调用自己的构造函数和析构函数,MyQueue是用两个栈实现的,析构时会调用栈的析构函数。可以看到
2024-07-21 20:36:24
865
原创 C++类和对象(上)
这便是类类型的定义格式,class为定义类的关键字,A为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。因为C++是兼容C语言的,所以在C++中,struct同样可以用来定义类与class定义类类型相似,struct为定义类的关键字,A为类的名字,{}中为类的主体,他们两之间的区别我们在后面会讲到。注意:我们在定义类的成员变量时一般会加上一个特殊标识,如成员变量前⾯或者后⾯加_ 或者m 开头,
2024-07-18 18:39:55
823
原创 C++入门基础
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。int a;double b;这就是命名空间的普通定义,在命名空间内既可以定义变量也可以定义函数,zj是命名空间的名字。int a;double b;int x = 0;命名空间只能定义在全局,但命名空间是可以嵌套的,在一个命名空间内输入另一个命名空间。3.
2024-07-14 22:52:00
1141
原创 八大排序算法详解
生活中有很多地方都能使用到排序算法,像在京东、淘宝等网站搜索商品时,可以按照你的需求给商品进行排序。以上便是常见的排序算法,下面我们来一一实现他们。直接插入排序的基本思想:插入排序动图理解: 这里引用一下网上的动图,可以方便大家更好的理解直接插入排序。代码:结果: 希尔排序的基本思想:先选定一个整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序,然后将gap按一定方式减小,重复上述分组和排序的工作,当gap等于1时,所有记录在统一组内排好
2024-06-08 12:10:18
818
原创 二叉树详解
讲到这基本上已经将二叉树的基本概念讲完了,对于二叉树的实现以及递归还是有一定难度的,要自己去画图理解,希望以上所讲能够对你有所帮助,码字不易,有帮助的话记得一键三连哦!
2024-05-28 18:01:10
938
原创 栈和队列详解
栈只允许在栈顶进行操作,即插入数据在栈顶,出数据(删除)也在栈顶。这便是栈的结构,入栈和出栈都在栈顶进行。用数组实现栈的结构如上图所示,当然上图所展示的只是静态栈的结构,静态栈还是有许多缺点的,最为严重的就是空间的浪费,所以我们使用动态顺序表来是实现栈。代码:_a为数组,由我们自己动态申请空间,_top指向栈顶,_capacity为数组的容量。代码:这里将_top初始化为0,也有将_top初始化为-1的,他们直接的区别就在于当栈为空时,_top所指向的地方不同,_top为0时指向a[0],_to
2024-05-15 20:38:45
908
原创 链表基本功能的实现及链表经典OJ题讲解
一开始我们讲了链表,并且实现了链表的基本功能(增、删、查、改),当我们学会了链表的基本功能和操作后,我们便讲了三道链表的经典OJ题,前面两道环型链表难得不是编程而是思路,如果有了思路,那么解决就是时间问题,前两题对于链表的应用还算比较基础,最后一题对于链表的应用较为全面,如果在懂思路的情况下能够独立编写出代码,那么恭喜你,对于链表的理解和应用已经到了大成的境界。
2024-05-03 10:25:12
2010
原创 c语言实现贪吃蛇小游戏
讲到这基本上就能够基本上实现出贪吃蛇小游戏了,对于API等Windows自带的函数,我们进行了解会使用就可,希望这些能对你有所帮助,记得三连哦!
2024-04-29 18:51:03
532
转载 c语言的编译和链接
1.翻译环境和运行环境:在ANSI C的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。第2种是执⾏环境,它⽤于实际执⾏代码。2.翻译环境:那翻译环境是怎么将源代码转换为可执⾏的机器指令的呢?这⾥我们就得展开开讲解⼀下翻译环境所 做的事情。其实翻译环境是由编译和链接两个⼤的过程组成的,⽽编译⼜可以分解成:预处理(有些书也叫预编译)、编译、汇编三个过程。
2024-03-30 16:47:58
907
原创 文件操作详解
ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们就要使⽤⽂件。数据文件:⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
2024-03-30 10:56:04
708
原创 结构体和联合体详解
结构体详解:一、结构体的定义:我们定义结构体,需要用到关键字struct,就和int类型、double类型一样,也需要用到int和double这两个关键字,用struct定义的变量称为结构体变量。上面的代码就是简单定义了一个结构体 ,在结构体A的{}中的a和c我们称作结构体成员,也是变量,可以具有不同的类型,在外面的s我们称作为结构体变量,为struct所定义的。二、结构体变量的初始化:如何进行初始化要看结构体的成员变量。
2024-03-22 19:51:02
2178
1
原创 整数和浮点数在内存中的存储方式
在计算机内存中,整数通常采用补码的形式进行存储,而表示整数的方式有三种,分别是原码、补码和反码,在计算机中,我们知道数据是以二进制的方式存储在计算机中的,而原码、反码和补码也是以二进制的方式来表示的,下面我们来介绍一下原码、反码和补码。b.E全为0时:这时候浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。(这里要注意,二进制数的第一位为符号位,其余位为数值位,符号位0表示为正,1表示为负)
2024-03-18 17:20:57
469
1
原创 模拟实现函数memcpy、memmove和机器的大小端存储方式
注意:void*类型不能进行解引用,所以我们要进行强制类型转换,这里我们将类型强制转换成char*类型,这是因为char*类型只占一个字节,如果我们要拷贝奇数个字节的话,使用int*等其它类型的话就不方便 ,它们都占偶数个字节,所以强制转换成char*类型会方便我们编写代码。上面我们讲过,如果是小端存储,那么p中存放的值为44,如果是大端存储,那么p中存放的值为11,通过对p所存放的地址来判断,可以判断出机器是大端存储还是小端存储。中的高地址中,数据的高位保存在内存中的低地址中。三、机器的大小端存储。
2024-03-16 10:47:32
1392
1
原创 c语言指针详解
指针数组和数组指针比较难以辨别,指针数组是int *p[3],数组在后面,名词是数组,所以指针数组本质上是数组,数组指针是int (*p)[3],指针在后面,指针是名词,所以数组指针本质上是数组,数组指针的写法相较于指针数组的写法来说多了个括号,括号将指针括了起来,也表示他的本质是指针。其实,所有的指针所占字节数都取决于机器的位数,如果是32位的机器,那么就占4个字节,如果是64位的机器,就占8个字节,与int*,double*等等类型无关。编译器此时报错,因为p已经访问到第十一个元素了,属于越界访问。
2024-03-09 09:30:22
526
1
原创 C语言扫雷游戏
在这里面有许多其他的函数,下面会给大家一一解释,先给大家解释二维数组mine和show,mine数组是用来存放雷的数组,show数组是展示给玩家看的数组,我们要做的扫雷游戏的棋盘是9×9的棋盘,但我们定义的二维数组是11×11的,这是因为后面我们要排查雷的个数,要对周围雷的个数进行排查,这种情况下可能会造成数组下标越界的情况。,先输入一个排查的坐标,判断坐标是否合法,然后显示周围雷的个数,当踩到雷时,游戏结束,将所有不是雷的坐标找出,游戏也胜利。可见坐标6 7不是雷,将坐标6 7排查后,游戏成功。
2023-12-24 11:02:33
862
1
原创 C语言分支循环语句
这是do while语句的基本形式,do while语句与其他两种循环语句的不同点在于,do while语句是先执行一次语句1,再去判断表达式1的真假,如果表达式1为真,就继续循环,表达式1为假,就结束循环,但语句1会执行一次。continue和break语句是截然相反的语句,continue语句是继续循环的意思,而break语句是跳出循环的语句,当我们完成了任务想要跳出循环时,就得用到break语句。这是while语句的基本形式,while语句是通过判断表达式1的真假来判断循环是否结束的。
2023-11-30 19:45:15
41
原创 自我介绍及未来规划
我学习编程主要就是为了能够找到一份还算可以的工作,现在计算机的大环境越来越卷,想找到一份工作并不容易,只有更加努力的学习编程才能在未来毕业时找到一份工作。我是一名二本院校学生,在编程方面是个小白,因为觉得计算机相关专业未来毕业时好就业,选择了计算机科学与技术这个专业,但经过学习后发现编程其实并不容易。我并没有什么很想进的公司,对于我来说,进那些大厂并不科学,所以我的目标主要放在中小厂,只要是薪资待遇合理的公司,我就有可能进。2.在课后也要也要多写代码,不自己去写代码就永远不知道如何去写代码。
2023-11-20 15:47:48
49
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人