- 博客(34)
- 收藏
- 关注
原创 【C++初阶】--- 模板进阶
• 模板参数分类类型形参与非类型形参。• 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。• 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。注意:array• 在 C++ 标准库中,std::array 是一个固定大小的容器,它可以存储一组相同类型的元素。• array开辟空间的效率比vector要高一些,因为array开的是静态数组,是在栈上开的,而vector开的是动态数组,是在堆上开的,栈上
2025-04-29 22:53:41
683
3
原创 【C++初阶】--- stack、queue、priority_queue三个容器适配器的模拟实现
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要移元素;与list比较,空间利用率比较高。
2025-04-23 15:44:13
888
2
原创 【C++初阶】--- list容器功能模拟实现
在 C++ 标准模板库(STL)中,std::list 是一个非常有用的容器,它是双向链表的实现std::list 是一种序列式容器,它允许在序列内的任意位置进行高效的插入和删除操作。与数组和 std::vector 不同,
2025-04-17 21:59:33
1036
3
原创 【C++初阶】--- vector容器功能模拟实现
在 C++ 里,std::vector 是标准模板库(STL)提供的一个非常实用的容器类,它可以看作是动态数组。
2025-04-10 19:38:00
912
原创 【C++初阶】--- string类模拟实现
成员函数主要是_str、_size、_capacity这三个。npos是size_t 的最大值,用于当作后续成员函数的参数的缺省值。
2025-04-07 22:17:45
869
1
原创 【C++初阶】--- string类
std::string 类是 C++ 标准库中用于处理和操作字符串的一个类,它定义在 头文件中。相较于 C 语言里以空字符 ‘\0’ 结尾的字符数组(C 风格字符串),std::string 类提供了更便捷、安全且强大的字符串处理功能。
2025-04-02 21:52:41
633
2
原创 【C++初阶】--- 内存管理
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。class Apublic://默认构造:_a1(a1),_a2(a2)//拷贝构造//析构~A()//赋值运算符重载private:int _a1;int _a2;int main()//拷贝构造//匿名对象//隐式类型转换delete p1;delete p2;return 0;
2025-03-30 08:37:56
1047
3
原创 【C++初阶】---类和对象(下)
•之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。• 每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。• 引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。• C++11⽀持在成员变量声明的位置给缺省值,这
2025-03-29 10:05:03
937
1
原创 【C++初阶】--- 类与对象(中)
默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,我们主要需要掌握前4个,后两个了解以下即可,默认成员函数很重要,也⽐较复杂,我们要从两个⽅⾯去学习:• 第⼀:我们不写时,编译器默认⽣成的函数⾏为是什么,是否满⾜我们的需求。• 第⼆:编译器默认⽣成的函数不满⾜我们的需求,我们需要⾃⼰实现,那么如何⾃⼰实现?构造函数的主要任务是对象实例化时初始化对象。构造函数的本质是要代替我们之前Stack和Data类中写的Ini
2025-03-25 20:07:02
637
1
原创 【数据结构初阶&&八大排序】---冒泡、选择、插入、希尔、堆排、快排、归并、计数
通过以上代码我们会发现在最坏的情况下冒泡排序的执行次数是(n-1)+(n-2)+…+2+1,总共也就是n^2/2-n/2,所以时间复杂度是O(N*N),我们这里也并没有额外开很多空间,所以空间复杂度是O(1)最好的情况也就是待排序序列已经是有序序列了,此时我们循环执行的此时仅为n-1次,因此冒泡排序的时间复杂度在最好的情况下是O(N),不过这种情况概率极低。
2025-03-22 12:31:25
1127
原创 【 C++入门基础】---- 学习类与对象前的一些准备工作
• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。//wsj是我随意为变量空间取的名字//命名空间中可以定义变量/函数/类型int rand;int* a;int top;• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不再冲突了。int rand;//不再报错int* a;int top;
2025-03-19 22:44:23
876
原创 【C语言&&数据结构初阶】---基于单链表在控制台上实现贪吃蛇小游戏
表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系(0,0)的原点位于缓冲区的顶部左侧单元格。
2025-03-09 18:51:51
832
2
原创 【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题
对于堆我们是采用顺序表进行存储,因此定义了一个指向数组的指针a和存储数据个数和申请的空间大小的两个变量。int size;//数据个数//空间大小}HP;
2025-03-08 19:18:10
851
原创 【数据结构初阶】----栈和队列的基础功能的实现
栈的结构中包括一个指针a指向数据类型是STDataType的数组、一个记录数据个数的top,以及我们动态申请的空间大小capacity//元素类型int top;//栈顶的下一个元素//空间大小}ST;QNode结构体是单链表的节点,Queue结构体中存放的是链表的头指针和尾指针以及链表的长度size//队列:先进先出//以链表为基础实现}QNode;//因为后续函数要传的形参包括头指针和尾指针,二者要传的还是二级指针//对于多个参数,我们直接定义一个结构体方便后续使用。
2025-03-06 15:58:26
1030
原创 【数据结构初阶】---时间复杂度和空间复杂度了解及几道相关OJ题
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从和两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
2025-03-02 19:23:53
759
原创 【C语言】---双向链表的实现
哨兵位”就是双向链表的头节点,这个节点和其余节点一样有指向下一个节点的next和直线前一个节点的prev,“哨兵位”初始化的时候next和prev都指向自己,从而形成循环。包括节点值,指向下一个节点地址的指针next和指向前一个节点地址的指针prev。
2025-03-01 20:46:04
393
原创 【C语言】---- 动态顺序表的实现
需要注意的是:我们动态分配的空间需要先使用另一个指针变量先进行接受,确认成功申请到空间后我们再把申请到的空间给顺序表,不然如果申请失败的话会导致原本在顺序表的数据丢失。首先我们需要判断地址的有效性,确认有效后我们再把顺序表存放数据时申请的动态内存释放,并把指针置空,有效数据个数和空间大小赋值为0。当然,因为后续的多个功能也需要判断顺序表的功能够不够,因此我们需要单独为其写一个函数,方便后续使用和简短整体代码。(每次空间不够用再为其分配空间时,分配的空间是整体的2倍,这边涉及的是概率论,不仔细展开讲解)
2025-02-16 21:09:55
1049
原创 C语言--编译和链接
程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。将源代码程序被输⼊扫描器,扫描器的任务就是简单的进⾏词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字⾯量、特殊字符等)。编译过程就是将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,⽣成相应的汇编代码⽂件。链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
2025-02-13 17:53:50
783
原创 C语言--文件操作
ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
2025-02-12 15:21:10
685
原创 自定义类型:结构体
下图是⽹络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要⼏个bit位就能描述,这⾥ 使⽤位段,能够实现想要的效果,也节省了空间,这样⽹络传输的数据报⼤⼩也会较⼩⼀些,对⽹络 的畅通是有帮助的。仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的⼤⼩就会⽆穷的⼤,是不合理的。4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
2025-02-08 20:52:25
711
原创 整数和浮点数在内存中的存储
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8 bit位,但是在C语⾔中除了8bit的 char 之外,还有16bit的 short 型,32bit的 long 型(要看 具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤ 于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最 ⾼位的⼀位是被当做符号位,剩余的都是数值位。
2025-02-02 22:53:17
484
原创 C语言内存函数
以下面第一种为例,如果是从后向前复制,dest中的3就变成了src中的5,而这个3的位置是两个空间重叠的位置,如果采用从后向前复制的方法,当我们想把src中的3复制给dest中的1时,我们发现这个3已经被改成了5,复制错了,所以第一种我们只能采用从前向后复制的方法,同理,第二种我们只能采用从后向前复制的方法。和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的,如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。注意:复制的字节数num不能比source的字节数多。
2025-02-01 17:26:26
181
原创 字符函数和字符串函数
将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符,如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,str1的第n个字符>str2的第n个字符返回>0的数,反之返回<0的数,如果num个字符都相等,就是相等返回0。(4).那么如何判断两个字符串?
2025-02-01 15:16:37
897
原创 C语言指针详解
函数指针数组是一个数组,里面存放的每个成员都是指针,而这些指针指向的对象是函数,如:int(*p[5])(int x, int y) = { add, sub, mul, div },这里面的add,sub等都是函数名,而函数名就是函数的地址,int和(int x,int y)表示函数的返回类型和参数类型。如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL,NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。
2025-01-31 22:27:07
843
原创 C语言-----数组和函数实践:扫雷游戏
如果我们要实现的扫雷游戏的棋盘是9*9格式的,我们首先想到的是创建一个9*9的二位数组,如如果这个位置不是雷,则该位置存放0,如果这个位置是雷,则该位置存放1。假设我们要排查(2,5)这个位置时,我们就要统计该位置周围的8个格子里雷的个数(即有多少个1),这边我们可以i看到雷的个数应该是1。为了解决这种情况,我们就需要将存放数据的数组扩建为11*11规格的,在周围一圈的格子里面全部存放上0,这样我们就可以正常统计了。//输入非0的数则条件为真,游戏继续,输入0,则条件为假,游戏结束。
2024-02-07 17:31:40
1272
1
原创 C语言------插入排序法
以升序排序法为例,我们将上面这个数组中最左边的元素11看作一个数组{11},然后我们将下一个元素22插入这个数组,这时候这个数组就变成了{-11,22},然后我们将下一个元素33插入这个数组,这时候数组就变成了{-22,11,33},以此类推,不断的将下一个元素插入一个新数组中,这样的排序方法就叫做插入排序法;j--)//即前一个元素大于下一个元素。以上是一个以10个元素的整型数组,如果要以插入排序法进行排序,我们应该如何进行实现。插入排序法的大概思想:将一个元素插入一个数组中,从而将数组进行有序排序。
2024-01-20 14:53:44
410
1
原创 C语言------冒泡排序法
如果右边的那个元素大于左边的元素,就将连个元素的位置进行互换,这样我们就能把最大的元素排到最右边,然后再次从左到右开始新一轮的比较,排出第二大的元素、第三大的元素......冒泡排序法的原理是:从左到右将两个相邻的元素进行比较,拿升序排序法举例,我们可以看下面的动图。//如果标记变量count等于0,说明上面的if是不满足的。通过上面的动图,我们可以非常清楚的看到,冒泡排序法从左到右将相邻的两个元素进行比较,//即所有的后一位元素均大于前一位元素,升序排序完成。
2024-01-09 22:59:20
394
原创 分支和循环(下)------简单猜数字游戏的实现
知道了以上3个函数rand、srand、time后我们知道了如何生成随机数,使用求余的方法我们又可以规定生成的随机数的范围,知道了这些后我们就可以写一个代码来实现猜数字游戏了(猜1~100之间的随机数)。srand函数是用来初始化随机数的生成器的,程序中在调用rand函数前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,rand函数每次生成的随机数也就变化起来了。但这个函数返回的数是伪随机数,并不是真正的随机数。
2023-12-31 13:42:28
1011
原创 分支和循环
就像这个代码,我们先定义变量i的初始值为0,然后()里面写i<=2,因为0<2满足表达式,是真的,返回一个非0数1,程序开始执行{}里面的代码,先输出i,在让i++,然后把i++的值(即i等于1)再次返回到while后方的表达式里面继续判断是否为真,因为1<2为真,所以继续执行{}里面的代码,以此类推,不断循环,当i的值变为3的时候,此时i的值不满足()里面的表达式,程序便不再执行{}里面的代码,循环也就结束了。如果i的值一开始就不满足表达式,{}里面的代码也不会执行。
2023-12-14 22:28:10
1458
2
原创 【无标题】大一学生对于如何学习计算机的一些规划
作为双非二本的计算机学生,想进入大厂自然需要付出特别多的努力,也可能基本没什么可能进入大厂,不过人不能做一条咸鱼,有最求自然是好的,不过如果能进入中厂那也是不错的,目前对于大厂我也是只知道一些,比如微软,腾讯,阿里云,网易......,对于中厂我并没有去进行过多了解,对于自己现在想要进入什么厂我觉得也不能过早的下定义,不过有目标总归是好的,对此我也会在今后的学习和生活中去进行了解。所谓编程的目标,那自然是希望通过自己的努力能够在毕业前找一份工资能够符合自己期望的i工作,这也是大部分计算机专业学生的目标。
2023-11-18 22:37:01
139
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人