自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】--文件系统之软硬链接

其是通过名字引用另外一个文件,但是实际上,新的文件和实际的文件的inode是不一样的,应用场景上我们可以将其和我们的快捷方式。通过上文的学习我们知道,我们对于一个文件的查找,是通过其inode编号进行查找的,那么我们软硬链接是有啥作用的呢?硬链接不会多占空间,其只是通过改变硬链接数,其都是指向的一个inode底层的数据块区只有一个。首先就是软链接的inode和原文件的inode是不一样的,而且软链接的文件大小很小很小。abc和def的链接状态完全是一样的,其被称为文件的硬链接,内核记录了这个连接数。

2026-05-03 17:25:22 71

原创 【Linux】--磁盘和文件系统

磁盘是计算机中唯一一个机械设备,其有容量大、价格便宜的优点,但是其速度较慢。下面是一张磁盘的现实图片:我们将其上面的盖子打开,其内部大致如下:那个很光滑的是盘片,然后那个针是磁头。这只是其俯视图,其立体结构实际是这样的:磁盘的存储结构如下:一个盘片实际上是有正反两面的磁面的,然后每个磁面都有一个磁头,所以一个磁面都有其对应的磁头然后我们再看一个面上,一个磁面上又分了很多的磁道。

2026-04-27 21:48:00 434

原创 【Linux】--基础IO

首先我们明确文件就是:文件的内容+文件的属性(元数据)我们未来对于文件的操作无非就两种:1、对内容进行操作2、对属性进行操作那么我们对文件进行操作,那么首先要先将文件打开,那么要先找到该文件,那么就需要路径+文件名。那么我们有时候发现会有的直接使用的文件名的,这是因为文件的操作是由当前进程来完成的,那么就会使用这个进程的工作目录。那么我们如何打开一个文件呢?

2026-04-20 23:12:43 357

原创 【Linux】--自主shell命令行解释器

首先我们先明确我们自主的shell命令行解释器要达到的效果:1、能够处理普通的命令2、能够对内建命令进行处理下面我们就开始一步一步的解决。

2026-04-19 02:37:43 328

原创 【Linux】--进程控制

前面我们学习进程概念的时候,已经知道了,创建进程,我们可以使用fork函数进行创建。其是在当前的进程下创建一个新的进程,新进程为子进程,原进程为父进程。其给父进程返回子进程的pid,给子进程返回0,出错返回-1。进程调用fork后,当控制转移到内核中的fork代码后,内核做下面几个工作:1、分配新的内存块和内核数据结构给子进程2、将父进程部分数据结构内容拷贝到子进程中3、添加子进程到系统进程列表当中对于fork的使用和现象我们前面已经讲解的很清楚了。

2026-04-15 00:34:14 374

原创 【Linux】--程序地址空间

我们创建一个子进程,子进程会和父进程共享数据和代码,在对于数据修改前,我们的页表中,对于虚拟地址和物理内存地址的映射中,其实还有一个内容,就是权限,其一开始,只能是只读的状态,然后当我们的子进程发生了数据的修改,那么物理内存就会进程报错反馈,那么操作系统此时就会立马进行反馈,然后就会在物理内存中申请一块空间,给子进程,这种叫做写时拷贝。就好比如我们去银行取钱,那么我们中间需要通过取款机,或者柜台人员一样,我们用户是无法直接去金库拿钱的吧,这是操作系统为了保护我们的物理内存的一种方式。

2026-04-10 15:15:44 199

原创 【Linux】--命令行参数和环境变量

问大家一个问题,我们的main函数是否有带参数呢?答案是:有首先我们来看看这两个参数是啥意思,首先是argv[],这个参数就是命令行参数,然后argc就是表示我们命令行参数argv中有多少个数据。那么其有啥用处呢?命令行参数的本质应用是为了实现一个命令,其可以根据不同的选项做出不一样的操作,实现不一样的子功能,也是Linux中所有的命令选项功能的实现方式。

2026-04-08 09:22:24 365

原创 【Linxu】--进程优先级和进程切换

CPU对资源分配的先后顺序、其指的就是进程的优先权优先级高的进程那么就有优先执行的权利。配置进程优先级对于我们的多任务环境的Linux是很有必要的,其可以改进我们操作系统的性能。而且其还可以将进程运行到指定的CPU上,那么这样一来,就可以将一些不重要的进程安排到某个CPU上,这样就又可以大大的提高系统的整体的性能。那么其和我们前面提到的权限有何不同呢?优先级VS权限决定的是能不能做这个事情。

2026-04-05 23:31:02 369 1

原创 【算法】--双指针法

常见的双指针法有两种形式,一种是,一种是对撞指针一般用于顺序结构中,又称为左右指针。对撞指针一般是一个left指针从左边往右边移动,然后一个right从右边往左边移动,然后两个指针就都向中间进行逼近。对撞指针的终止条件一般是两个指针相遇或者错开,或者是在循环中,已经找到需要的答案,就跳出循环又称为龟兔赛跑游戏,其基本思想就是使用两个移动速度不同的的指针在数组或者链表等序列结构上移动这个方式经常用于处理环形链表和数组非常有用然后对于问题出现了循环反复的情况,那么我们都可以考虑一下快慢指针的思路。

2026-04-01 02:09:12 484

原创 【Linux】--进程状态

下面是操作系统的教材中的对于状态的说明:每个进程其每时每刻都有其对应的状态下面我们来看在具体的操作系统中是咋样的。

2026-04-01 00:16:29 313

原创 【Linux】--进程概念

我们常见的计算机如:笔记本,不常见的计算机如:服务器,大部分都遵循冯诺依曼体系结构目前我们熟知的计算机都是由一个一个的硬件组件组成的包括键盘、鼠标、扫描仪、写板等等含有运算器和控制器显示器打印机等冯诺依曼体系结构的特点就是:从输入到输出,数据都必须经过存储器(存储器指的是内存)那么为啥要设计内存这个东西呢?

2026-03-30 00:54:27 372

原创 【Linux】gdb的使用

代码的编译运行有两种模式debug和release模式,在gcc/g++编译器下,其默认是release模式,所以我们在Linux环境下,要想对代码进行调试,就需要借助gdb这个工具。其使用方法是使用gcc/g++对代码进行编译的时候,加上-g选项。run(r):程序从开始运行直到遇到:断点/结束/程序语法错误。delete 断点的编号(d 断点编号):删除指定编号的断点。可以认为gbd是Linux环境下对代码的调试的工具。info break(i b):查看所有的断点。

2026-03-26 10:00:43 243

原创 【数据结构】--链表OJ

这是牛客网上面的一道题目。题目描述如下:例如我们下面有这么一个链表:我们传入一个3。那么我们小于3的部分要在3的右边,要是就这个要求,那么还是很简单的。题目中还要求不可以改变数据的原本顺序,就比如我们上面这个数组,我们的x是3,那么我们的1和2要在前面,然后我们的1原来的顺序也是在2的前面的,那么我们弄好后,1还是要保持在2的前面。还有大于等于3的,其弄好后的顺序也应该为6、4、3。解题思路:我们可以创建两个链表,一个链表存放的是小于传入的x的,一个是存放大于等于x的。

2026-03-25 14:51:02 260

原创 【初阶数据结构】--排序算法

所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的 操作。下面是我们常见的几种排序算法:下面我们废话不多说,直接开始干货。

2026-03-24 23:22:45 278

原创 【Linux】自动化构建-make/Makefile

make:是一个命令makefile:一个文件make是一个命令行工具,其核心功能是根据预先定义的规则,自动操作。就比如我们提前预设好的一个流程,然后通过make去完成。makefile是一个文本文件,其就好比如我们的流程图,其中设定好了我们要操作的内容。其是make的操作手册。通过make来调用makefile文件,然后过程的实现在makefile文本文件中写。

2026-03-24 20:03:05 383

原创 【Linux】--基础开发工具->gcc/g++

预处理(进行宏替换/去注释/条件编译/头文件展开)编译(生成汇编文件)汇编(生成二进制文件)链接(生成可执行程序)

2026-03-21 23:26:27 340

原创 【Linux】--基础开发工具 ->包管理和在Linux中进行代码编译

vi/vim简单来说,他们都是多模式编辑器,不同的是vim是vi的升级版,其不仅兼容vi的所有指令,而且还有一些新的特性在里面。就好如语法加亮,可视化操作不仅可以在终端运行,也可以运行在windows上。在Linux系统下开发工具是独立存在的编写代码:vim编译代码:gcc/g++调试:gbd/cgbd构建工具:makefile/make/cmake/gitvim的三种基础模式:命令模式插入模式底行模式。

2026-03-18 00:04:42 337

原创 【Linux】--Shell的原理Linux的权限

Linux是一款操作系统,但是我们用户是无法直接接触到其核心的。广义的操作系统分为:操作系统内核,外壳程序命令行,必要的应用程序。我们的Shell就属于外壳程序命令行这种,然后外壳程序命令行还有图形化界面等。为啥我们用户无法直接操作Linux的核心呢?就拿我们使用windows操作系统为例,我们使用其是通过一个图形化界面来操作的,然后图形化界面再去操作底层。

2026-03-13 14:59:24 379

原创 【C++】哈希表--链式地址法

前面我们对于哈希表的实现使用的是开放定址法的方式。不过这种方式也不是当前的主流方式。

2026-03-03 13:32:05 664

原创 【C++】--哈希表

在数据结构与算法中,我们追求高效的数据管理,在计算机系统中,高效的数据管理是系统性能好坏的一个关键指标。哈希表是数据结构中一个很经典的数据结构,其以非常低的时间复杂度的插入、查找、删除的效率,其时间复杂度可以达到O(1)。其巧妙的通过关键码key映射到其对应的存储位置,实现几乎即时的索引查找。下面我们将从使用开始,然后到我们实现其进行学习。

2026-03-02 12:26:13 666

原创 【C++】--封装红⿊树实现mymap和myset

我们前面学习map和set的使用的时候,知道set是对应我们的key问题,然后map对应的是我们的key和value问题,所以这两者存储的数据是不一样的,然后其二者的底层又是使用的红黑树实现的,那么我们是否需要去对应其存储的数据的特点,然后分别弄一个红黑树呢?可以看到源码中,set和map是用的同一个红黑树。不过set中的红黑树的pair存储的数据是这样的:pair<K,K>。其让两个数据都存储key。然后map中的pair就一个存储key一个存储value。

2025-12-25 17:32:16 905

原创 【C++】--红黑树的概念和实现

在计算机科学的浩瀚领域中,数据结构是构建高效算法的基石,而树结构因其出色的层次性和查找效率,成为处理动态数据集合的核心选择。二叉搜索树作为基础的树结构,虽能实现快速的插入、删除与查找操作,但在极端情况下(如数据有序插入)会退化为线性结构,导致时间复杂度骤升至O(n),难以满足大规模数据处理的性能需求。

2025-12-18 01:55:44 716

原创 【C++】--AVL树的认识和实现

前面我们学习了二叉搜索树,其在一般情况下,对数据的查找的效率为O(logN),但是在极端的情况下,其时间复杂度会达到O(n)。如下:右边的单支或者接近单支的情况就会导致查找的效率变得很低。所以后来又发明了AVL树,AVL树是两个前苏联科学家在1962年发表的。其概念如下:AVL树最先发明自平衡二叉查找树,其是一棵空树,或者具有以下性质的二叉树,它的左右子树也都是AVL树,然后左右子树的高度差不能超过1。AVL树是一棵高度平衡二叉树,其通过控制高度差去控制平衡。

2025-12-14 16:27:39 932

原创 【C++】--map和set

可以看到其有三个模板参数,首先第一个是 要存储的数据T,这个就是我们说的key了。然后第二个是一个仿函数less前面我们学习优先级队列已经讲过了,其是一个比较谁小的函数,那么说明我们存储的数据要可以支持比大小。然后我们要是有别的需求,那么可以按自己实际的需求来写比较逻辑,然后将这个仿函数传入这个模板参数。然后set底层存储数据是从空间配置器申请的,要是需要可以自己进行内存池的实现,传给第三个参数,我们日常使用set一般都是只使用第一个参数,后面两个参数都是使用其自带的多。

2025-12-07 01:55:06 586

原创 【C++】--二叉搜索树

二叉搜索树其又叫二叉查找树,二叉排序树,二叉有序树等。其是指的一棵空树,或者具有下面几个性质的二叉树:1、若它的左子树不为空,那么左子树上的所有节点的值都小于它的根节点的值。2、若它的右子树不为空,那么右子树上的所有节点的值都大于它的根节点的值。3、而且其左右子树也都是二叉搜索树。4、然后二叉搜索树可以支持插入相等的值,也可以不支持插入相等的值,这个我们要看我们的使 用场景来决定。

2025-12-01 00:53:26 956

原创 【C++】--多态

多态的概念就是:就是有多种形态,在C++中多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态就是我们的函数重载和模板了,就比如我们使用cout函数的时候,前面我们将的时候是说其会自动去识别要打印的数据的数据类型,但是实际上其也是一种多态。其实际上是去调用的operator<<,然后其根据数据的类型去匹配调用。可以看到我们使用cout打印两个不同的数据类型,其在编译的时候实际上是使用的不同的函数。

2025-11-28 13:22:56 909

原创 【C++】--继承

C++中允许我们定义一个新类,然后其允许在一个基类的基础上建立的。然后这个新类我们一般称为派生类,然后这个派生类会继承基类的成员变量和成员函数,然后派生类还可以设计自己的成员变量和成员函数。我们继承的主要作用还是做到代码的的复用,还有就是我们一些类之间是有很大的联系的,两个类之间会有很多共同的部分。比如:我们定义一个老师、学生、保安等等的类,那么这几个人群中,其都有名字,身份证号,性别等等的共同的信息,那么我们就可以将其单独拿出来。老师:姓名、年龄、电话、身份证、工号。

2025-11-17 10:38:34 987

原创 【C++】--模板进阶

前面我们在模板初阶的时候,我们在使用模板的时候都是对数据类型进行模板化的操作的。那么啥是非类型模板参数呢?就比如说我们要设计一个栈,那么我们要初始化数组的大小,那么我们可以定义一个宏来初始化数组的大小。我们使用一个N来定义。但是我们会发现我们使用栈的时候,有的时候需要大一点的空间,有时候需要小一点的空间,那么我们要是经常修改这个N,就显得很不方便了。在C++中,模板中有一个非类型模板参数,其可以设计成一个确定的数据类型,然后可以实现我们宏的一些功能。我们在使用的时候就要传两个参数了。

2025-11-11 11:05:36 880 2

原创 【C++】--stack和queue

前面我们在学习初阶数据结构的时候,我们已经对这两个数据结构有了很深刻的认识了。栈的话,其是一种先进后出的结构,其有一个栈底和栈顶,那么其可以是数组的结构来实现的,也可以是链表的结构来实现的。queue的话其是先进先出的数据结构,其有个队尾和队头,其也可以是数组或者链表的结构来实现。下面我们看看在库中是如何实现的:可以看到库中的实现和我们在初阶数据结构的时候的实现是不一样的,其使用的是容器适配器,我们库中的stack和queue就有点像中间商这样,使用别的容器的功能来实现自己的功能。

2025-11-07 15:42:10 684 2

原创 【C++】--list的使用和模拟实现

List和vector一样也是C++标准模板库中的一个容器,其中文名就是我们前面数据结构学习的链表,那么其和我们前面学习的string类和vector类最大的不同就是其物理结构是不连续的,其是一个一个的节点构成的,然后list是一个双向带头循环链表:上面就是list的简单图示了,可以看到其一个结点4主要是三个部分,一个是存储的数据,然后一个是指向后一个节点,一个是指向前一个节点,所以我们也说在逻辑上我们的list是连续的。下面我们来看看其使用。

2025-10-27 21:32:18 1171 4

原创 【C++】--vector类的使用和模拟实现

那么我们有这么多用来存储数据的容器,vector其有什么优势呢?1、其会动态扩容,vector会自动的管理其容量,根据存储的需要进行调整2、其和顺序表是一样的,数据在物理上还有逻辑上都是连续存放的,那么我们就可以使用下标访 问,迭代器访问等。3、vector是模板化设计的,那么其就可以用来存储任何类型的数据,更符合我们泛型编程的要求。

2025-10-22 00:19:05 765 1

原创 【Linux】——基础指令(下)

前面我们学习了Linux的一些基础的指令,下面我们继续学习在Linux中一些常用的基础指令。

2025-10-14 23:35:18 827 4

原创 【C++】——string类的实现

我们要模拟实现C++库中的string类,然后自己手动的去实现一个string的类,那么我们首先考虑到的是,我们手动实现的string类要是也叫string类,那么就会和库中的string类起冲突了,所以我们可以将其放在一个命名空间中,命名空间可以根据自己的需求来取。然后就是我们的string类中的私有成员变量有三个:_str、_size、_capacity。这三个成员变量分别表示:1、指向字符串数组的指针2、表示字符串数组实际存储的字符个数3、表示这个数组的实际能存储的字符个数。

2025-10-06 00:53:25 658 3

原创 【Linux】--入门、基础命令

Linux是一个开源的类UNIX的操作系统,该操作系统的内核由林纳斯托⽡兹在1991年 首次发布, 其有个特点就是开源,即源代码是公开的,然后是免费被人们使用的,任何人和机构都可以自由的使用Linux的底层代码。那么啥是操作系统呢?我们知道我们的计算机是由软件和硬件组成的,操作系统就类似我们的大脑,有了操作系统更加方便我们去使用计算机。其就类似于我们和计算机的桥梁,让我们使用人和机器的交互。总结一句话就是,操作系统是管理计算机的硬件和软件的一个软件。操作系统的根本目的就是让计算机更加的好用。

2025-09-24 23:54:52 728 5

原创 【C++】——string类的使用(详细讲解)

由于stringkw=string类比STL发明要早,所以string没有被归到STL中,但是从归类上看可以将其和STL中的容器归为一类。string是一个类,虽然平时使用的是叫"string",但是实际上它是被typedef之后的。通过这个模板basic_string指定类型char定义的一个类string,可以认为是一个char类型的顺序表。

2025-09-21 23:35:10 1025 2

原创 【C++】--STL简介

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允 许 任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺 陷:可读 性比较低,符号命名比较怪异。由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性 一 般。

2025-09-11 13:22:34 211 3

原创 【C++】--模板(初阶)

1、要是我们有现成的函数那么其就直接使用现成的,然后对于<int>这种显示实例化的方式就相当 于我们指定其去使用模板,所以其就调用模板实例化出来的函数。2、对于非模板函数和同名模板函数,如果其他条件都相同,在调用时会优先调用非模板函数而不会从模板产生一个实例。但是如果模板可以产生一个具有更好匹配的函数,那么其将选择模板。

2025-09-07 21:02:22 628 5

原创 【C++】——内存管理

new和delete和C语言中的动态内存管理的最大的区别就是对于类对象开空间的时候,new和delete除了会开空间,其还会其调用类的构造函数和析构函数。还有就是new和malloc对于空间申请失败的处理方式也是不同的。下面我们先对malloc来实践看看其空间申请失败是如何反馈的:我们不断的申请空间,然后将这个申请的空间的地址打印出来:可以看到malloc空间申请失败的话其是会返回一个空地址的。下面我们看看new空间申请失败的情况:可以看到new的空间申请失败的话其不是打印空地址的,而且报错。

2025-08-24 00:26:58 1106 7

原创 【C++】——类和对象(下)

如果一个类定义在另一个类的内部,这个类就叫做内部类。

2025-08-04 19:58:13 1134 6

原创 【C++】——类和对象(中)—>赋值运算符重载+日期类的实现+const成员函数+取地址运算符重载

我们在对内置类型进行运算符的操作的时候,编译器是会将其转化为对应的指令,然后其完成运算的,那么对于我们的自定义类型,我们是否可以直接进行使用呢?下面我们通过代码来验证:可以看到对于自定义类型是无法直接使用赋值运算符的,这是因为我们的自定义类型,编译器是不知道如何进行运算的,就比如我们的日期类,我们知道每年有十二个月,但是编译器是不知道的,所以对于自定义类型,我们就需要自己根据实际情况去写。不过我们可以写一个函数来实现这个功能。

2025-07-23 03:29:28 641 2

小学生算术出题系统(1).cpp

小学生算术出题系统(1).cpp

2023-12-18

空空如也

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

TA关注的人

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