- 博客(45)
- 收藏
- 关注
原创 链表的静态实现(用于比赛)
链表的模拟实现分为动态实现和静态实现。动态实现:动态实现是通过new申请结点,然后通过delete释放结点的形式构造链表。这种实现⽅式最能体现链表的特性;但是由于要频繁的new和delete节点,非常的耗时间,所以比赛的时候不建议使用这个静态实现:静态实现是通过两个数组,一个用于存放数据,一个用于保存下一个元素的下标。
2025-02-17 15:40:55
418
原创 C++priority_queue及其模拟实现
priority_queue,中文名字叫做优先级队列,其实就是我们的数据结构中所学的堆在默认的情况下,priority_queue是我们的大堆。
2024-10-26 15:19:16
306
原创 C++list的模拟实现
首先明确一个问题,list是带头双向循环链表,既然是链表,那么我们就需要定义一个节点的结构体,然后既然是list的模拟实现,就需要定义一个list的类,根据带头双向循环链表的特点,还需要一个头节点,所以list的成员变量中必有一个头节点下面是基本结构上面有一个问题,上面的那个定义节点要用struct,而不用class,原因就是上面的节点里面的任何元素随时都需要访问, 而struct里面的是默认共有的,当然在这里你也可以用calss,只是需要把所有的元素置成公有的。
2024-10-16 11:06:40
729
3
原创 vector的模拟实现
在之前的博客里面,我们好像讲过,有关于模板的程序我们最好不要把申明和定义写在不同的文件里面,这样会引起链接错误,具体原因在后面的博客中应该会提到。
2024-10-08 18:40:45
679
原创 string类的模拟实现
这里需要创建一个临时的对象,特别是对于这里自定义类型,需要临时开辟一块空间,将_str里面的东西拷贝到这个临时对象里面去,太麻烦了。就是这里用cin的话,是不能提取到空格的,下面的程序输入了5个x,但是实际输出的只有一个,说明cin在这里,遇到了空格就停止了。这里用的是istream里面get函数,这里是不能用cin或者scanf函数的。所以这里我们可以从重新写一个,只需要交换指向,指针变量交换指向,整形变量交换值。但是凡是不要慌,C++的string类里面是有swap()函数的。
2024-09-26 22:10:19
373
原创 C++ string类
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2024-09-14 20:42:38
805
原创 C++模板初阶
通过前面的学习,我们知道要实现多种类型的两个数的加法必然要用到函数的重载但是这样对于我们来说是否太过于麻烦,既然他们的实现方式都是一样的,那么我们是否能够定义一个模具,使用的时候只需要将不同的类型放在里面让他生成不同的函数,能够实现不同类型的加法嘞?答案是肯定的首先,需要了解到范式编程:泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
2024-09-08 17:19:18
897
1
原创 C++内存管理
其实C++对于内置类型的内存管理和C语言是差不多的,但是对于自定义类型还是有很大的区别的class Apublic::_a(a)~A()private:int _a;delete pa2;return 0;程序运行结果:从上面程序运行的结果来看·,C++在申请和释放空间的时候,会调用自定义类型的默认构造函数和析构函数申请的空间不止一个的时候int main()delete[]p1;return 0;
2024-09-06 22:10:19
835
2
原创 C++初始化列表,staic成员变量
代码解释:上面的程序是两个栈实现一个队列的部分代码,在MyQueue类中,自己没有写构造函数,通过前面的知识,我们知道,编译器生成的默认构造函数,对于自定义类型,会去调用他的默认构造函数,对内置类型,没有规定要不要处理但是,通过上面的代码,Stack里面的构造函数,是需要传递参数的,不是默认构造函数,所以这个时候MyQueue类里面的构造函数,需要自己实现,这时候,就需要使用初始化列表。
2024-09-01 15:11:09
793
2
原创 日期类的实现
这里的函数调用会编译报错的,因为d1对像的const修饰 成为const Date*this,因为this本身具有常性,所以这里修饰的是 const Date* const this(当然这里对于这里的解释没有任何帮助),然后print函数里面的参数是Date* const this类型的,这里属于权限的放大,是不行的,只有权限的缩小是可以的,所以我们在Print函数后面加上一个const来修饰,让他变成const Date*const this,这样就行了。有朋友说,为什么不写在类的里里面,像下面这样。
2024-08-24 22:40:34
900
原创 C++类的六个默认函数
1.一般情况下我们都要自己写一个默认构造函数,因为有的编译器自己生成构造函数对于内置类型是不做处理的,还是随机值2.有的情况下不用自己写,比如class Stack //定义一个栈public://这里自己要实现一个构造函数private:int *_arr;int _size;Stack st2;
2024-08-22 16:08:08
780
原创 类和对象(一)
在C语言中,我们喜欢用结构体来对数据进行封装,但是结构对于C语言来说,只能定义变量,在C++中,结构体里面还可以用来定义函数C++中的结构体里面定义的函数发生了一些变化,就是有的参数不用写,上面的是我们之前实现的栈,里面的在定义函数的时后需要传递指针参数,但是在C++里面不用,因为这里时写在了类里面其实,在C++里面,更喜欢把struct替换成为class(注意的是,函数如果要定义在类外面,应该像下面这样定义)但是替换成为class了之后,我们发现程序会运行错误这是由于 类的访问限定符号。
2024-08-15 21:39:18
972
原创 C++入门2
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得return 10;auto b = a;//auto e;
2024-08-09 16:09:06
679
原创 C++入门1
下面有一段程序上面的这段程序在运行的时候会报错,在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”于是,C++就引用了关键字。
2024-08-05 16:21:36
324
原创 快速排序
设置一个关键值,一个左值,一个右边的值,分别向右边和左边遍历,左边的找比key大的,右边的找比key小的,找到后交换两个的值,直到左和右边相遇,交换key和a[左]值,然后一直递归下去。
2024-08-01 11:18:34
305
原创 堆的相关特点
给定一个数组,其中数组里面的元素个数是个如何能够把这个数组建立成为一个堆,今天探讨两种方法,分别是向上调整法和向下调整法,分别探讨他们的时间复杂度。
2024-07-19 16:36:30
595
原创 堆
数是一种非线性的数据结构,把它叫做数的原因是因为它的结构看起来像一颗倒挂的树一样,它的根是朝上的,叶子是朝下的,如下图值得注意得是,树得子数之间不能有任何交点,否则就不能称作为树,比如下面的二叉树,顾名思义,就是有两个子树 ,关于二叉树,有两种特殊的结构,分为满二叉树和完全二叉树满二叉树:每一个根有两个节点完全二叉树:一个根可能有一个节点,也可能有两个节点,但是得满足一个条件,完全二叉树得数据从左到右必须是连续的,比如下面的下面的二叉树不是完全二叉树,因为数据从左到右不是连续的。
2024-07-16 21:29:36
891
原创 队列
队列也是数据结构中的一种结构,和栈不同的是,队列是一端进行插入,另一端进行删除队列的一种典型应用场景就是医院或者银行里面的打票机,刷身份证录入系统就相当于数据的插入,取票就相当与删除数据与栈的实现类似,队列同样可以用顺序表或链表实现,但是由于队列是一端进行插入,一端删除,对于删除,用顺序表的话比较麻烦,还要挪动数据,所以这里运用链表比较方便。
2024-07-10 10:51:36
236
原创 栈
栈是一种数据结构,只允许在固定一端进行插入和删除功能,进行插入和删除的一端叫做栈顶,另一端叫做栈底,遵循后入先出的规则,就像穿烤串和吃烤串一样其中,插入数据叫做对数据的删除叫做一般用链表或者数组来实现栈,但是由于对于数组来实现元素的插入和删除更加方便,所以用数组来实现栈。
2024-07-08 21:04:28
359
原创 C语言实现猜数字小游戏
这个函数是用来生成随机数的,返回值是正整数,他的值的范围是0到rand_max之间的,rand_max的值在大多数编译器上面是32767,rand()函数的使用必须包含头文件#include<stdlib.h>,下面是对rand()函数的使用。在里可能会有一个误区,觉得ranf_max是32767,那么上面的就应该是1到68之间,这样的理解是错误的,正确的理解是:先产生一个数,这个数是0到32767中的任何一个,比如32699,这个数先取余100,再加1,得到100。下面是这个函数的使用。
2024-05-11 15:14:02
1140
1
原创 单链表经典算法
在链表中,最值得注意的是,尾插链表,插入的是该节点和该节点后面的节点,也就是一串节点在插入链表的时候,记得要将该节点后面置为空。
2024-05-02 15:01:25
993
2
原创 数据结构—单链表
之前的文章已经谈到了顺序表,关于顺序表,有一下的几种特点1.中间,头部的删除,复杂度为O(N);2.增容会有申请新的空间,拷贝数据,释放旧的空间,会有不小的消耗;3:整容一般是呈2的倍数增长,但是也会造成一定的空间浪费,比如,当前的容量是100,满了以后·增加到200,我们继续插入5个数据,后面没有数据插入,就浪费了95个空间。
2024-04-23 21:17:22
879
3
原创 顺序表的应用---通讯录
通讯录的实现依赖于顺序表的实现,顺序表里面的的数据类型各种各样,可以是整形,字符型,还可以是浮点型去去,但是只要把里面的数据类型用一个结构体来代替,就可以实现通讯录项目。
2024-04-16 19:07:16
265
原创 数据结构之顺序表
如果在以后写代码的时候,要求将顺序表里面的int类型的数据转换成为其他数据类型的时候会比较方便,如果要求改顺序表里面的int类型的话,但是其他部分的代码也有int类型的话,你如果使用一键替换功能的话,就会把其他部分的替换了,但是使用从定义的话,就不存在这个问题。在进行扩容的时候,最好是扩容到原来的1.5,2,或是4倍,如果一次扩容一点的话,就会扩容的越频繁,由前面对动态内存管理里面realloc函数的理解,浪费的空间可能会越来越多,倍数太大的话又会造成空间浪费过多。顺序表的分类:静态顺序表,动态顺序表。
2024-03-11 20:05:14
390
原创 预处理详解
语言中定义了一些预处理符号,在程序中可以直接使用,比如下面的__FILE__ //进⾏编译的源⽂件__LINE__ //⽂件当前的⾏号__DATE__ //⽂件被编译的⽇期__TIME__ //⽂件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义下面是使用他们的例子int main()这里有的编译器可能会报错,说明该编译器不支持ASCIN creturn 0;运行结果语法。
2024-03-06 16:12:09
654
1
原创 编译和链接
我们知道c源文件是被转换成为可执行文件才能够被编译器执行在ANSCI的规定中,存在两个环境:翻译环境 执行环境翻译环境:将源代码转换成为可执行的机器代码(二进制)执行环境:用于实际执行代码。
2024-03-05 15:59:37
717
1
原创 文件操作
程序设计中,文件分为:程序文件 数据文件程序文件:源程序文件(文件后缀为.c),可执行文件(文件后缀为.exe),目标文件(后缀为。obj)数据文件:其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。文件名⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀?例如: c:\code\test.txt为了⽅便起⻅,⽂件标识常被称为⽂件名。
2024-03-03 12:57:22
1899
1
原创 动态内存管理
对于内存的使用,不只是上述的情况,有些程序的空间只有在运行的时候才能知道,所以C语言给出了动态内存开辟,让程序员自己开辟和释放内存,这样就比较灵活了。3,函数调整空间失败,返回NULL,所以在在接收函数的返回值的时候,要用一个新的指针去判断,不是空指针的时候,才把新的指针赋给值p。()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。(1)在已经开辟好的空间后面,没有足够的空间,函数会在后面重新申请一块足够空间,同时把旧的空间拷贝过去,返回新的空间的首地址,
2024-02-28 20:03:07
999
原创 自定义类型2:联合和枚举
/这样很是浪费空间,比如:在使用书的特殊属性的时候,结构体里面有的是衬衫的特殊属性,但是用不了,换成下面的代码比较合适,比较节省空间。原本i的值是0x11223344的,但是改变对a进行父赋值了,i的值也改变了,下面的是两个变量的内存。2.当最大成员变量的大小不是最大对齐数的时候,联合体的大小是最大对齐数的整数倍,比如下面的这个。在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐。//使⽤枚举常量给枚举变量赋值。可以看出,他们的内存的地址是一样的,这也说明了联合体是共用一块内存的。
2024-02-16 22:43:52
940
1
原创 自定义类型1:结构体
上图为该结构体的内存布局,从c1开始,偏移量为0,int类型的i为4个字节,4个字节小于vs默认的8个字节,偏移量为4,从4的整数倍开始,占4个字节,从4到7,c2为char,占一个字节,位置为8,所有的内容最大偏移量为4,8为4的整数倍,所以内存的大小为8。在位段开辟内存的时候,是一个字节一个字节开辟的,当一个变量的内存不满8个比特位,不同的编译器是否会使用剩下的比特位还是从新申请一块内存是不同的。位段的⼏个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位。
2024-02-15 16:12:10
1623
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人