自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 Vector的简单模拟实现

注:如果传入的n大于现有的capacity()的值,reserve的扩容步骤一般是:提前记录_finish和_start的偏移量size,开辟新的空间tmp,将旧空间的内容拷贝到新空间tmp中,释放旧空间_start,将tmp赋值给_start并同步_finish和_end_of_storage的值。注:在写迭代器区间构造时需要定义一个模板,如果使用vector自带的迭代器就只能使用vector的迭代器区间去进行构造,就无法使用其他类型的迭代器区间进行构造了。在插入完成后返回pos位置的迭代器。

2026-02-25 14:38:17 567

原创 C++-Vector

迭代器使用场景//正向迭代器遍历while (bit!//反向迭代器遍历= reit)rbit++;2.范围for遍历//范围for遍历【注意】范围for只能正向遍历,无法反向遍历。

2026-02-25 13:26:21 847

原创 Vector源码

【代码】Vector源码。

2026-02-20 10:29:30 112

原创 String的模拟实现

为了防止自身模拟实现的string和编译器自带的string使用过程中产生冲突,自身模拟实现的string需要使用自定义命名空间进行包含。_str:string里面的字符串。_size:字符串的有效数据个数。_capacity:string的容量大小。npos:无符号整型的-1。

2026-02-14 19:28:35 672

原创 C++-String

1.2.1 string类的构造函数(constructor)默认构造函数(常用string();string s1;string s2;使用常量字符串构造string对象(常用//"ABCDEF"拷贝构造函数(常用使用str的一部分构造新对象,从pos位置开始len个字符参数介绍:str:已经存在的对象,可以是匿名对象,也可以是使用字符串隐式类型转换构造的对象。pos:起始字符位置,pos是一个无符号整型的下标。len:要构造的字符串长度,且带有一个npos缺省参数。

2026-01-28 16:29:42 686

原创 C++-模版初阶

类模板的定义方式和函数模板是一样的:

2026-01-22 18:49:09 570

原创 C++-内存管理

top = 0;int _top;int main()//申请一个Stack类的空间//连续申请多个Stack类的空间//释放单个空间//释放多个空间return 0;new和delete对自定义类型的使用方法和堆内置类型的使用方法是一致的。如果不使用()或{}进行初始化时,则会自动调用类的默认构造函数。new 类名。delete。

2026-01-22 13:01:02 591

原创 日期类的实现和具体细节

日期类的结构包含有3个内置类型的成员变量,且要设置成私有,不能随意被外部进行访问,其余的成员函数可以在外部进行访问,设置为公有。对日期类的成员函数分析:日期类的成员函数有几种,构造函数、析构函数、拷贝构造函数、运算符重载函数、赋值运算符重载,const成员函数等。

2026-01-16 14:01:26 633

原创 C++-类和对象(下)

2.每个成员变量在初始化列表中。

2026-01-16 13:59:51 605

原创 C++-类和对象(中)

例如:使用两个栈实现一个队列。

2026-01-14 19:34:45 617

原创 C++-类和对象(上)

类的定义和结构体类似。//类体:由成员变量和成员函数组成class是定义类的关键字,classname是类的名字,{}中为类的主体,注意类定义结束时后面的分号不能省略。类中的变量成为类的属性或成员变量;类中的函数称为类的方法或成员函数。1.声明和定义全部放在类体中。不过需要注意的是,如果类的成员函数直接在类里面定义,会默认为内联函数。2.类的声明放在.h文件中,成员函数定义放在.cpp文件中。不过需要注意的是,成员函数名前需要加类名。一般情况下更期望采用第二种方式。

2026-01-11 12:37:09 643

原创 C++-入门

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}内部的成员便是命名空间成员。//命名空间的定义//命名空间内可以定义变量、函数以及结构int data;//命名空间也可以嵌套定义int b1 = 1;//B1里面嵌套定义B2int b2 = 2;一个命名空间就是一个作用域,命名空间中所有内容都局限于这个作用域当中。多个名字相同的命名空间会自动合并为一个命名空间。

2025-12-20 02:21:19 893

原创 数据结构-排序

快速排序的递归过程类似二叉树的前序遍历很像,因此快速排序的框架。

2025-11-25 18:28:29 1008

原创 数据结构-二叉树

一、树的概念以及结构1.树的概念树是一种非线性的数据结构,它是由n(n>0)个有限节点组成的一个具有层次关系的集合。把它叫做树是因为其看起来像一棵倒挂的树,根在上,叶子在下。1.1 有一个特殊的节点,称为根节点,根节点没有前驱节点。1.2 除根节点外,其余节点被分为M(M>0)个互不相交的集合Tree1、Tree2、Tree3...Treem,其中每一个集合Treei(1<=i<=m)又是一棵结构与树类似的子树。每棵子树的根节点有且只有一个前驱,可以又0个或多个后继。1.3 因此树是递归定义的。注:树形结构

2025-11-20 02:21:37 917

原创 数据结构-栈和队列

因为队列需要进行头删和尾插相关操作,用链表的结构会更优一些,不过需要记录头结点的指针和尾节点的指针。当数据入队列的顺序为1234时,出队列的顺序也会只有一种:1234。(Last In First Out)的原则。压栈:栈的插入操作被称之为压栈/入栈/进栈,队列也分为两种:数组队列和链式队列。栈的实现方式有两种:数组栈和链表栈。栈除了要存储数据外还要保持。入队列:进行数据插入的操作,出队列:进行数据删除的操作,出栈:栈的删除操作叫出栈,

2025-11-03 03:06:40 403

原创 数据结构-链表

注:此处的cur是一个临时的结构体指针变量,用于存储结构体的地址,cur=cur->next相当于把cur指向的下一个节点的地址赋给cur这个临时变量,进行访问下一个节点。注:链表在逻辑结构上是连续的,但在物理结构上并不一定连续。并且链表的每个节点一般都是用malloc从堆区里申请出来的。注:链表的头插需要改变的是结构体指针phead,因此在传参时需要传入结构体指针的地址。逻辑结构是为了方便理解想象出来的,物理结构是实际内存中真实的存储方式。注:pos的值也不能等于phead,这一点可以进行另外的判断。

2025-10-31 20:28:16 1202 1

原创 数据结构-顺序表

注:顺序表的接口可以采用传值传参和传址传参两种方式,传值传参时形参是实参的临时拷贝,会有额外的空间消耗,传址传参则是传入结构体的地址,相较于传值传参,更推荐使用传址传参。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...但在物理结构上不一定是连续的,线性表在物理上存储时,通常以数组或链式结构的形式存储。注:静态顺序表的空间是固定的空间给少了可能不够用,空间给多了可能会浪费。相较于静态顺序表,更推荐使用动态顺序表。2.动态顺序表:使用动态开辟的数组存储元素。

2025-10-24 19:01:30 337 1

原创 数据结构-时间复杂度和空间复杂度

Fib函数在调用完Fib(2)后会把栈空间返还给操作系统,然后为调用Fib(1)申请栈空间,并且Fib(2)和Fib(1)用的是同一块栈空间,而且每一层的函数调用用的都是同一块栈空间,总共有N-1层。每次函数调用的时间复杂度都是O(1),总共有N+1次调用,因此递归阶乘的时间复杂度用大O渐进表示法可以表示为O(N)。递归过程中总共额外开辟了N个栈空间,递归阶乘的空间复杂度用大O渐进表示法可表示为:O(N)。随着N不断变大,N*N对F(N)的影响越大,2*N+10对F(N)的影响越小。

2025-10-21 15:11:58 661

原创 C语言-程序环境和预处理

程序同时也可以使用静态内存,存储于静态内存中的变量在程序整个执行过程会一直保持它们的值。条件不满足时,编译后的文件中不满足编译条件的代码会被删除。当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么使用宏的时候可能会出现不可预测的后果。3.最后再次对结果文件进行扫描,看看它是否包含任意由#define定义的符号,如果有,就重复上面的过程。1.每次使用宏的时候,都会将一段代码插入到程序中,除非宏比较短否则可能大幅增加程序的长度。函数调用需要做的事情:使用前准备,函数栈帧的创建,计算,准备返回值。

2025-10-18 04:49:01 885

原创 C语言-文件操作

从内存向磁盘输出数据会优先送到内存中的文件缓冲区,装满缓冲区后才一起送到磁盘上,当从磁盘向内存输入数据时,会将从磁盘中读取到的数据先存放到内存的输入缓冲区中,等输入缓冲区满了以后再逐个将数据送到程序变量区。每个被使用的文件都在内存中开辟了一块相应的文件信息区,用来存放文件的相关信息(例如文件的名称、文件的状态以及文件当前的位置等等)。文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出数据内容到文件中。程序可以从多个流中进行读写,常见的有键盘,显示器,文件等。

2025-10-14 12:13:37 1149

原创 C语言-动态内存管理

栈区主要存放运行函数时分配的局部变量,函数参数,返回数据,返回地址等。,柔性数组整体只需要一次性malloc和free即可完成对整个结构的内存的申请和释放,相较于多次申请和释放,可以有效减少malloc和free过程中的出错。3.包含柔性数组成员的结构可以用malloc()来进行内存的分配,且分配的内存至少要大于结构体的大小,以适应柔性数组的预期大小。2.1.7 如果ptr所指向的空间不是动态开辟的,那free函数的行为是未定义的。2.数组在声明的时候,必须指定数组的长度,它所需要的内存在编译过程中分配。

2025-10-10 18:56:17 980

原创 C语言-自定义类型

4.当一个结构包含两个位段,第二个位段成员比较大,第一个位段剩余的位无法容纳第二个位段成员时,剩余的位是抛弃还是使用也无法确定。4.如果有嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,嵌套的结构体的大小是自身最大对齐数的整数倍。传值传参时,形参是实参的临时拷贝,如果结构体比较大的话,系统的开销也会变大,会降低性能。注:当结构体成员变量包含自己时,那么这个结构体的大小就无法进行计算,所以是不合理的。2.位段涉及很多不确定的因素,位段是不跨平台的,注重可移植性的程序尽量避免使用位段。

2025-10-09 04:44:08 928

原创 C语言-字符函数和字符串函数

1.11.3 memcpy是专门用来处理不相关,不重叠的内存拷贝的,如果source和destination有任何的内容重叠了,那么结果是不可预测的。1.9.4 strtok第一个参数不为NULL,strtok函数将找到str中的第一个标记,strtok将保存它在字符串中的位置。1.1.1 字符串以'\0'作为结束标志,strlen函数返回的是字符串中'\0'前面出现的字符个数(不包含'\0')。1.9.3 strtok会找到str的下一个标记,并将其替换成\0,返回一个指向这个标记的指针。

2025-10-05 23:41:21 1112

原创 指针和数组解析

1.sizeof(数组名),sizeof里面单独存放数组名,这里的数组名代表整个数组。2.&数组名,&后面单独接数组名,这里的数组名代表整个数组。4.字符串数组和sizeof。5.字符串数组和strlen。6.常量字符串和sizeof。7.常量字符串和strlen。1.sizeof和整型数组。2.sizeof和字符数组。3.字符数组和strlen。8.二维数组和sizeof。

2025-10-04 20:48:23 251

原创 C语言-指针进阶

一维数组和二维数组传参都是传首元素地址,一位数组首元素的地址是一维数组类型的地址,二维数组首元素的地址是一维数组的地址,也就是数组指针。一般来说数组名通常是指数组首元素的地址,但有两个例外sizeof(数组名)和&数组名,这里的两个数组名是指整个数组。注:函数去掉函数名就是函数的类型,和数组一样,数组去掉数组名也是数组的类型。&arr和&arr+1的差值是40,跳过的是整个数组的大小。一位数组的传参,形参部分可以是数组,也可以是指针。二维数组的传参,形参部分可以是数组,也可以是指针。

2025-10-03 21:42:00 830

原创 C语言-深度剖析数据在内存中的存储

首先,E是一个无符号整数,这意味着,如果E为8位,它的取值范围是0~255,如果E为11位,它的取值范围为0~2047。signed char的数值存储范围为-128~127,unsihned char的数值存储范围为0~255,并且这是一个循环的过程。对于32位的浮点数,最高的一位是符号位S,接着8位是指数位E,剩下的23位为有效数字M。对于64位的浮点数,最高位是符号位S,接着11位是指数位E,剩下的52位为有效数字M。注:本质上内存中存放的是二进制,在VS上为了方便表示,显示的是16进制。

2025-10-01 10:43:28 602

原创 C语言-实用调试技巧

断点的作用:可以在程序的任意位置按F9设置断点,这样就可以让程序在想要的位置停止执行,继而一步一步执行下去。F10:逐过程,通常用来处理一个过程,一个过程可以是一个函数,也可以是一条语句。看错误提示信息,主要在代码中找到错误提示信息的标识符,然后定位问题所在。,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。(Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。,它包含调试信息,并且不作任何优化,便于程序员调试程序。

2025-09-26 21:16:32 1067

原创 C语言-结构体

当一些复杂对象(例如学生信息、书籍信息等)不能通过内置类型(int、float、char、double等)直接描述表示时,就有了结构体用来描述复杂类型的对象。结构体传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,那么开销也就会变大,所以就会导致性能的下降。成员变量是用来描述结构体对象的相关属性的。成员变量的类型可以是标量、数组、指针、甚至是其他结构体。结构体:是存放一组类型不一定相同的元素的集合。-> 操作符:结构体指针->结构体成员。数组:是存放一组相同类型元素的集合。

2025-09-25 13:19:16 261

原创 C语言-指针

当我们知道数组首元素的地址的时候,因为数组又是连续存放的,所以我们就可以通过指针来遍历访问数组。数组中数组名一般是指首元素的地址,数组名==地址==指针,数组是可以通过指针来访问的。指针变量就是指针变量,不是数组,指针变量的大小是4/8个字节,是专门用来存放地址的。数组就是数组,不是指针,数组是一块连续的空间,可以存放一个或多个类型相同的数据。真实的二维数组在空间中是连续的,指针模拟的二维数组在空间中可能是不连续的。野指针是指指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)。

2025-09-25 12:38:54 622

原创 sizeof和strlen的对比

3.strlen是求字符串长度的库函数,只能针对字符串,strlen会寻找字符串中\0的位置,统计的是\0之前出现的字符个数。1.sizeof是操作符,strlen是库函数,要引头文件(string.h)。2.sizeof计算的是占有内存的大小,单位是字节,不关注内存中存放的具体数据。

2025-09-23 11:56:31 219

原创 C语言-操作符

算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。如果某个操作符的各个操作数都属于不同类型,除非其中的一个操作数类型转化为另一个操作数的类型,否则操作就无法进行。CPU内整型运算器(ALU)的操作数字节长度一般就是int的字节长度(8个字节长度),同时也是CPU通用寄存器的长度。1.当表达式1(exp1)为真时,表达式2(exp2)计算,表达式3(exp3)不计算。的计算结果如果是真则返回1,如果是假则返回0。

2025-09-23 11:46:07 1115

原创 C语言-数组

注:地址打印出来是16进制的,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,其中A,B,C,D,E,F分别代表10,11,12,13,14,15。二维数组的使用也是通过下标的方式进行访问的,并且二维数组的行和列的下标也都是从0开始的。它就是数组访问的操作符。观察结果可知:二维数组在内存中也是连续存放的,并且地址也是由低到高变化的。数组的初始化又分为完全初始化和不完全初始化以及省略数组大小的初始化。数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。数组的下标是有范围限制的。

2025-09-19 12:08:29 563

原创 C语言-函数

在程序员敲代码中,会有一些经常用到的功能,比如打印(printf),字符串拷贝(strcpy),计算n的k次方(pow)等等,它们不是业务性的代码。我们在开发的过程每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库提供了一系列类似的库函数,方便程序员开发软件使用。1.在计算机学科当中,子程序(英语:Subroutine,procedure,routine,function,method,subprogram,callable unit)是一个大型程序的某部分代码,

2025-09-13 02:22:23 851

原创 生成静态库文件以及静态库文件的使用

3.最后引用头文件和输入#pragma comment(lib,"add.lib")就可以正常使用了。最后Ctrl+F5运行会在DeBug文件底下生成一个add.lib文件。2.常规--->配置类型--->应用程序改成静态库。目前已经拥有了add.h文件和add.lib文件。如下有一个add.h文件和一个add.c文件。1.在自己的项目文件中导入这两个文件。2.在头文件中添加现有项add.h。1.点中项目--->属性。

2025-09-13 00:39:38 183

原创 分支语句和循环语句

for语句中的break和continue在循环中和while中的意义是一样的,但continue一般不会导致for语句的死循环,因为for循环的调整部分并不在循环体中。continue是用于终止本次循环的,也就是本次循环中continue后面的代码将不会被执行,而是直接跳到while语句的判断部分,进行下一次循环的入口判断。默认的情况下if后面只能接一条语句,如果条件成立,并且想要执行多条语句,需要使用代码块,如下用{}括起来的就是代码块。for循环的初始化部分,判断部分和调整部分是可以省略的。

2025-09-08 15:37:43 917

原创 如何生成随机数

【代码】如何生成随机数。

2025-09-08 15:29:32 121

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除