自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux系统、网络知识点回顾1

当主机需要发送数据时,如果不知道目标 MAC,就会广播(报文的目的MAC是0xfffffff) ARP 请求,目标主机返回自己的 MAC 地址,随后缓存该映射关系用于后续通信。//仿muduo库,在外部线程调用RunInLoop,不需要立刻得到结果,所以可以把任务放到EventLoop的任务队列,后面执行到任务队列的任务时,如果不在,就发给默认网关,最终通过网卡把数据帧发送出去。相比之下,多级页表虽然访问次数更多,但结构简单、可预测、缓存友好,并且支持按需分配,因此成为主流方案。// 所有线程直接访问。

2026-04-19 15:18:09 412

原创 LeetCode热题100(2)

以示例二为例,我要算出下标 2 这个位置可以盛多少雨水,是不是需要往下标 2 的左边看看找到最大高度 4 ,然后往下标 2 的右边看看找到最大高度 5 ,而盛水多少是取决于,两个高度较小的那个,选高的那个高度绝对溢出,那这个地方就要选择下标 0 ,然后再用 height [0] 减去下标2 位置的高度就可以得出结果了。1、题解:示例1先是插入(1,1),再插入(2,2),当get(1)后,再插入(3,3)时,发现淘汰的是(2,2),说明不管是查找元素还是插入元素,都要让这个元素成为最近使用的。

2026-04-08 16:57:36 418

原创 MySQL---索引特性

Page分为目录页和数据页。目录页只放各个下级Page的最小键值。查找的时候,自顶向下找,只需要加载部分目录页到内存,即可找到目标数据页,完成算法的整个查找过程,大大减少了IO次数上面我们讲的都是 InnoDB 下的索引结构,一般我们建表插入数据的时候,就是在该结构下进行 CURD。

2026-03-29 01:12:12 358

原创 LeetCode热题100(1)

还有一种办法,我们不是把数组排序了吗,那当我找到一组成立的结果时,如果有重复的数字,也是在结果附近,我直接比较附近的数的大小,移动我的 left 指针和 right 指针不就好了;这道题要我们找到数字连续的最长序列,并且时间复杂度为O(N),看了上面几个实例,会发现给的数组是有可能出现重复的数字的,所以我们在找数字连续的最长序列时:应该先去重,把所有元素都扔到哈希表。(1)暴力算法:我们第一眼想到的就是我固定一个数,遍历,再固定一个数,再遍历,然后求和,这样的话时间复杂度肯定是O(N3)

2026-03-28 15:37:42 406

原创 Linux系统--信号

(1)在使用 sigset_t 类型的变量之前,⼀定要调用 sigemptyset 或 sigfillset 做初始化(将所有信号的bit 位置0),使信号集处于确定的状态。来存储,这个类型可以表示每个信号的“有效”或“无效”状态;(2)sigismember是⼀个布尔函数,用于判断⼀个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1。:在进程间通信的“管道”模块,当A进程的读端关闭,B进程的写端继续写时,OS会给写端进程发送13号(即SIGPIPE),杀死写端进程。

2026-03-23 00:52:03 392

原创 Linux系统易错点

1、为什么动态库的函数地址需要GOT表存起来呢?(1)动态库每次加载的虚拟基地址不同 → 函数真实虚拟地址每次都变 → 不能写死在代码里 → 必须用 GOT 存起来让程序间接调用.(2)动态链接器算出来的函数地址要存起来(一般在运行时计算),而代码段不让存(代码段只读),只能存在数据段的 GOT 里。(3)的布局方案,内存里真正用的虚拟地址是加载后重定位过的,。(4)库已经有地址了没错,但你的程序看不见这个地址,必须有人把它放进 GOT 这个“公用信箱”里,程序才能拿到。

2026-03-21 14:50:13 403

原创 在线五子棋对战(3)

前面两篇博客实现的接口都是为了服务器的实现,我们现在需要把这些接口整合,最后要实现一个五子棋服务,直接调用start接口就可以进行五子棋对战。在整合实现这里主要分为两个模块:1. 网络通信接口的设计:服务器收到一个什么格式的数据,代表什么样的请求,应该做出什么样的业务处理和响应,这些需要先提前规定好,前后端的请求和响应格式需要保持一致。这里使用的是restful风格的通信接口,具体是什么形式,后面业务处理时会提到。2. 服务器的搭建。

2026-03-06 20:01:47 380

原创 在线五子棋对战(2)

只有进入游戏大厅和游戏房间的用户才会建立websocket长连接,需要将用户id和对应的客户端websocket长连接关联起来。

2026-02-27 20:34:22 774

原创 在线五子棋对战(1)

与Http相比,服务端可以主动给客户端发送消息,从短连接变成长连接。

2026-02-27 20:34:17 530

原创 仿muduo库实现并发服务器-http服务器(2)

搭建HTTP服务器,其实就是把前面实现的server模块、httprequest模块、httpresponse模块、httpcontext模块整合起来,并且引入业务处理路由表。

2026-02-08 01:17:45 677

原创 仿muduo库实现并发服务器-http服务器(1)

实现一些零碎的功能性工具接口。

2026-02-08 01:17:02 691

原创 仿muduo库实现并发服务器(3)

将EventLoop模块与线程整合一起,让EventLoop模块与线程是一一对应的,这里就延伸出一个问题:是要先在主线程创建EventLoop对象,再分配给子线程还是先创建子线程,再在子线程里创建EventLoop对象?

2026-01-27 20:30:47 1145

原创 仿muduo库实现并发服务器(2)

对连接进行全方位的管理、对通信连接的所有操作都通过这个模块提供的功能或者接口完成。

2026-01-23 14:46:03 772

原创 仿muduo库实现并发服务器(1)

测试思路:创建一个监听套接字的Channel:,对可读回调函数void(const EventCallback &cb)传入Acceptor()来获取新连接,同时启动可读事件监控这里会通过Channel::EnableRead()的Update模块(void Channel::Update() { _poller->UpdateEvent(this);}),将。

2026-01-03 01:52:56 964

原创 算法--链表、哈希表、字符串

1、分析:这是一道链表综合题,根据题意和示例大概可以理解题目需要我们做什么,观察示例的原链表和输出链表:[1,4,2,3]可以看成是链表 [1,2] 和 [4,3] 的合并或者是 [1,2,3] 和 [4] 的合并, [4,3]就是原链表右半部分的逆序;对于[1,2,3,4,5]可以看成链表[1,2] 和 [5,4,3]的合并或者链表[1,2,3] 和 [5,4]的合并,[5,4,3]和[5,4]都可以看成原链表右半部分的逆序。2、核心思路:(1)先把原链表分成两部分,

2025-12-27 14:23:51 743

原创 分治快排和分治归并

1、分析:这道题其实就是让我们对0,1,2进行排序,但是因为它只有三个数字,我们先不考虑用快排,如果对这道题有印象,它是用双指针,一个变量left将数组划分成非0和0两部分,一个变量 i 去遍历数组判断是否为0,那严格来说你可以理解为三部分:非0,0和待扫描的元素。而这道题需要将数组最终分成三部分,那我是不是可以用三指针,就像下图一样,数组暂时分成四部分:[0,left]:都是0;[left + 1,i - 1]:都是1;[i,right-1]:未扫描的元素;[right,n-1]:都是2。

2025-12-01 20:41:42 702

原创 顺序结构二叉树--堆

1、简单来说,堆就是一个数组,只不过它的所有元素是按完全二叉树的顺序来存储,来模拟实现二叉树。2、堆分为小堆和大堆,就比如下图的小根堆示例图:每一个非叶子节点都比它的左右孩子都要小,根节点是最小的元素,并且它的逻辑结构是一棵完全二叉树;对于大根堆示例图则相反:每一个非叶子节点都比它的左右孩子都要大,根节点是最大的元素,并且它的逻辑结构是一棵完全二叉树。

2025-11-20 15:40:54 955

原创 算法--位运算和模拟

1、基础位运算:^ --> 相同为0,相异为1/ 无进位相加2、给一个数n,确定它的二进制表示中的第x位是0还是1:(n >> x)&1,结果为0说明第x位是0,结果为1说明第x位为1;或者 n&(1<<x) 结果不为0也可以说明第x位为13、将一个数n的二进制表示的第x位改成1:n = n | (1<<x)4、将一个数n的二进制表示的第x位改成0:n = n &( ~(1<<x))

2025-11-17 21:57:23 704

原创 算法-前缀和

(1)预处理dp数组:例题二的输入数组下标从1开始,而mat数组是从0开始,那我们用这个dp[ i ][ j ]= mat[ i ][ j ]+dp[ i-1 ][ j ]+dp[ i ][ j-1 ]- dp[ i-1 ][ j-1 ] 公式是不是还要注意边界情况,这里如果单独去处理边界情况很麻烦,我们依然可以让二维前缀和数组 dp 从1开始,只不过要注意:例如dp[1][1]对应的是mat[0][0],所以式子应该改为。从一开始,假设 l 为1,那此时就变成dp[r] - dp[0],此时把。

2025-11-13 15:54:01 1049

原创 算法-二分查找

我们之前可能默认为只有数组是有序就可以用二分查找,但其实不是有序数组只要是数组有规律、具有二段性就可以用二分查找,并且这个算法是有对应三个模板的,下面会对他们进行介绍,强调一点:要先明白算法原理(即为什么可以这样做),模板才是有用的。

2025-11-07 21:29:05 628

原创 算法-滑动窗口

left=0,right=3,sum=8满足条件,更新结果后:len = 4,sum = 6;每次一组循环后,再让right回退,重新开始,会有很多没必要的操作:就比如left = 0,right = 3时,满足条件,更新结果后,让left++,那让right回来从下标1开始还不是要回到下标3吗,而且也不满足条件,还是需要继续往后走,那还不如让right先不动,先更新left,直到中间连续数组的和小于target,再让right往后走,这里的前提都是数组是正整数,也就是说还是利用了单调性。

2025-11-02 15:01:13 986

原创 C++11细节

1. 临时对象、匿名对象、字面常量等右值不能被取地址2. 变量表达式都是左值属性,也就意味着⼀个右值被右值引用绑定后,右值引用变量变量表达式的属性是左值。3. 加不加const一般和&有关(左值引用)4.拷贝构造函数:复制资源(深拷贝),而右值引用构造函数(移动构造)是转移资源(浅拷贝 + 资源接管)5.左值引用不能直接引用右值,但是const左值引用可以引用右值;右值引用不能直接引用左值,但是右值引用可以引用move(左值)

2025-09-04 08:54:07 1179

原创 github团队项目如何拉取到本地

等待完成后,你本地的 Git 仓库就知道了 origin/xxx、origin/xxx等分支的最新指针,但此时还没有在本地创建对应的本地分支。(2)在你本地想存放项目的文件夹(比如D:\team's repository)空白处,右键TortoiseGit-->Git Clone,会弹出Clone窗口,它的URL会显示你刚刚复制的地址,Directory会显示当前目录,直接点ok就行。(2)点击右上方的 Branch,选择你想查看的分支backend,点 OK。3. 在本地创建/切换到各自分支。

2025-05-01 21:22:30 1394

原创 进程状态分类

当内存资源相当吃紧,即使是阻塞挂起,内存空间也不足的时候,操作系统就会打运行调度队列的task_struct的主意,它会把当前不急着在cpu上运行(不管是单CPU还是多CPU,都不可能同时运行调度队列的所有进程)的进程的代码和数据唤出到磁盘的swap交换分区,等轮到被移除的task_struct被CPU调度时,操作系统再把它们的代码和数据再“唤入”到运行队列。这里的1号进程可以理解为操作系统,如果操作系统不领养这个子进程,子进程的结束信息没人获取,没人回收这个子进程的PCB,就会存在内存泄漏。

2025-03-20 19:04:05 1123

原创 进程基本概念

这显然是不切实际的,所以呢,聪明的校长就去学了c语言,他发现,可以用结构体把每个学生的不同信息(包括姓名、性别、年龄、籍贯、入学时间、成绩、宿舍号)给聚合起来,然后呢,张三李四王五每个学生都是一个结构体变量,可是呢,每个变量之间又是互相独立的,学生这么多,校长就想到用链表把每个学生的结构体数据给串起来,之后,校长就可以通过遍历链表查看来哪个学生的成绩最高,也可以在对挂了二十科的学生劝退后,在系统中删除学生的信息,就相当于把对。这就是为什么子进程对val的值进行修改,而在父进程中val的值不变的原因。

2025-03-15 20:07:55 730 3

原创 C++父类子类指针与多态的一些问题

先分析p1->test(),p1->test() 是通过派生类指针调用,直接访问 A::test(),又因为B重写了func()函数,会调用 B::func()(动态绑定),不过默认参数的值还是由 A::func() 决定(静态绑定),主要原因还是因为A的func()是虚函数;析构函数的重写:只要基类的析构函数是虚函数,派生类的析构函数就会自动成为虚函数(即使没有显式声明 virtual),不仅是析构函数,其他只要是基类函数有virtual,那么派生类的virtual可加可不加。////简单总结就是。

2025-02-26 22:22:24 371

原创 多态场景的一个坑

不是B*,因为继承不是说把A类的内容拷贝到B类中,只是说B可以复用A。所以是A类指针调用func函数,又因为A和B的func函数都是虚函数,所以满足多态的条件:基类指针或引用调用虚函数。因为传的是B类对象指针p,所以这里的。但其实不是,分析这段代码,创建了一个B类对象,然后调用了test()函数,由于B继承了A,所以实际上。test的this逻辑上是A*,实际指向B类对象*p,调用的是派生类的func。调用的是子类的虚函数,那么真正的函数应该是父类的声明加子类的内容。,这里要注意,test函数的。

2025-02-25 13:21:53 319

原创 AVLTree

今天我们来实现AVL树,我将从它的概念、原理、实现以及在实现过程中可能会遇到的问题来帮助小伙伴们更好地了解AVL树~

2025-01-30 00:28:31 885 1

空空如也

空空如也

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

TA关注的人

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