自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux:基础IO

ELF格式的可执行程序,二进制是有自己的固定格式的(elf可执行程序的头部,可执行程序的属性)

2024-04-20 23:59:45 687

原创 Linux:进程控制

WNOHANG: 若 pid 指定的子进程没有结束,则 waitpid() 函数返回 0 ,不予以等待。然后 shell 读取新的一行输入,建立一个新的进程,在这个进程中运行程序 并等待这个进程束。options==WNOHANG,非阻塞等待:对子进程进行检测,子进程没退出,直接返回0。参数: status 定义了进程的终止状态,父进程通过 wait 来获取该值。参数:status 定义了进程的终止状态,父进程通过wait来获取该值。当正常返回的时候 waitpid 返回收集到的子进程的进程 ID;

2024-04-20 20:19:46 1183

原创 C++:多态

先看到多态的定义:C++的多态是指在中,允许使用基类的指针或引用来调用派生类的虚函数的特性。这样的调用将根据对象的实际类型来动态绑定到适当的函数实现,实现了不同对象调用相同函数的不同行为。

2024-04-20 18:32:53 792

原创 C++:继承

继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。在软件开发过程中,我们经常会遇到需要为多个类添加相同的行为或属性的场景,这样就产生了代码重复的问题。为了解决这个问题,工程师们开始寻找一种方法来实现代码的复用。继承就是一种解决代码复用问题的方式。它允许我们创建一个新的类,继承自一个已经存在的类,从而继承和复用父类的属性和方法。通过继承,我们可以在不改变父类的前提下,为子类添加额外的属性和方法,实现功能的扩展。

2024-04-20 17:22:03 582

原创 C++:stack&queue&priority_queue容器适配器介绍

栈(stack)是一种先进后出(Last-In-First-Out,LIFO)的数据结构,它的特点是只能在栈的一端进行插入和删除操作。由于大堆要保证每隔父亲节点大于两个子节点,而除去最后一个节点,其它的节点已经满足堆结构了,所以此处需要将最后一个节点不断地与其父亲节点比较,如果其比父亲节点大,就交换位置,然后继续和新的父亲节点比较,直到比当前的父亲节点小,或者到达堆顶为止。但是至此我们的优先级队列还不是完全体,因为其只能固定是大堆/小堆,或者说优先级的比较方式是固定的,想要解决这个问题,我们就需要仿函数。

2024-04-20 16:39:07 799

原创 C++:由list引入迭代器介绍

现在由于我们是反向迭代器,我们的反向迭代器++,其实就是正向迭代器的–。

2024-04-20 15:54:46 658

原创 C++:vector的介绍

C++的vector是一种可变长度的,被广泛用于C++编程中。它是标准模板库(STL)中的容器之一,提供了比原始数组更灵活和方便的操作。vector可以存储任意类型的元素,包括基本类型(如整数和浮点数)和自定义类型(如类和结构体)。它的大小可以根据需要动态调整,而不需要手动管理内存。vector支持随机访问,即可以通过下标直接访问容器中的元素。它还提供了一系列的成员函数和操作符,如插入、删除和查找等,使得对元素的操作变得更加方便和高效。vector。

2024-04-20 10:16:27 614

原创 C++:模板初阶

当我们希望把一些类中的成员定义在类的外部时,那就需要声明和定义分离。假设我们希望分离析构函数~stack。//声明private://函数体所以我们的类模板也要类型::函数名来限定作用域。类模板的类型刚刚介绍过,就是stack//函数体对于类模板,当在类外定义函数时,要添加模板参数列表。//函数体。

2024-04-20 09:54:50 886

原创 DFS深度优先搜索刷题(二)

算法思想:dfs按列扫描,在每一列具体扫描中向下扫描行,设置行的状态,当某一行已经放过棋子,跳过此行,继续扫描下一行,直到找到没有放过棋子的一行,就将此行状态设置为真。算法思想:设置瓷砖状态st,这里瓷砖状态是否走过决定计数与否,因为可以重复走过但只记一次,所以可以不用回溯。每一次dfs都记录此时的坐标与进入可能的新坐标。算法思想:组合型枚举,带一个start变量保证以后的不小于start即可,在带一个即时记录所用数字和变量判断剪枝。类似上题,记录水格状态即可。ps:注意一列不放棋子的情况。

2024-03-26 23:32:46 268

原创 Linux:进程概念认识

进程的信息可以通过 /proc 系统文件夹查看进程id(PID) 父进程id(PPID) 通过系统调用创建进程 -fork 初识进程状态cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利.配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能查看系统进程用 top 命令更改已存在进程的 nice :

2024-03-25 11:19:20 841

原创 DFS深度优先搜索刷题(一)

第x位选择状态为未选择的数并给该数设置已选择状态,然后枚举x+1位直至枚举完,判断是否符合,并根据具体情况进行剪枝。,一共三个位置,先构造一个火柴用量数字表,根据表依次枚举每个位置的火柴表示数,最后符合。,在通过剪枝去除错误的方案来减少时间开销。两个条件后记录数+1,注意当火柴用量超出时剪枝。用dfs暴力枚举出所有组合情况,主要是通过。依旧dfs暴力枚举出每种排序,主要。x位以后可选的数是否最终能达到要求。,实现组合不重复的实现。,可以通过dfs深度优先搜索。,注意回溯时当前位置的置空。

2024-03-23 22:56:05 232

原创 滑动窗口(二)

算法思想:可以用哈希表记录是否已经采摘过扫描指针指向的水果(入窗口),如果没有,则令type++,然后判断当type>2时,则将left++(出窗口),令哈希表中left指向的水果种类-1直到为0时,type--,保证type

2024-03-23 20:15:13 337

原创 双指针(滑动窗口)-算法刷题

cur为扫描指针,dest为移动指针,初始cur为0,dest为-1;当dest移动到最后一个元素时,cur指向最后一个要复写的元素。但这里dest可能会超出(说明cur此时指向0),所以要先判断边界位置。

2024-03-22 19:17:25 1062 1

原创 C++:string的介绍

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。所以在C++的STL库中提供了更加方便的string类。

2024-03-08 16:41:35 722 1

原创 二分查找算法--刷题

二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为 O(n) 的数组,二分查找的时间复杂度为 O(log n)。实质是验证位置是否符合要求,将数组分为符合要求的区间与不符的区间,找到临界位置。但值得注意的是:二分查找主要针对的是有序数组。

2024-03-02 09:46:58 615

原创 Linux: GDB 调试工具

使用 i b 或者 info b 对 断点进行查看,且需要注意的是,如图上图所示,在每一个断点的最前端,都有一个编号,这个编号一但被某个断点占用,那么其他断点就不会使用这个编号!使用 n 或者 next 进行调试的逐过程,相当于VS中的F10进行代码的调试,使用的步骤是先使用 r 命令 进入运行阶段后,因为断点的原因,在使用n 进行代码的调试。它可以帮助开发人员定位和修复程序中的错误。进入 gdb 的工作模式后,可以使用命令 quit 或者 q 即可退出gdb 的工作模式,也就是退出调试。

2024-02-27 23:20:59 677

原创 Linux:进度条的实现

在创建进度条之前,首先要明白两个工具,fflush和\r。

2024-02-27 23:00:17 852

原创 Linux:Makefile的相关知识

左侧是变量名,右侧是变量的内容,也就说变量的值,同时可以用变量名代替替换的内容可以在依赖方法前加上@就可以在使用make时不显示依赖方法。

2024-02-27 22:37:36 806

原创 Linux:gcc的基本知识

链接是库和程序的结合,当一个语言被发明的时候是有一套标准的,而这个库也就表示着语言的标准库。当然,库也分类,在Linux中分为两种,第一种是动态库,通常以.so为后缀,且链接一般默认使用的库就是动态库,而另一种是静态库,是以.a为后缀的,并且在Linux中默认是没有静态库的存在,所以需要自己安装。

2024-02-24 21:32:15 1307

原创 Linux:vim的相关知识

配置文件的位置 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。当然,对于vim的配置,建议是每一个用户都在自己的用户目录下建立一个.vimarc的文件,进行属于自己的vim的配置而进行配置也十分的简单,在用户目录下建立好.vimrc文件后,直接使用vim 进入该文件,随后在文件中输入vim配置的常用命令。例如:设置语法高亮: syntax on。

2024-02-24 21:14:58 796

原创 linux中的权限

当文件的拥有者和所属组是同一个时,这就会产生一共疑问,我是拥有者,但拥有者没有这些权限,但我也是所属组,所属组有这些权限,但为什么还是不能使用这些权限呢?必要参数,下面参数是tar运行时必须要有的,有且仅有一个。在了解Linux的权限之前,我们需要知道Linux的构成,Linux分为三个部分,内核、外部程序、以及用户。权限 = 角色 + 事物的属性,而角色则是使用操作系统的用户,而事物的属性则是文件的权限和功能。,外部程序通常是使用一种子进程来进行传达用户输入的指令的,这是外部程序的一种保护自我的机制。

2024-02-24 20:43:11 1255

原创 linux中的文件操作

linux的理念在linux中的一切皆为文件!!!在上一篇博客中提到过,Linux中的桌面本质上也是一种文件,而现在,在本篇博客中要对这种理念进行进一步的提升,也就是在Linux系统中的一切皆为文件!这些文件中最为典型也是最经常使用的就是系统的显示器部分。换一句话来说,一、echoecho "字符串"

2024-02-15 10:50:03 1150 1

原创 linux指令小记(二)

1. mv剪切功能:mv [文件/目录] [剪切到的路径]如图,将 long.txt 文件 剪切到它的上一级目录中剪切并重命名:mv [文件/目录] [剪切到的路径] / [新名字]如图,将long.txt文件剪切到它的上一级目录中,并且进行重命名为111.txt记事本:nanonano是一个记事本,可以用来进行编辑,摁下ctrl+x,弹出询问,摁下y进行保存编辑内容,摁下n进行不保存编辑内容,最后回车退出nano的编辑状态cp [文件路径] [拷贝到的路径]

2024-02-13 21:24:01 270 1

原创 C/C++的内存分配

使用方法:realloc函数的原型为void *realloc(void *ptr, size_t size),其中ptr参数是之前由malloc或calloc分配的内存空间的指针,size参数表示新的内存空间大小。定位new在一些特定的情况下非常有用,例如在实现自定义的内存管理时,或者在某些嵌入式系统中,需要将对象放置在特定的内存地址上。其中,指针是一个指向已经分配的内存的指针,类型是要创建的对象的类型,参数列表是对象构造函数的参数。是一个数组定义过程,也是一个普通变量,被存储在A栈区。

2024-02-13 14:14:16 765 1

原创 C++:static成员和友元函数(四)

C++的静态成员是指在类中使用关键字"static"声明的成员变量或成员函数。静态成员与类的实例无关,而是与整个类相关联。它们在内存中只有一份副本,无论创建了多少个类的实例。静态成员变量:静态成员变量是属于整个类的,而不是类的每个实例。所有的实例共享同一个静态成员变量的值。它们在类的所有实例之间保持一致。静态成员变量必须在类的定义外部进行初始化。想要访问静态成员可以用:或者 静态成员函数:定义静态成员函数只需要在函数名前加一个关键字即可友元在C++中,可以使用友元函数和友元类来突破封装

2024-02-13 00:32:09 471 1

原创 C++:六个默认成员函数(三)

C++把类型分为内置类型(基本类型)和自定义类型。基本类型:C++语言自己提供的数据类型,如:int,char…自定义类型:我们使用class/struct/union等自己定义的类型。

2024-02-13 00:01:23 655 1

原创 C++:this指针(二)

即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。根据之前的博文,我们得知了类中的成员函数是处在一个公共的区域,类中的成员变量仅仅只是声明,只有在主函数内部定义了 以类为类型的变量,才算是开辟了成员变量的空间。所以因为找不到,也就是说编译器觉得这个是没有用的,所以空指针的效果是无效的,因为空指针无效,语法也没有问题,并且因为需要知道调用的函数的对象是谁,C++引入了一个隐藏的。

2024-02-12 21:54:30 973 1

原创 C++:类的介绍(一)

1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::成员变量命名规则的建议:我们看看这个函数,是不是很僵硬?class Datepublic://这里的year到底是成员变量,还是函数形参?所以一般都建议这样class Datepublic:private:int _year;

2024-02-12 16:40:25 988 1

原创 C++:与C语言相比的特点

看到一个示例:

2024-02-12 15:52:01 933 1

原创 各类排序小记

元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法稳定性:稳定希尔排序:希尔排序分为预排序和直接插入排序预排序是又称接近有序排序的排序,它是将数组内的元素进行分组,每一组内进行直接插入排序。当每一组都完成排序后,在对整个数组进行直接插入排序。代码实现:希尔排序其实就是直接插入排序的升级版本,本质上是将数组中的元素分为多组进行直接排序后,在将整个数组进行直接排序。

2023-12-10 11:52:40 825 1

原创 python区别小记

Python没有主函数,需要自创函数时直接调用就行。

2023-11-30 20:17:57 788

原创 linux指令小记(一)

F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;-a 或--time=atime或--time=access或--time=use只更改存取时间。功能:touch命令参数可更改文档或目录的日期时间,存取时间和更改时间,或者新建一个不存在的文件。-m 或--time=mtime或--time=modify 只更改变动时间。-d 将目录象文件一样显示,而不是显示其下的文件。-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。

2023-11-28 14:24:26 810

原创 贪吃蛇项目实现

/维护蛇的方向Right = 1,Left,Up,Down}Direction;//维护蛇的状态OK=1,END_NOMALint x;int y;}SnakeNode;//用来维护整个蛇的全局状态int Score;}Snake;七、游戏的流程:整个游戏分为三个部分:游戏开始:进行游戏窗口的设置,游戏的欢迎界面,游戏的地图创建, 蛇和食物的创建和初始化。游戏运行:游戏界面右侧的提示消息,分数的增减和食物的分数增减,获取按键的信息,蛇的移动。

2023-11-25 23:23:59 883

原创 用数组实现大小堆

堆的定义:因为堆的底层是数组所以定义一个数组的结构体,且看似一个顺序表,但本质上并不是顺序表,因为逻辑结构是一个完全二叉树,所以插入的要求要完全按照完全二叉树的要求来看,这里就需要用到之前完全二叉树存储到数组中后,父节点和子节点再数组中的下标关系。注意:size是表示结点的个数,而不是数组的下标,结点的个数始终是比数组的下标大1 ,所以之后的插入操作中 size 是表示需要插入的位置下标。堆的插入: 堆的插入和删除本质上是需要对堆的状态进行一种保持,例如,再插入前是小堆类型,那么插入后就

2023-11-25 22:34:05 875

原创 HTML前端小记

3.img标签(图片):scr属性--须写来显示图片;title属性--提示文本,当鼠标放到图片上时,就会显示title包含的文本;2.格式化标签:/--加粗字体,/--倾斜字体,/--加删除线,/--加下划线。1.换行标签直接换一行,段落标签换一行加空一行(相当于2个换行标签)。4.a标签(超链接):href属性--包含跳转链接,格式为

2023-11-25 21:54:11 351

转载 c语言中函数局部变量空间释放的理解

函数调用过程中,一个函数在调用另外一个函数的时候,会先将调用前的现场信息保存在系统堆栈中,然后按照从又向左的顺序(c语言)将实参的结果入栈,而被调用的函数的形参,用的就是实参的空间,当被调用的函数运行结束后,局部变量的空间被“释放”的本质,其实是栈顶的指针,移动到了调用前函数的现场信息的地方,所以刚才被调用的函数的局部变量,实际上它的值还是存放在内存中,并且在当前栈顶指针的上面的连续空间中。这个问题在初学c语言的时间困惑了我很长的时间,直到我学习了数据结构,学到系统堆栈那一部分才得到了解答。

2023-11-20 17:23:54 383 1

原创 为什么栈比堆快

而堆是运行时动态申请的,相当于将分配内存的耗时由编译阶段转嫁到了机器运行阶段,将分配过程从编译器搬到了运行的代码中。(栈是编译时分配空间,而堆是动态分配(运行时分配空间),所以栈的申请速度快)这里说的 “堆” 和 “栈”,并不是数据结构上的Heap跟Stack,而是程序运行中的不同内存空间。存储寻址速度快:栈的物理地址空间是连续的,而堆未必,查找堆的链表也会耗费较多时间,所以存储寻址速度慢。CPU硬件操作速度快:cpu有专门的寄存器(esp,ebp)来操作栈,堆是使用间接寻址的,所以栈快。

2023-11-11 20:58:05 79 1

原创 栈和堆区别

栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排;栈(操作系统):由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放。1、申请方式的不同。栈是连续的空间,而堆是不连续的空间。

2023-11-11 20:51:43 39

原创 局部,全局,静态变量

3).如果外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量,如果不再文件开头定义,按上面规定作用范围只限于定义点到文件终了.如果在定义点之前的函数想引用该外部变量,则应该在该函数中用关键字extern作外部变量说明.这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的.而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。另外,属于静态存储方式的量不一定就是静态变量。

2023-11-11 19:34:11 29 1

空空如也

空空如也

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

TA关注的人

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