- 博客(60)
- 收藏
- 关注
原创 【C++11】lambda表达式 || 函数包装器 || bind用法
Lambda 表达式是 C++11 引入的一个非常强大的特性,它允许你在代码中定义,常用于需要传递函数作为参数的地方,比如 STL 算法中的回调。
2025-05-26 10:09:11
1125
原创 【从零实现JsonRpc框架#3】线程模型与性能优化
适用于高并发、低延迟的网络服务场景(如游戏服务器、实时通信)。相结合的方式,通过事件驱动和线程池实现高并发。通过上述方法,Muduo 可以轻松支持。Muduo 默认使用。
2025-05-10 12:34:04
1024
原创 【从零实现JsonRpc框架#2】Muduo库介绍
EventLoop:负责事件循环,监听 I/O 事件和定时器事件。TcpServer:用于创建 TCP 服务器,监听客户端连接。:表示一个 TCP 连接,负责管理客户端与服务器之间的通信。TcpClient:用于创建 TCP 客户端,连接到远程服务器。Buffer:用于处理网络数据缓冲区,支持高效的读写操作。这些类是 Muduo 库的核心组件,通过它们可以轻松构建高性能的 TCP 网络应用。
2025-05-10 12:16:10
972
原创 【从零实现JsonRpc框架#1】Json库介绍
JsonCpp是一个开源的C++库,用于解析和生成JSON(JavaScript Object Notation)数据。它提供了简单易用的接口,支持JSON的序列化和反序列化操作。JSON是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。在JsonCpp中,所有JSON数据均通过Json::Value类表示。该类支持动态类型判断,并提供了多种方法进行数据操作,如添加、移除、访问数组元素等。JsonCpp的主要功能包括将C++对象序列化为JSON字符串,以及将JSON字符串反序列化
2025-05-10 11:33:51
827
原创 【day04】Fibonacci数列 | 单词搜索 | 杨辉三角
题目链接:解题思路:求斐波那契数列的过程中,判断⼀下:何时n会在两个fib数之间。
2025-05-07 15:02:36
539
1
原创 【Linux网络#5】(UDP的简单应用)DictServer(中译英字典)| ChatServer(简单聊天室)
在之前的代码当中,Echo 服务器收到发的信息,然后再转发对应的信息,但是有个问题,这里不仅要一个人收消息,后面还要我们自己去转发给所有人,此时收消息转消息都是同一个人,UDP 数据一旦过大,服务器可能就没时间接收数据了,而且我们前面也说过 UDP 套接字本身是全双工的,全双工的意思就是 在收数据的同时,也可以发送数据,下面我们举个例子。其目的:将观察者和被观察者代码解耦,使得一个对象或者说事件的变更,让不同观察者可以有不同的处理,非常灵活,扩展性很强,是事件驱动编程的基础。
2025-05-05 02:00:00
1308
原创 【day02】牛牛的快递 | 最小花费爬楼梯 | 数组中两个字符串的最小距离
⽤ prev1 标记 i 位置之前最近⼀次出现的第⼀个字符串的下标;⽤ prev2 标记 i 位置之前最近⼀次出现的第⼆个字符串的下标。模拟:分情况讨论即可。
2025-05-04 12:21:55
298
原创 【Linux网络#4】:Socket编程应用层UDP
错误码定义(Common.hpp)BIND_ERR,// ...其他错误码日志系统(Log.hpp)DEBUG = 0,INFO,WARNING,ERROR,FATAL。
2025-05-04 11:23:05
562
原创 【Linux网络#3】网络常见的命令
这是因为部分服务不允许普通用户查看和绑定,想要查看就需要使用。但是如果分开使用两个命令,那么使用方式和之前使用。命令会发现是死循环地执行,如果一般查看是否连通只需要。有的时候可能需要一直查看相关的状态,此时就可以使用。命令终止一个进程,此时需要指定终止的进程的。并将返回结果交给管道,通过管道将结果交给。命令没有区别,所以可以考虑使用管道结合。上面的图中展示了每隔1s执行一次。在终止一个进程时,有时需要使用。,这个命令会将收到的结果作为。返回指定正在运行的程序的。如果是以普通用户使用。
2025-05-03 11:53:25
201
原创 【Linux网络--2】: Socket 编程
但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识主机的唯一性。在进行网络通信的时候,是不是我们的两台机器在进行通信呢?日常网络通信的本质:就是进程间通信!!(从应用层上看,不用看网络栈的底层传输)要进程间通信,就要先把进程标识
2025-05-03 11:30:13
1015
原创 【Linux网络#1】:网络基础知识
协议分层是一种将复杂的通信系统划分为多个逻辑层次的方法。每一层专注于特定的功能,并通过接口与上下层交互,从而实现模块化和简化设计。
2025-04-26 12:07:24
883
原创 蓝桥杯Java组国赛G题(01背包问题的变形)
表示只考虑前 $ i $ 个物品,背包容量为 $ j $,并且还没有使用魔法的情况下的最大价值。对于该状态的转移,因为这一状态是未使用魔法的,所以转移方程同01 背包fij0fi−1j0当jwimaxfi−1j0fi−1j−wi0vi当j≥wif[i-1][j][0] & \text{当 } j < w[i], \\
2025-03-28 16:31:42
671
原创 【Linux】Linux进程状态与进程优先级(新)
在操作系统中,⼀般会存在⼀个进程状态转换图,例如下图:整个过程中涉及到五个基本进程状态:1.创建(new):表示进程创建2. 运⾏(running):表示进程正在被执⾏3. 等待(waiting):表示进程正在等待具体事件发⽣,也被称为阻塞状态4. 就绪(ready):等待被调度器调度执⾏5. 终⽌(terminated):进程完成执⾏。
2025-03-19 20:25:16
658
1
原创 IPC 进程间通信(一):管道(匿名管道&进程池)
进程可以通过 读/写 的方式打开同一个文件,操作系统会创建两个不同的文件对象 file,但是文件对象 file 中的内核级缓冲区、操作方法集合等并不会额外创建,而是一个文件的文件对象的内核级缓冲区、操作方法集合等通过指针直接指向另一个文件的内核级缓冲区、操作方法集合等。这样以读方式打开的文件和以写方式打开的文件共用一个内核级缓冲区进程通信的前提是不同进程看到同一份共享资源所以根据上述原理,父子进程可以看到同一份共享资源:被打开文件的内核级缓冲区。
2025-03-18 20:49:52
868
原创 Linux中输入和输出基本过程
前面在如何理解Linux一切皆文件的特点中提到为了保证在Linux中所有进程访问文件时的方式趋近相 同,在f ile 结构体中存在一个 files_operations 结构体指针,对应的结构体保存所有文件操作的函 数指针(这个结构体也被称为操作表)每一个f ile 结构体中除了有自己的操作表以外还有一个文件的内核级缓冲区,这个缓冲区不同于语言层 面的缓冲区,在调用底层系统接口的读或者写时,会有一方先将内容保存到该缓冲区,再将内容移动到 指定设备。
2024-12-16 20:58:04
1247
原创 Linux文件操作基础
在Linux第一章提到过, 在Linux中,一切皆文件,而文件由文件内容和文件属性组成,在C语言中可以 使用相应的接口打开文件,例如 fopen 函数。
2024-12-13 15:30:18
1444
原创 【重拾算法第一天】质数&&约数&&欧拉筛 埃氏筛&&GCD
质因数(Prime Factor)是指一个整数的质数因子。换句话说,质因数是能够整除该整数的质数。每个大于1的自然数都可以被唯一分解为质因数的乘积,这称为质因数分解。i > t;return 0;
2024-10-21 17:26:33
646
3
原创 【Linux】Linux进程地址空间
RWX 属性:代表虚拟地址对应的物理地址是否具有读(R)、写(W)和执⾏权限 (X)。前⾯提到,每⼀个进程地址空间区域都由指定的起始值和终⽌值进⾏划分,⽽这些区 域有的是可以写,有的不可以写只能读,但是对于物理内存来说,绝⼤部分的空间都 是可以写的,所以对于限制指定的物理地址是否可以写⼊就是通过 RWX 属性进⾏控制例如,前⾯学习到的栈区和堆区,在程序代码运⾏时,可以在栈区和堆区申请空间并 进⾏写⼊,但是对于字符串常量等具有常性的值就不可以进⾏随意修改和写⼊。
2024-10-19 22:26:23
1501
原创 【Java】Java面向对象与方法
在Java中,方法即为,Java中的方法定义遵循下面的通用格式是否需要返回类型和形参列表需要看该函数的功能,具体思路可以参考C/C++中定义函数的方式。
2024-10-17 18:41:56
795
原创 【Linux】Linux命令行与环境变量
在Linux下输⼊的命令⾸先会被Shell拿到。前⾯提到⽗进程和⼦进程的代码是共有的,但是⼆者数据是各⾃独⽴的,但是数据独 ⽴实际上只会建⽴在其中⼀个进程修改了数据,如果⼆者都是对变量进⾏只读不写, 那么也没有必要单独为两个进程开辟两个数据空间对于上⾯的情况亦是如此,直接在终端上执⾏的进程,其⽗进程都是Shell,并且⽗ 进程和⼦进程都只是以只读的⽅式访问 main 函数的参数,所以就不会出现两个数据 空间。从上⾯的过程中也可以看出,在设计操作系统、编程语⾔等时,相互都是存在依赖关系的。
2024-10-17 17:18:06
1007
原创 【Linux】Linux进程状态与进程优先级
在操作系统中,⼀般会存在⼀个进程状态转换图,例如下图:整个过程中涉及到五个基本进程状态:1.创建(new):表示进程创建2. 运⾏(running):表示进程正在被执⾏3. 等待(waiting):表示进程正在等待具体事件发⽣,也被称为阻塞状态4. 就绪(ready):等待被调度器调度执⾏5. 终⽌(terminated):进程完成执⾏。
2024-10-15 17:49:51
1068
原创 【Java】C++转Java基础知识
在Java中,JDK称为Java开发工具包(Java Development Kit),包含了Java开发需要使用的工具包,前面的版本中JRE和JDK是分开的两个文件夹,从Java9开始,JDK中还包含了JRE(Java Runtime Environment),包含了Java运行的虚拟机JVM和其他,而,原因是Java9引入模块化运行,可能不是每一次的代码运行都需要完整的JRE,根据需要加载可以提高运行效率。在Java中,除了提供了C/C++中存在的算术右移,还提供了无符号右移,使用。
2024-10-13 22:44:18
928
原创 【Linux】Linux进程基础
进程的本质是在计算机内存中运⾏的程序,但是这⼀个概念太过于⼴泛每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
2024-10-13 14:25:50
1176
原创 【Linux】操作系统基础
冯诺依曼体系结构如下:在上图中「输⼊设备」和「输出设备」⼀般被称为计算机的外设,⽽「存储器」在冯 诺依曼体系结构中表示「内存」输⼊设备⼀般包括:⽹卡、磁盘、键盘、触摸屏等输出设备⼀般包括:⽹卡、磁盘、⿏标、触摸屏、显示器(⾮触摸屏)等。
2024-10-12 19:58:51
631
原创 【Linux】Linux下的Makefile基本操作
clean:第⼀⾏中的代表依赖关系,code表示⽬标⽂件, 赖⽂件列表中的⽂件,第⼆⾏的 code.c 表示依 gcc -o code code.c代表依赖⽅法(指令)第三⾏中的.PHONY表示⽣成⼀个伪⽬标,clean表示伪⽬标的名字(可以类⽐ 变量名)第四⾏及第五⾏与第⼀⾏及第⼆⾏含义⼀致,表示依赖关系和依赖⽅法,⽽因为clean没有需要依赖的⽂件,所以clean:后没有任何依赖⽂件列表⽂件依赖关系:表示两个⽂件之间构成的⼀定关系,⽐如⽗⼦关系。
2024-10-11 19:12:12
2471
原创 【图论入门】图的存储
是图论中用于表示图(Graph)结构的一种重要,特别适用于表示顶点之间连接关系的图形。在计算机科学和数学领域,它被广泛应用来编码无向图和有向图的信息。
2024-08-31 13:13:10
1769
2
原创 【STL】红黑树的全面探索与红黑树的实现
红黑树节点的定义通常包含以下几个关键部分:红黑树的节点结构与二叉搜索树和AVL树差别不大,最大的差别就是加入了一个新的存储点——颜色因为⿊⾊节点的个数可以决定⼀条路径的⻓度,假设⿊⾊节点的个数为 h ,则最短路径的⻓度也为 h ,满⾜第⼆条规则时,红⾊节点的 个数不会超过⿊⾊节点( 1 个或者 h 个),从⽽最⻓路径的最⼤⻓度为 2h ,因为红⾊节点是在⿊⾊节点出现后才会出现。如果按照下图的插⼊⽅式导致红⾊节点连续出现违反了规则⼆,此时最短路径的⻓度的两倍会⼩于最⻓路径的⻓度,从⽽打破了红⿊树的平衡。
2024-08-28 17:22:11
1240
2
原创 【STL-AVLTree】AVL 树的实现
二叉搜索树在某些极端情况下可能会退化,为了解决这个问题,引入了AVL树(平衡搜索二叉树中的一种)控制二叉搜索树的不平衡情况,插入一个新节点后,控制每一个节点的左右子树高度差的绝对值不超过1之所以控制绝对值不超过1而不是不超过0是因为只有在满二叉树的情况下才可以满足每一个节点的左右子树高度差的绝对值不超过0,为了满足普遍性,选择绝对值不超过1一棵AVL树具有以下的特点:每一个节点的左右子树都是AVL树左右子树高度差的绝对值(通过平衡因子判断)不超过1绝对值不超过1,包括-1、1和0。
2024-08-25 15:22:45
654
2
原创 【C++继承】赋值兼容转换&&作用域&&派生类的默认成员函数
由上面我们可以看到Person是父类,也称作基类。Student是子类,也称作派生类1.基类private成员在派⽣类中⽆论以什么⽅式继承都是不可⻅的,这⾥的不可⻅是指基类的私有成员还是被继 承到了派⽣类对象中,但是语法上限制派⽣类对象不管在类⾥⾯还是类外⾯都不能去访问它。2.(★)基类private成员在派⽣类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派⽣类中 能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
2024-08-16 13:22:04
982
原创 【算法】并查集的介绍与使用
find()函数用于确定一个元素所在的集合的代表元素或根节点。它通常通过路径压缩优化来提高效率。开始时每个集合都是一个独立的集合,并且都是等于自己本身下标的数例如:如果是M操作的话那么就将集合进行合并,合并的操作是:所以3的祖宗节点便成为了5此时以5为祖宗节点的集合为{5,3}如果要将p[9]=9插入到p[3]当中,应该找到3的祖宗节点,然后再把p[9]=9插入其中,所以p[9]=find(3);(find()函数用于查找祖宗节点)
2024-08-14 16:15:20
1293
2
原创 【STL模板进阶】非类型模板&&类模板打印&&特化&&分离编译
1)优点1、模板复用了代码,但本质上编译器会帮我们生成实例化的代码,只是减少了人工的消耗,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2、增强了代码的灵活性(2)缺陷1、模板会导致代码膨胀问题,也会导致编译时间变长2、出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-08-14 12:16:37
911
原创 priority_queue的介绍 && 仿函数
1.优先队列是⼀种容器适配器,根据严格的弱排序标准,它的第⼀个元素总是它所包含的元素中最⼤的。2.此上下⽂类似于堆,在堆中可以随时插⼊元素,并且只能检索最⼤堆元素(优先队列中位于顶部的元素)3.优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供⼀组特定的成员 函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类5.标准容器类vector和deque满⾜这些需求。
2024-08-13 17:28:52
833
原创 【STL】stack/queue && 容器适配器 && deque
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。
2024-08-13 15:36:45
883
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人