自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 实现一个进程池(精讲)

本文介绍了基于C++的进程池实现方法。首先阐述了父子进程通过管道通信的原理,然后详细讲解了进程池的三个核心类:管道类(channel)、管道管理类(ChannelManage)和进程池类(ProcessPool)。实现了进程池的关键功能包括:1)使用pipe()创建管道并fork()子进程;2)采用轮询方式选择子进程;3)通过任务管理类(TaskManager)实现任务分配;4)添加了进程关闭和等待机制。整个系统采用分层设计,父进程通过管道向子进程发送任务码,子进程执行对应任务。文中还提供了完整的代码实现,

2025-08-08 17:35:47 545

原创 库的理解与加载

上篇文章我们提到可执行程序是由.c文件编译成.o文件,然后再由链接器连接形成的。贴张图来描述:目标文件(.o文件)的格式是这样的那么什么是ELF文件呢?

2025-08-02 17:27:46 919

原创 动静态库的制作和原理

本文介绍了动静态库的原理、区别及使用方法。静态库在编译时链接到可执行文件中,运行时不再依赖,但占用空间大;动态库在运行时链接,多个程序共享,节省空间但必须依赖动态库。文章详细演示了如何生成静态库(.a文件)和动态库(.so文件),包括编译源文件、打包库文件、组织头文件等步骤。通过实例代码展示了静态库和动态库的使用方法,包括gcc编译时的-I、-L、-l选项,并解决了动态库路径问题。最后提供了Makefile自动化构建的解决方案,帮助开发者高效管理库文件。

2025-07-20 17:45:32 605

原创 文件系统(精讲)

本文介绍了磁盘存储与文件系统的核心概念。硬件层面解释了CHS寻址方式,通过柱面、磁头和扇区定位数据。在磁盘管理中,采用分块(4KB)和分组的方式组织数据。文件系统关键组件包括:inode存储文件属性,BlockBitmap和inodeBitmap记录存储状态,GDT描述块组属性,SuperBlock保存全局信息。目录实际是存储文件名与inode映射的文件,路径解析需要逐级访问目录。软链接是独立文件指向源文件,硬链接则共享inode作为文件别名,两者在文件删除时表现不同。这些机制共同构成了Linux文件系统的

2025-07-12 17:05:23 1056

原创 Linux基础IO

本文回顾了C语言文件IO操作,重点讲解了系统调用接口与缓冲区的概念。内容包括:1. 复习了C语言文件读写操作,演示了fopen、fputs、fgets等函数的使用;2. 介绍了Linux"一切皆文件"理念及默认打开的三种标准流(stdin/stdout/stderr);3. 详细解析系统调用接口open/close/read/write的使用方法及文件描述符分配规则;4. 通过代码示例讲解了输出重定向原理及dup2函数实现;5. 阐述了用户级缓冲区的作用、类型(全缓冲、行缓冲)及其提高I

2025-07-10 11:46:51 822

原创 自定义myshell(精讲)

我们这里只是探讨了shell的冰山一角,其实还有很多,但是,一直写就没什么意义了,自定义shell的意义其实就是打通之前所学的知识,将他们串起来,教学意义。

2025-03-20 15:40:21 1038

原创 算法01----移动零(C++)

我们这里要用到的算法是双指针移动,和我们之前学的快排的核心思想是一样的。我们看看怎么做吧。我会以图片的形式将我的思路告知大家。这就是整个题目的整体思想算法,大家理解一下,其实这道题目还是很简单的。

2024-10-21 22:54:31 300

原创 算法题---动态规划

题目展示:动态规划的题目我们一半分为5个步骤去分析,第一,状态表示;第二,动态转移方程;第三,初始化;第四,填表顺序;第五,返回值。

2024-10-14 22:30:19 330

原创 自己写string类

我们写string类不是为了和先人比较谁写得更好,而是去了解string最底层是怎么实现的,我们将通过这篇文章来自己实现string的一些简单的功能。大家和我一起动手实现一下吧。我先将string.h附在下面,上面写的所有函数都是我们要在string.cpp里面实现的。我们将一步一步实现string类。

2024-10-02 16:12:20 724

原创 STL--string类

我们从这篇文章之后就正式开始学习STL的string,字面看起来是不是像C语言里面的字符串之类的处理方法,是的,C++里面也是对字符串的一些处理函数,但是C++有很多这样的函数,给大家推荐一个网站 ,这个网站是C++的官网,里面有所有函数的使用方法,当我们不会用这个函数的时候就可以去这个网上去查。我们就来详细说说string类的一些重要函数吧。

2024-10-01 15:53:01 427

原创 C++伟大发明--模版

C++起初是不受外界关注的,别人觉得他和C语言没有本质上的区别,只是方便些,直到祖师爷发明了模版,开始和C语言有了根本的区别。我们通过一个小小的例子来搞清楚什么是模版,模版的作用到底有多大,平时我们想要写交换函数是不是这样写的。我们一般要通过函数重载来实现,但是这样做有两个坏处,第一是,代码的复用率不高,如果遇到其他情况我们也要自己重新写函数,第二,程序很难维护,一个地方出错可能全部要重新写,维护成本极高,所以,我们就使用模版,可以很好的解决这个困扰。

2024-09-18 21:31:34 581

原创 C++的内存分布

我们看一段代码。这就是C和C++的区别。C++的new和delete会调用构造函数和析构函数,但是malloc不行。这就是区别,当然内置类型也是一样的。

2024-09-16 11:09:48 698

原创 详说 类和对象

我们上一篇文章也说了构造函数,但是还有一个 部分没有讲,就是构造函数的初始化列表。初始化列表这个挺麻烦的,大家认真理解一下。1. 初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式2.每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。3. 引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。

2024-09-13 16:20:08 733

原创 详说 类和对象

类是什么呢?类就是我们上篇文说的命名空间,单独创建一个域,自己有自己的生命空间,那么类怎么定义呢?C++规定,假设 stack就是他的类名,那么前面要加个class,换行之后就是他的类的内容,类里面有定义的变量和我们自己的成员函数,要注意的是,C++兼容C语言,所以也是可以用struct代替class成为关键词的,唯一的区别就是,struct默认变量和成员函数是公有的,而class默认是私有的,为了更好理解,我们贴个代码。上图就很好的展现了struct 和 class的区别。

2024-08-31 16:08:46 686

原创 C++初阶--命名空间、输入输出、缺省函数、函数重载、引用

从这一篇章开始就进入C++了,这是一门建立在C之上的语言,也广泛应用在以后的工作之中,所以我们应该努力吃透这门语言。

2024-08-10 10:20:43 982

原创 非递归的归并排序

我们之前讲的快速排序有非递归的写法,那么归并排序也有非递归写法,我们一起来研究一下吧。,所以说,这次的归并排序就不能用搭栈的方法来实现非递归,那么,我们怎么实现呢?思路,我们让这个数组先每个数一组,然后,使每一组都有序,然后,使每两组都有序,以此类推,我们就可以让整个数组有序。废话少说,大家看图:相信我画的这幅图应该很清楚的表述了我的思路。

2024-08-03 10:44:07 304

原创 --归并排序--

归并排序是我们研究的最后一种排序了,那什么是归并排序呢?我们之前在力扣上面刷过一个题目,就是合并两个有序数组,其实也是和这个是一个思想借用第三个数组,然后将第三个数组拷贝给a数组,这样就实现了排序,接下来,我给大家展示一下归并排序的完整过程,这个动图很好的展现了归并的思想,但是我们首先是让左区间有序,然后让右区间有序,最后再归并。

2024-08-02 10:51:14 257

原创 非递归的快速排序

其实,我们快速排序还有一种更加快的方法就是不采用递归的方法,那就是非递归,所以这一篇文章我们就研究这个非递归到底怎么实现。首先,我们先思考一个问题:递归的时候,我们存到栈里面的到底是什么?以上图片简单模拟的是我们的递归过程,很直观地看出这个过程中,我们在栈里面存的是这个数组的区间,存的是区间!所以,我们可以模拟这个存区间和递归的过程,那么什么可以让我们存区间,并且取出区间,而且还要模拟递归的过程,后进先出,就是栈。

2024-08-01 10:08:28 307

原创 快速排序的优化--前后指针

我们前面文章讲的核心思想是haroe的核心思想,将keyi另一边的指针先移动,找比keyi小的,然后不动,再让keyi这边的指针移动,找比keyi大的,但是这种方法的局限性就是需要让keyi另一边的指针先移动,但是我们马上要研究的前后指针是不用考虑这么多,而且也很容易理解,这种方法也很实用,希望大家可以掌握。我们先上动图,让我们更好的理解一下这个前后指针到底是怎么实现的呢?就如图中所说,让cur和keyi比较,如果cur小于keyi,那么就让prev先走一步,然后将prev和cur交换,然后cur++

2024-07-29 10:57:40 337

原创 快速排序的优化1.0

单位是毫秒,HeapSort是堆排序耗费的时间,QuickSort是快速排序所耗费的时间,很明显可以看出其实堆排序的效率还是高于我们的快速排序的,但是我们还是不满足,我们就是要和堆排序肩并肩,和他平齐平坐,我们就要使用一些特殊手段,就像上面标题写的我们要将插入排序融合到快速排序里面去,这样效率就更高,具体怎么做?首先,我们先让这个程序运行一次单趟,然后就被分成了两组,将这两组分别插入排序,这样的效果就会好很多,达到和堆排序平齐平坐的效果,我们看结果。

2024-07-27 15:42:55 195

原创 面试重点---快速排序

快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。在研究快速排序之前,我们首先看一个动画,先自己看几遍,看能不能看懂它在干什么。这个动画就是我们快排的总体过程,如果你没有看懂也不用急,我用文字来帮助你理解这个过程。

2024-07-27 15:24:41 743

原创 插入排序和希尔排序

插入排序就是从第一个数开始,将前面的数都想成有序序列,将后一个数与前面的所有数比较排序。就好像我们玩扑克牌,先将手里的牌排好序,然后抽到的新牌再和前面的牌排序,这就是插入排序,下面有一个动图,能够帮助大家更好的理解。是不是已经理解了呢。但是我们要用代码实现,应该怎么做呢?

2024-07-19 10:29:55 475

原创 层序遍历及其应用

层序遍历就是将树放入队列中,按照“进父带子”的规则,依次将树里的数据遍历一遍。

2024-07-14 11:33:43 394

原创 二叉树实战演练

这五个题目都是围绕二叉树的题目,围绕二叉树的题目自然离不开递归思想,这个在五个题目里面每个都有用到,也是我们必须掌握的思想。望大家看了这篇文章之后都能有一定的收获。

2024-05-24 22:37:07 1039

原创 向上调整建堆和向下调整建堆的比较

我们上一篇文章讲解了向上调整建堆和向下调整建堆是什么,这一篇文章我们就仔细分析一下这两个建堆方式到底哪个比较好。

2024-05-19 20:50:52 329

原创 堆排序详解

肯定很多人都会想建大堆,但是可行吗?答案是不行,如果建大堆就是从堆顶拿最大数,但是拿走了以后,就会造成关系一团乱的局面,所以我们只能建小堆,然后将最小的与最后一个交换,然后不参与下一轮排序,这样就可以达到我们降序的目的。

2024-05-18 10:32:32 205

原创 函数栈帧的创建和销毁讲解

我们平时在使用函数时编译器是怎么工作的?内存是怎么处理的呢?使用的时候从来没有探究过这个底层逻辑,今天我们就从底层来讲解函数栈帧的创建和销毁吧。带领大家一起来探讨原理。首先我们先写一个简单的代码,如右图所示,创建了一个Add函数,然后main函数调用了他。

2024-05-17 23:11:40 440

原创 手把手带你实现堆

堆他是一个有规律的数据结构,除了叶子,他的每个节点都要满足两个子节点。所以我们将用数组来实现它。本篇以小堆为例。

2024-05-16 15:16:06 539

原创 二叉树详解

树的相关概念:节点的度:一个节点含有子树的个数称为节点的度。叶节点:没有子树的,度为0的称为叶节点,如上图的J,K,L 所示。父节点、子节点:如上图A和B的关系所示。兄弟节点:有共同父节点的亲兄弟节点。树的高度和深度:树的节点的最大层次,上图就是4。节点的祖先:从根到该结点所经分支上的所有结点,上图的A就是所有节点的祖先。森林:多棵不相交的树。

2024-05-16 14:09:50 459

原创 用栈实现队列,用队列实现栈

其实这个题目就是纯为难我们,没有什么实际的意义,但是有教育意义,可以考验我们对这两个数据结构的掌握。我们该怎么用队列来实现栈呢?我直接说方案吧,就是设置两个队列,用倒数据的方法来实现栈。

2024-05-13 21:43:12 253

原创 LeetCode---循环队列

在head出,tail进,但是这个如果用数组解决的话,就有问题,力扣给我们的接口有一个判空和判满,如果我们k等于4,那创造一个大小为4的数组,head和tail都等于0,所以队尾等于,tail减一,当head和tail相等时,该数组为空,但是当这个数组满了的时候,head和tail也是相等的,那怎么办呢?我们有两个解决方案,第一,设置一个size,第二,给数组多创建一个空间,如果k为4,那我们就把数组的大小设置为5。这样,我们实际上k的大小不变,但是每次都会多留一个空间,让head和tail保持不同。

2024-05-13 21:38:45 188

原创 LeetCode --- (有效的括号)

这就是整个代码的样子,整体思路就是:如果这个字符串解引用的字符是左括号,那就进栈,否则(右括号)就与栈里的栈顶的数据相匹配,一旦遇到不匹配的,那就返回false,还有一种特殊情况,就是左括号与右括号的数量不匹配,就有可能造成else走完了,并且都匹配,但是左括号剩了一个,所以出循环的时候要判断一下栈里还有没有数据。

2024-05-12 11:44:20 394

原创 栈和队列详解---(下)

队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的规则,进行插入操作的一端成为队尾,进行删除的一端是队头。

2024-05-12 10:58:10 821

原创 栈和队列详解---(上)

栈是一种特殊的线性表,其只允许在固定的一段进行删除和插入元素的操作。进行数据插入和删除的另一端成为栈底。

2024-05-10 17:02:56 399 1

原创 随机链表的复制

那就是我们申请四个节点,并且分别插在要复制的节点的后面,复制他的val,next指向本来的next,random就是原节点的random的next,这就是整体思路,很难懂,我们画一个图吧。

2024-05-02 15:38:29 74 1

原创 环形链表题目分析

1.为什么快慢指针能够相遇?2.如果我让slow走一步,fast走3步,4步,5步还能追上吗?

2024-05-01 14:59:33 450 2

原创 二分查找详解

二分查找的思路和二分查找的端点分析

2024-04-27 13:16:52 295

原创 单链表的几个经典算法题

相交链表;返回倒数第k个节点的值;链表的回文结构

2024-04-27 11:22:08 269

原创 结合C语言和链表来写一个贪吃蛇小游戏

C语言函数、结构体、链表、枚举、动态内存管理、预处理指令、Win32 API。

2024-04-25 15:46:12 649 2

原创 C语言程序编译和链接

C语言中存在着两种编译环境,一种是翻译环境,另一种是运行环境。翻译环境是将源代码转换成机器可执行的命令(二进制指令);运行环境则是将执行这项指令。

2024-04-05 10:49:46 786 1

空空如也

空空如也

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

TA关注的人

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