- 博客(42)
- 收藏
- 关注
原创 C++学习记录(5)string的介绍和使用
其实在C语言阶段我们学过char类型,所以在当时我们认为字符串就是多个char,而且在<string.h>中我们学习了一大堆strcpy、strlen等函数的使用和实现,这还不够用吗?只能说确实在当时符合我们的需求,但是对于我们的面向对象OOP来说,C的字符串和函数操作其实根本可以说没什么关联。string类中有char*数组来管理数据,并且有一系列方法,比如像是length和size都与strllen类似,除了这种函数,还有运算符重载的[],<<,>>等更符合面向对象,使用起来更加方便。
2025-08-30 10:00:31
453
原创 C++学习(4)模板与STL
C++模板是一种泛型编程(generic programming)机制,允许开发者编写与具体数据类型无关的通用代码,通过参数化类型实现代码复用和类型安全。其核心思想是将数据类型视为参数,在编译时根据实际传入的类型生成特定版本的代码,从而避免为不同数据类型重复编写逻辑相同的代码。模板分为函数模板和类模板。STL(Standard Template Library,标准模板库)是C++标准库的核心组成部分,提供了一套基于模板的通用数据结构和算法组件,旨在实现代码的高度复用、类型安全和高效执行。
2025-08-26 16:09:01
1018
原创 C++学习记录(3)内存管理
前面其实没少说过,C++有很多功能创造出来都是为了优化升级C语言中的一些功能。比如这样一个场景://单个自定义对象申请空间对比free(p1);delete p2;//多个自定义对象申请空间对比free(p3);//多个自定义对象申请空间并初始化对比free(p5);delete p6;
2025-08-25 11:02:46
771
原创 C++学习记录(2)类和对象
在上面提到有两种定义类的方式,一种是用class关键字,一种是用struct关键字。class定义的成员在没有给访问控制符的修饰时默认就是private,struct默认为public。
2025-08-21 17:21:50
631
原创 C++学习记录(1)C++入门
namespace我们叫做命名空间,这是一个关键字,语法格式类似于结构体:namespace name(自己取一个名字)定义变量 函数 类等缺省参数是在函数声明或者定义时,给予形参默认值,如果调用该函数时,没有指定实参则采用给予的形参的默认值,否则使用指定的实参,缺省参数分为全缺省和半缺省。简单例子:C++的函数可以给缺省参数(或者说默认参数),如果传参不给,就用给予的默认值,给了就用指定的,完全符合定义。
2025-08-13 17:35:40
680
原创 数据结构(9)排序
排序在生活中无处不在,上学这么多年班级排名啥的总有吧,不可能一次都没见过;打游戏有的排行榜不也是有排序的思想在里面,排序倒不是什么特殊的数据结构,但是是非常重要的算法思想,所以在初阶数据结构的最后,学习一下常见的几种排序算法。当然,有些算法已经实现过了,比如冒泡排序和堆排序,到时候可以重写复习一下,但是不再展开具体细节了。
2025-06-11 21:01:21
2189
原创 刷题记录(7)二叉树
二叉树为二叉链表形式,结点为:大概看看题就知道这道题让我们判断一个树到底所有结点的值是不是相同,相同就是单值二叉树。在实现二叉树相关操作的时候已经体会到了,递归来遍历二叉树是非常舒服的(做这些题本质都得遍历)。所以我们考虑考虑递归怎么个递归法,而二叉树递归其实就是考虑根结点以及左右子树之间的关系。容易想到判断根结点与左右孩子结点是否结点,当然,由于需要访问左右孩子结点,根结点不能为空,而且因为访问的是三个结点的值,所以肯定三个结点都得先保证不为空。
2025-06-06 21:33:25
1818
原创 数据结构(8)树-二叉树
堆的特性(完全二叉树)使得底层用数组来实现更加容易,而正常我们的二叉树肯定用链表就可以减少空间的浪费,在这里我们写的只是一般的树及其相关操作,因此就用二叉链表实现。
2025-06-04 21:03:37
829
原创 数据结构(7)树-二叉树-堆
树还是太难了,所以我们初阶阶段就把目光放在二叉树上,二叉树顾名思义,最多就分两个叉,也就是一个结点的子结点不得超过两个:即结点的度不能超过2。且二叉树的子树有左右之分,顺序不能随意调换。这样看起来可以说是舒服多了,在树形结构中应用最多的就是二叉树,这也确实比树好区分一点,毕竟人习惯分左右,我真的在日常生活中见过很多人不分东南西北,更别提那些东北了,西南了这些方向,如果实现分好多叉的树那不更晕了。
2025-05-29 20:50:13
932
原创 刷题记录(6)栈与队列相关操作
读题其实不老有感觉,就是左括号必须用与之对应的右括号去对应,也就是(),[],{},可以嵌套,但是必须对应顺序:[()],这样就不行:[{)]。
2025-05-25 21:18:25
623
原创 数据结构(5)线性表-栈
栈是一种特殊的线性表,特殊性体现在,它只允许在固定的一段进行插入和删除操作。可以进行插入和删除操作的一段叫做栈顶,另一端叫做栈底。如图:所以栈的数据一般符合“先进后出”或“后进先出”的特点,因为只有栈顶可以进行数据的改写。栈既然是线性表,逻辑结构上就是线性的,但是物理结构上不一定是线性的,如果底层用数组来实现,那么就是线性的,但是如果用链表来实现的话,那么就又不好说了。
2025-05-23 16:52:03
449
1
原创 数据结构(4)线性表-链表-双链表
迟来的分类,主要如果在学习单链表前去讲分类,可能就云里雾里的,所以放在讲完单链表后讲。划分链表的标准如下:有没有头结点、指针的方向、循环与否头结点就是一个占位结点,也被叫做哨兵位,一般就是标识起点、防止链表为空,本身不储存任何有效元素(就类似于我们高速上看到的,前方多少米服务区,前方多少米进入什么地界,碰到头结点就知道遍历到链表的头结点了)。指针方向一个是只能从前往后遍历,另外一个双向的就是既有指向前一个结点的指针,也有指向后一个结点的指针。
2025-05-21 19:25:09
1813
原创 刷题记录(5)链表相关操作
题目要求很简洁,批量删去链表元素里为val的结点,返回删除结点后的链表的头指针。很容易想到用我们写过的Find函数,再用我们的删除函数,Find函数免不了对链表元素的遍历,删除函数也免不了遍历,前者是因为必须遍历去对比,后者因为删除函数删除某结点必须知道前一个结点,那就也免不了去遍历。
2025-05-20 18:04:57
766
原创 数据结构(3)线性表-链表-单链表
单链表一般作Single List单链表是什么东西呢?单链表就好像是火车一样,火车的每个单位是车厢,车头是动力,车厢与车厢之间存在有结构连接。为什么要这么对比呢?单链表的基本单位就是结点,结点与结点之间由指针连接起来,这是静态的看;火车在淡旺季可以选择加车厢和减车厢,而我们的单链表对应的操作就是增加或者删除结点。单链表属于链表,根据指针的方向取名单链表,单链表结点间的指针方向是只有一个的。
2025-05-16 19:28:19
906
原创 刷题记录(4)数组元素相关操作
大概读一下题就是,现在给你一个整型数组,整型数组里有一系列值,然后我给你一个特定的值val,需要你把数组里面等于val的值全部删去,最后得到的数组的顺序无所谓,返回数组中除了val值以外的元素的个数,不在乎数组中元素顺序。
2025-05-14 17:45:26
654
原创 数据结构(2)线性表-顺序表
这次学习的顺序表就是属于线性表,符合线性表的特征,即逻辑结构是线性结构,且数据顺序存储(底层实现类似于数组,或者说借助于数组)。
2025-05-13 16:07:11
714
1
原创 数据结构(1)复杂度
数据结构是计算机存储、组织数据的方式,是数据相互之间存在一种或者多种特定关系的集合。没有一种单一的数据结构可以解决所有问题,因此要学习多种多样的数据结构。如:线性表、图、树等。
2025-05-09 20:56:07
746
1
原创 C语言学习记录(18)预处理详解
其实这个也用的不少了基本格式就是 #define name stuffname是给这个常量起名什么,stuff是常量的内容,可以是数值,也可以是关键字等。前面将编译和链接的时候已经说过,#define定义的内容在预编译阶段就全部替换,这个替换就需要多多注意。例:一加;最后替换的时候会替换为:那这样肯定不符合printf对参数的要求再看一段代码:这段代码也没有什么实际意义,就是如果你#define定义了以后又加了个;,那么它还是原封不动的给你替换,那么这样if语句就是if(a < 0)
2025-04-24 16:42:01
904
原创 C语言学习记录(17)编译和链接
编程语言的最开始就是二进制(机器语言),因为计算机的硬件只能识别0和1(比如电路信号的有无),但是如果我们编写程序的时候你写一大堆0和1,别说给别人看了,你自己睡一觉第二天起来还能看得懂吗;二进制语言发展以后出现了汇编语言,有了简单的命令:ADD MOV等。但是即使有了这些简单的命令,仅仅了解这些也还是不够的,这个时期不仅需要熟悉命令,而且对计算机的硬件也要足够的了解;
2025-04-22 21:02:20
825
原创 C语言学习记录(16)文件操作
前面学的东西感觉都跟写代码有关系,怎么突然就开始说文件了,有什么用呢?其实,文件是另一种数据存储的方式,学会使用文件就可以让我们的数据持久的保存。
2025-04-21 20:33:52
1037
原创 C语言学习记录(15)动态内存管理
从长度上来看,其实没有多难,参数是size_t size也就是你要开辟多少个字节的大小,malloc申请的是一块连续可用的空间。如果开辟成功,返回一个void* 的指针,这个指针存的地址是动态开辟的内存空间的地址,实际上指向这块内存空间最开头那个字节。如果开辟失败(内存不够之类的问题),返回一个NULL。其中,对于开辟成功的void* 该怎么理解呢?void*首先是一个指针变量,我向系统申请了一块空间,肯定是想用来存某些东西的,想办法管理,对于内存,最方便的就是用指针管理。
2025-04-16 20:03:25
633
原创 刷题记录(3)C语言中的字符
这篇文章是对我这段时间疑惑的一个总结,因为自从学了字符串函数还有整型数据在内存中的存储,包括之前学的分支循环都不乏有字符的身影。最近的一道题算是让我的疑惑达到顶峰了:int main()int i=0;for(i=0;i<1000;
2025-04-14 20:57:41
747
原创 C语言学习记录(14)自定义类型:联合和枚举
我们在刚开始学C语言的时候学习的都是内置类型,char int long double等类型的数据;上次又学习了自定义类型其中之一的结构体,有了这样的基础,继续学另外一个自定义类型,联合。
2025-04-09 20:22:12
794
原创 C语言学习记录(13)自定义类型:结构体
结构体变量我们学操作符的时候就顺带讲了一点了,因为当时讲了结构体成员变量访问操作符'.'。结构体变量不像int、float这种内置类型的,一旦创建,系统就知道这是干啥的,结构体变量是那种我们想要在一个个体中存在多个变量用来储存数据所用的。也可以说是对我们要用的一系列变量的封装,全部装到一个结构体中。比如我们之前所举例的:对于一个学生个体,我们想要得到他的名字成绩和学号等变量。一般的:struct tag。
2025-04-07 21:06:47
604
原创 C语言学习记录(12)数据在内存中的存储
整型在内存中存储是分为两种类型的,整数的二进制位有三种表示形式,原码、反码和补码,可以知道的是,如果是一个正数,他的原码、反码、补码是完全相同的;如果是一个负数,那么直接转换成二进制序列得到的是它的原码,符号位不变,其它位按位取反就是它的反码,反码+1就是负数的补码。根据国际标准,任意一个二进制浮点数V可以表示为V = (-1)^S * M * 2^E。其中(-1)^S表示符号位,0为正数,-1为负数。(类似于整数符号位的意义)M表示有效数字,一定是一个大于等于1,小于2的数字。2^E表示指数位。
2025-04-01 20:18:16
855
原创 C语言学习记录(11)C语言内存函数
这三个参数可以说是非常的熟悉,destnation是复制到哪,source是从哪复制,num是复制多少个内存空间的数据,单位为字节。返回值为一个指针,指向destnation的位置。观察到指针类型全部都是void*类型,意味着可以对任意类型的数据进行操作(接收和使用)。比如:参数没啥好讲的,跟memcpy函数的参数的意义完全一样。这个函数可以用于非重叠内存空间的复制,也可用于重叠内存空间的复制。
2025-03-30 17:47:16
966
原创 C语言学习记录(10)字符函数和字符串函数
已经多次使用了,并且在做指针和数组相关的题目时经常碰到这个函数。作用原理:给一个字符的指针,从这个指针所指的元素向后依次遍历并计数,直到遇到'\0'就停止,返回一个无符号的整型size_t,意为字符串的长度。这玩意有俩参数,一个叫char*destination,一个叫cahr* source,也就是一个是源头,一个是目标。
2025-03-26 21:44:11
851
原创 刷题记录(2)
sizeof是一个关键字,它不管你是值,表达式,还是指针等等都不会管,只在乎你给他的数据在内存空间中所占的大小是多少,单位是字节。
2025-03-23 17:23:09
811
原创 C语言学习记录(9)指针
道理很简单,像高中大学的住校生,都逃不开的就是宿舍,宿舍可以说是用来存放学生和行李的一个地方,每个宿舍都有编号,目的就是为了方便管理。比如今天要找某一个学生,假如一栋楼有200个房间,难道你就准备一个一个的去找吗?这个时候编号就有作用了,学校经常会自己分配或者让学生填写宿舍信息表,有了这个表以后,找学生就十分容易了。
2025-03-19 21:40:52
806
原创 刷题记录(1)
问题描述:“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
2025-03-11 19:21:50
868
原创 C语言学习记录(8)操作符详解
算数操作符: + - * / %移位操作符:>>(向右移位) <<(向左移位)位操作符:&() | () ^()赋值操作符: = (后面都是复合赋值) += -= *= /= %= >>= <<= &= |= ^=单目操作符:!关系操作符:> < >= <= ==!逻辑操作符: && ||条件操作符:?逗号表达式:,下标引用操作符:[]函数调用:()结构成员访问: . 、->
2025-03-07 19:53:01
612
原创 C语言学习记录(7)函数递归
学习函数,绕不开的就是要学习函数递归,那么什么是函数递归呢?我们先不站在程序员的角度来说,先回忆一下我们学习过的数列,在中学的学习中,往往有一类题是给出一下条件,其中最为常见的就是递推公式,一般都是由题中条件推出通项公式,那解题就迎刃而解了。回到我们的C语言中,函数的递归用一句话就是函数自己调用自己。这里为什么要提到“递推公式”这个玩意呢?且听我给你慢慢道来。
2025-03-05 17:17:24
784
原创 C语言学习记录(6)函数
想要真正能够立足,肯定不能光靠库函数,库函数终究是别人创造出来的“功法”,想要自己能够独步江湖,肯定也是要有自己的本事在身的。ret_type fun_name( 形式参数 )ret_type是指自定义函数的返回类型;fun_name是自定义函数的函数名(一般根据实际的意义取名,只是为了方便人们记忆);()里放的是形式参数一般旨在指明参数类型;{}中是函数体,承载为达目的所编写的语句。对于自定义函数,创造的时候要注意三板斧。
2025-02-05 16:15:12
585
原创 C语言学习记录(5)数组
数组是一组相同元素类型的集合。由此我们可以知道:数组存放1个或者多个元素(总得有一个元素你才能确定这个相同的类型是什么);数组元素类型相同引入数组的目的也是非常非常好想,假如说一个程序需要一系列相同类型的数参与运行,但是呢,如果你一个元素一个元素的创建来引入,那就会拉的非常非常长,例如:这还是元素比较少的情况,如果20个元素,100个元素呢,那将会把战线拉的非常长,写程序肯定忌讳重复的工作,我们旨在用巧妙的程序解决问题。数组除了一维数组外还有多维数组,多维数组以二维数组最常见。
2025-02-02 15:34:42
859
原创 小游戏(1)猜数字游戏
学过了scanf,printf函数和分支、循环语句。在此基础上我们了解三个函数,用来制作一个猜数字游戏。游戏要求:1.生成1~100的随机数,2.猜数字的过程中,猜大猜小都要给出反馈,直至游戏结束,且玩完游戏以后可以选择继续游戏或者退出游戏。3.在1和2的基础上,也可以限制猜的次数。
2025-01-24 17:41:36
874
原创 C语言学习记录(4)循环语句
while(表达式)语句;这点类似于我们学的if语句,即先判断是否符合条件符合就进入循环。例:我们说过非0表示真,那么我们在判断条件给出1时, 他将会死循环的一直打印语句。while循环的执行流程如图所示:(取自网络图片)
2025-01-24 09:26:47
591
原创 C语言学习记录(3)分支语句
C语言为我们提供了3种语句,用来完成生活中所有事情的每个步骤,分别为顺序、分支、循环三种语句,由这三种语句我们可以解决生活中所有事物,可以说是包罗万象。这次主要是来学习分支语句,大体上只有if和switch语句。
2025-01-22 09:42:46
984
原创 C语言学习记录(2)数据类型、变量、常见运算符
从最简单的char开始,char(character)就是代表字符,例如:给出类型即可使用并打印。
2025-01-17 11:16:18
643
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人