自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 string的深入了解

(3)resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多 出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。

2024-07-26 17:21:47 713

原创 模板的初阶

比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码),那将会节省许多头发。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2024-07-14 17:06:20 325

原创 C++内存管理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用。malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。

2024-07-12 12:45:28 750

原创 类与对象下

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。成员函数,称之为静态成员函数。

2024-07-08 16:34:03 748 1

原创 类与对象(中)

自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。若未显式定义,系统会自动生成默认的析构函数。

2024-06-21 23:01:06 884

原创 类与对象(上)

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。类中的函数称为类的方法或者成员函数。(2)C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

2024-06-20 18:10:28 853

原创 C++初阶入门知识

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。在调用该函数时,如果没有指定实参则采用该形象的缺省值,否则使用指定的实参。

2024-06-18 22:08:38 767

原创 二叉树的深入理解

树结构相对线性表比较复杂,要存储表示起来就比较麻烦,既要保存值域,也要保存节点和节点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法,孩子双亲表示法以及孩子兄弟表示法等。树是一种非线性的数据结构,它是由n (n>=0)个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,叶朝下的。(4)双亲节点和父亲节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;(5)孩子节点和子节点:一个节点含有的子树的根节点称为该节点的子节点;

2024-05-06 21:04:27 652

原创 栈与队列的关系

如果操作系统课程讲解生产者消费者模型时,可以使用循环队列,环形队列可以使用数组实现,也可以使用循环链表实现。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。队列也可以数组和链表的实现,使用链表的结构实现更优一些,因为如果使用数据的结构,出队列在数组上出数据,效率会比较低。队列:只允许在一端进行插入数据操作,在另一端进行数据操作的特殊线性表,队列具有。入队列,进行插入的操作一端称为队尾出列:进行删除的一端称为队头。

2024-04-22 14:05:23 141

原创 顺序表与链表

静态顺序表的定长数组导致N定大了,空间多了浪费,少了不够用,所以现实中基本使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的数据表有:顺序表、链表、栈、队列、字符串…概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。(3)从堆是申请空间,是按照一定的策略来分配的,再次申请的空间可能连续,也可能不连续。(4)常用的两种结构。

2024-04-08 10:39:43 281 1

原创 时间复杂度和空间复杂度

一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道,但是我们需要每个算法都上机测试吗?是可以都上机测试,但很麻烦,所以才有时间复杂度这个分析方式,一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作执行次数,为算法的时间复杂度。在计算机发展的早期,计算机的存储容量很小,所以对空间复杂度很在乎,但经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度,所以我们如今已经不需要特别关注一个算法的空间复杂度。得到的结果就是大O阶。

2024-03-24 15:11:21 778 1

原创 编译和链接

(3)开始执行程序代码,这个时候程序将使用一个运行堆栈,存储函数的局部变量和返回地址,程序同时也可以使静态内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。由语义分析器来完成语义分析,即对表达式的语法层面分析编译器所做的分析是语义的静态分析,静态语义分析通常包括声明的匹配,类型的转换等,这个阶段会报告错误的语法信息。将源代码程序被输入扫描器,扫描器的任务就是简单的进行语法分析,把代码中的字符分割成一系列的记号(关键字、标识符、字面量、特殊符号等)。对下面代码进行编译的时候,会怎么做呢?

2024-03-04 22:11:07 763 1

原创 C语言的文件操作

每个被使用的文件都在内存中开辟了一个相对应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。我们程序的数据需要输出各种外部设备,也需要从外部设备获取数据,不同的外部设备输入和输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序推退出,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。

2024-03-03 13:23:01 795

原创 结构体类型解说

(4)如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍‘答案是不行的,因为Node是对前面的匿名结构体类型重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。仔细分析,其实是不行的,因为一个结构体中在包含同一个类型的结构体变量,这样结构变量的大小就会无穷的大,是不合理的。(2)如果传参一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。

2024-02-20 17:24:49 716

原创 整数和浮点数在内存中的储存

对于11位的E,这个中间数是1023.比如,2^10的E是10,所以保存成32位的浮点数时,必须保存成10+127=137,即10001001.这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应一个字节,一个字节为8bit位,但是在C语言中除了8bit的char之外,还有16位的short型,32bit的long型(要看具体编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题。

2024-02-17 21:36:31 810 1

原创 分支与循环的理解

而 do while 循环下是直接进入循环体,执行循环语句,执行循环语句,然后在执行while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再循环。while 和for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;|| :或运算符,就是或者 的意思(两侧至少有一个表达式为真,则为真,否则为假)。例子:输入一个整数,判断是否为奇数,如果是奇数则打印的是奇数,否则打印偶数。&& :与运算符,就是并且的意思(两则的表达式都为真,则为真,否则为假)。

2024-02-14 21:07:17 425 1

原创 字符函数和字符串函数的使用

在不同的系统和C语言标准库的实现中都规定了一些错误码,一般放在errno.h这个头文件中说明的,C语言程序启动的时候就会使用一个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们使用标准库中函数的时候发生了某种错误,就会讲对应的错误码,存放在error中,二一个错误码的数字很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。(4)strtok函数的第一个参数不为NULL,函数将找str中第一个标记,strtok函数将保存它在字符串中的位置。

2024-02-13 23:29:36 602 1

原创 深入了解指针

我们知道在计算机上的CPU(中央处理器) 在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效管理呢?上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对n就行修改,就不符合语法规则,就报错,致使没法直接修改n。但是也有局限性,void。(2)&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)

2024-02-05 21:59:05 1019

原创 扫雷游戏的设计

我们专门给一个棋盘(对应一个数组mine)存放布置好的雷的信息,在给另一个棋盘(对应另外一个数组show)存放排查出雷的信息。这样就做到了互不干扰。把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息后期排查参考。假设我们在排查(8,3)这个坐标时,我们访问周围的一圈8个黄色位置,统计周围个数是过程中,最下面的三个坐标会发生越界,为了防止越界我们需要在设计时,给数组扩大一圈。在9*9的棋盘上排雷时,我们可以在布置有雷的地方存放0,没有的地方存放1。

2023-12-24 22:37:55 399 1

空空如也

空空如也

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

TA关注的人

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