自定义博客皮肤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)
  • 收藏
  • 关注

原创 C++STL(六) :set与map的模拟实现

需要注意的是,反向迭代器只接收了一个模板参数,即正向迭代器的类型,也就是说,反向迭代器不知道结点的引用类型和结点的指针类型,因此我们需要在正向迭代器当中对这两个类型进行typedef,这样反向迭代器才能通过正向迭代器获取结点的引用类型和结点的指针类型。实现红黑树的正向迭代器时,一个结点的正向迭代器进行–操作后,应该根据红黑树中序遍历的序列找到当前结点的前一个结点。,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。

2025-04-03 14:47:26 878

原创 ARP协议

当网络设备有数据要发送给另一台网络设备时,必须要知道对方的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。

2025-04-03 14:44:29 933

原创 数据链路层协议--以太网协议

路由器A的IP层拿到解包后的IP数据报后,会提取出IP报头当中的目的IP地址,然后通过查询路由表后确定需要将该数据转发给路由器B,于是路由器A再将数据向下进行交付,重新封装MAC帧的帧头和帧尾,但此时封装后的MAC帧当中的源MAC地址和目的MAC地址,就变成了路由器A的MAC地址和路由器B的MAC地址。此时主机A所在局域网当中的所有主机都能收到这个MAC帧,但最终只有路由器A发现该MAC帧当中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给IP层。

2025-03-31 17:02:32 1174

原创 C++STL(五) :priority_queue的模拟实现

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue,默认情况下priority_queue是大堆使用vector作为底层容器,内部构造大堆结构使用vector作为底层容器,内部构造小堆结构不指定底层容器和内部需要构造的堆结构,此时默认使用vector作为底层容器,内部默认构造大堆结构。

2025-03-31 16:57:24 787

原创 C++STL(四):stack和queue的模拟实现

容器适配器:以某种已有的既定容器作为底层结构,在其基础上进一步地进行,使其可以满足某种特性STL六大组件中配接器中的stack,queue,priority_queue就是通过封装其他容器实现的。

2025-03-24 22:37:26 364

原创 网络层协议--IP协议

因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,这也就意味着IP地址当中的主机号的位数在不断减少。需要注意的是,未分片报文的“更多分片”标志位为0,最后一个分片报文的“更多分片”标志位也为0,但当接收端只收到分片报文中的最后一个分片报文时,接收端不会将其识别成一个未分片的报文,因为未分片的报文所对应的13位片偏移的值也应该是0,而最后一个分片报文所对应的13位片偏移的值不为0。经过网络层的封装,数据最终会交付给下层的数据链路层。

2025-03-24 22:17:56 990

原创 文件操作助手

在我们实现一个大型项目时,往往会有一个公共模块,这个公共模块是公用的,里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手…

2025-03-23 22:25:31 500

原创 C++STL(三) :list的模拟实现

1。

2025-03-23 21:59:37 1045

原创 传输层协议--TCP协议

三次握手是验证双方通信信道的最小次数:因为TCP是全双工通信的,因此连接建立的核心要务实际是,验证双方的通信信道是否是连通的。而三次握手恰好是验证双方通信信道的最小次数,通过三次握手后双方就都能知道自己和对方是否都能够正常发送和接收数据。在客户端看来,当它收到服务器发来第二次握手时,说明自己发出的第一次握手被对方可靠的收到了,证明自己能发以及服务器能收,同时当自己收到服务器发来的第二次握手时,也就证明服务器能发以及自己能收,此时就证明自己和服务器都是能发能收的。

2025-03-21 16:06:19 1302

原创 C++STL(二)vector的模拟实现

start指向整个容器的首部_finish指向最后一个有效数据_endofstorage指向整个容器的尾部。

2025-03-21 15:59:12 742

原创 传输层协议--UDP

(应用程序),当主机从网络通信中获取到数据时,需要自底向上进行数据的交付,而将数据交付给应用层的哪一个应用程序,就是端口号决定的因此,端口号是属于传输层的概念。

2025-03-17 21:22:43 668

原创 KMP算法

最长前缀概念: 最长前缀是说以第一个字符开始,但是不包含最后一个字符最长后缀概念: 最长后缀是说以最后一个字符开始,但是不包含第一个字符next 数组定义:在模式串中(下标从0开始),next[i] 表示模式串中以下标 i 处字符结尾的子串的最大相同前后缀的长度。在KMP算法中,该值一方面表示模式串中1~i位置子串中的最长相同前后缀长度,另一方面表示在该位置匹配失败时模式串回溯比较的下一个字符位置(最长前缀末座标的下一个字符。

2025-03-16 21:24:27 715

原创 应用层协议------HTTP协议

全称超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议,是基于TCP/IP通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0平时我们俗称的”网址“,其实就是 URL(Uniform Resource Locator),翻译为统一资源定位符互连网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

2025-03-11 18:39:14 1188

原创 leetcode1143.最长公共子序列

这是一道典型的两个数组的dp问题。

2025-03-11 18:35:33 493

原创 leetcode560.和为k的子数组

有的同学可能想到使用双指针来解决这道题,但是数组中的数字可能存在零或者负数,因此不存在单调性,所以不能使用双指针。在看到题目后,我们能想到的解法就是暴力枚举:定义一个下标。,因此我们可以借助哈希表来快速找到前缀和等于。位置为开头的子数组后得到结果,时间复杂度为。,所有可以使用一个变量来代替前缀和数组。在计算i位置之前,哈希表中只保存。思路:先初始化一个前缀和数组。使用一个变量来代替前缀和数组。区间内,有多少个前缀和等于。,但是这样的时间复杂度还是。前缀和加入哈希表的时机。前缀和数组的推导式为。

2025-03-10 16:43:31 357

原创 C++STL(一):string类的模拟实现

为了让string对象能够像内置类型一样使用>>运算符直接输入,我们需要先将对象的C字符串置空,然后从标准输入流读取字符,直到读取到’ ‘或是’\n’便停止读取。实现时于>>运算符的重载基本相同,只是当读取到’\n’的时候才停止读取字符。_str在开辟新空间之前需要先将原来的空间释放掉,并且在进行操作之前还需判断是否是自己给自己赋值。先根据源字符串调用构造函数构造一个tmp对象,然后再将tmp对象与拷贝对象的数据交换。先开辟空间,再将源对象的字符串拷贝给目标对象。相似,插入之前要先判断是否需要扩容。

2025-03-10 16:40:44 952

原创 leetcode77.组合

我们将上图的树形结构称之为决策树,从决策树中我们可以看出,n决定决策树的宽度即循环次数,而k决定决策树的深度即递归次数。我们挑选出某一具体路径来进行分析。我们在得到[1,2]后递归返回,想要再得到[1,3],就需要把2。start用来确定下一层递归的开始位置,调用下一层递归函数时传入。也可以将这两个全局变量当作参数传递给递归函数。存放取到的值,调用下一层递归,递归结束后回溯。“还回去”,因此,这便是一道经典的回溯问题。首先我们要定义两个全局变量。,可以避免取到重复元素。

2025-03-08 17:50:51 450

原创 网络版汉译英服务(muduo)

项目源码:汉译英服务Muduo 由陈硕大佬开发,是一个基于非阻塞 IO 和事件驱动的 C++高并发 TCP 网络编程库。 它是一款基于主从 Reactor 模型的网络库,其使用的线程模型是 one loop per thread, 所谓 one loop per thread 指的是:

2025-03-08 17:48:16 336

原创 自定义协议

在计算机科学中,‌协议‌(Protocol)是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。例如,网络中的计算机要能够互相顺利通信,就必须遵守相同的协议,如Ethernet、NetBEUI、IPX/SPX以及TCP/IP协议。

2025-03-06 10:26:03 1461

原创 leetcode138.随机链表的复制

存的是新链表的结点,一次遍历旧链表后,我们的就把新节点“挂”在与旧链表一一对应的旧节点下。还没有赋值,就需要我们第二次遍历链表,通过哈希表找到新节点指向的的。首先,我们需要一个类型为。存的是旧链表的节点,

2025-03-06 10:22:04 205

原创 lettcode.236二叉树的最近公共祖先

分别来记录从根节点到p、q节点的路径,记为。当两条路径长度不同时,使较长路径不断。

2025-03-04 10:39:09 228

原创 网络套接字编程(总结)

在上篇内容中,我们实现了TCP服务器,但是在退出并立即重启服务器时,我们会发现出现bind error的情况,是因为服务器在关闭后会进入timewait的状态,此时就需要等待2msl才能使用这个端口,对于用户而言,2msl的时长太长,(linux的2msl时长大约有40s到60s),所以需要复用这个端口,使得服务端能够正常运行函数简介level(级别)指定系统中解释选项的代码为通用套接字代码,或为某个特定协议的代码。optval是一个指向某个变量(optval)的指针,setsockopt从。

2025-03-04 10:36:46 1018

原创 01背包问题

状态表示是解决动态规划问题中最关键的一步,如果无法确定状态表示,就得不到状态转移方程。一般情况下,以i位置为结尾(开头),在结合题目要求得到状态表示。

2025-03-03 09:52:47 163

原创 网络套接字编程(二)

由于调用pthread_create函数创建线程时,新线程的执行例程是一个参数为void*,返回值为void*的函数。如果我们要将这个执行例程定义到类内,就需要将其定义为静态成员函数,否则这个执行例程的第一个参数是隐藏的this指针在线程的执行例程当中会调用Service函数,由于执行例程是静态成员函数,静态成员函数无法调用非静态成员函数,因此我们需要将Service函数定义为静态成员函数。恰好Service函数内部进行的操作都是与类无关的,因此我们直接在Service函数前面加上一个static即可。

2025-03-03 09:49:31 1002

原创 基于负载均衡的在线OJ

主要功能:判断文件是否存在、向指定文件写、从指定文件读。主要功能:给文件名添加路径以及后缀。Boost 标准库(字符串切割)主要功能:获取秒级、毫秒级时间戳。第三方开源序列化、反序列化库。:将编译运行服务打包成网络服务。Ace前端在线编辑器(了解)第三方开源前端网页渲染库。主要功能:解析字符串。

2025-02-28 23:11:29 935

原创 网络套接字编程(一)

因为服务器就是为了给别人提供服务的,因此服务器必须要让别人知道自己的IP地址和端口号,IP地址一般对应的就是域名,而端口号一般没有显示指明过,因此服务端的端口号一定要是一个众所周知的端口号,并且选定后不能轻易改变,否则客户端是无法知道服务端的端口号的,这就是服务端要进行绑定的原因,只有绑定之后这个端口号才真正属于自己,因为一个端口只能被一个进程所绑定,服务器绑定一个端口就是为了独占这个端口。也就是说,客户端每次启动时使用的端口号可能是变化的,此时只要我们的端口号没有被耗尽,客户端就永远可以启动。

2025-02-27 14:56:14 1038

原创 leetcode300.最长递增子序列(记忆化搜索+动规)

结果依旧是超时,原因还是存在大量重复计算,因此加上“备忘录”老样子,在记忆化搜索前看看递归是否能解决问题。

2025-02-27 12:04:55 343

原创 leetcode62.不同路径(记忆化搜索+动规)

记忆化搜索 = 带有备忘录的递归, 所以先试一下普通递归,会发现普通递归会超时,原因是普通递归会存在大量重复计算,因此使用记忆化搜索。

2025-02-26 22:48:28 202

原创 斐波那契数的三种解法

在递归的时候我们发现,会有大量重复计算,这会使效率大大降低,因此我们可以使用记忆化搜索,即带有”备忘录“的递归,这个”备忘录“可以是。例:画出第五个斐波那契数的树状递归展开图。

2025-02-26 14:04:35 337

原创 链表基本算法

链表基本算法

2025-02-25 16:50:43 182

原创 Linux--进程间通信

进程间通信的三种方式:匿名管道,命名管道,system V进程间通信

2024-10-14 16:57:38 130

原创 Linux--软硬链接

软链接(Symbolic Link): 软链接是一个指向目标文件或目录的特殊文件,类似于Windows系统中的快捷方式。软链接可以跨文件系统,可以链接到目录,也可以链接到文件。硬链接(Hard Link): 硬链接是指多个文件名指向同一个inode的链接方式。硬链接只能链接到文件,不能链接到目录。在实际运用过程中,我们会发现一个现象:一个新建文件的硬链接数为1,但是一个新建目录的硬链接数却是2,这是为什么呢?还有一点要注意的是:用户无法对目录建立硬链接,这是为了避免形成环形查找路径。如有不足,请多多指教!

2024-04-30 10:50:00 210 2

原创 Linux--进程等待

通过wait()/waitpid()的方式,让父进程(一般)对子进程进行资源回收的等待过程。b、父进程需要通过进程等待的方法,获取子进程的退出信息。a、解决子进程僵尸问题带来的内存泄漏的问题。

2024-04-26 08:33:16 295 3

原创 磁盘的结构

磁盘物理结构​​​ 磁盘的逻辑结构

2024-04-26 08:11:49 218 1

原创 力扣 467.环绕字符串中的唯一子字符串——前缀和经典例题

只需要判断(s[i]-s[i-1]+26)%26是否等于1,加26是因为可能存在z到a类似的跨越,读者可以下去自证。随着下标i的移动,就可以列出该字符串的所有子字符串。1.以某一位置为结尾的所有子字符串。2.如何判断字母是否连续。

2024-03-19 20:40:04 512

原创 【C语言进阶->指针的进阶】--sizeof与strlen的区分

数组与指针数组名sizeof与strlen

2023-03-06 16:35:30 493

原创 C语言进阶---浮点型在内存中的存储

浮点型在内存中的存储

2023-02-25 16:46:21 658

原创 扫雷游戏(初级)

【代码】扫雷游戏。

2023-01-28 19:53:47 100

原创 三子棋游戏

1.打印棋盘(即创建一个二维数组)2.将棋盘中的内容初始化为空格。3.玩家下棋(包括判断输赢)4.电脑下棋(判断输赢)

2023-01-18 21:01:24 127 2

空空如也

空空如也

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

TA关注的人

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