自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ​约束催生自由,分离滋养创造——建造者模式有感

核心问题:解决复杂对象构建过程与对象表示的耦合问题,特别是当对象构建需要多个步骤、多种组合方式时的设计困境。核心思想:将复杂对象的构建过程(建造流程)与对象的表示形式(最终产品)进行分离,使得同样的构建流程可以创建不同的产品表示。

2025-06-12 15:21:11 655

原创 【零基础勇闯嵌入式岗】从单片机低功耗中获得的启发

嗯,单片机是低功耗了,我干烧了,感觉自己当场就红温了。😭其实感觉这篇可以写一个《十分钟速通,让面试官无话可说》,但这样显得我很菜,很没有自己的思考,万一以后真的有面试官点开我的简历上的小小的链接,看我的博客呢,哈哈。😳所以干脆学习了一下单片机低功耗的设计,然后简单讲一下自己的启发。💪 的工作电压通过引脚输入,一般为。通过内置的电压调节器提供所需的电源。为提供了一个独立的电源供电,这样可以过滤和屏蔽来自印刷电路板上的毛刺干扰,提高转换的精确度。系统的电源引脚为,接地引脚为。为了确保模拟输入为低电压时,

2025-06-12 11:10:11 468

原创 程序员防脑抽指南:C++大根堆,为啥用less?

比较器是一个可调用对象(函数、函数对象或Lambda),它接受两个参数a和b返回true:表示a的优先级低于ba应该被“压下去”)。返回false:表示a的优先级高于或等于ba可以“留下来”)。例如,标准库中的std::less和// a比b小时,a的优先级更低// a比b大时,a的优先级更低1. 函数对象(Functor)// 小顶堆比较器:值小的元素优先级高// 注意:这里是 >,与直觉相反!// 使用函数对象的优先队列2. 普通函数// 大顶堆比较器:值大的元素优先级高。

2025-06-07 21:21:06 860

原创 【贪心、DP、线段树优化】Leetcode 376. 摆动序列

000002。

2025-06-04 14:46:09 890

原创 论程序员如何在内存不足时,用脑细胞临时扩容

技术手段适用场景优势特点位图法存在性判断空间效率高(1bit/数)多级分段统计极低内存场景递归缩小问题规模二分范围法超低内存要求无需存储中间数据范围频率统计有序统计问题动态过滤无关数据。

2025-06-03 20:56:28 971

原创 池中锦鲤的自我修养,聊聊蓄水池算法

起初你满怀期待跳进大厂池子,以为自己是天选之子,结果发现池子里早挤满了和你一样的“锦鲤候选人”。HR的渔网一撒,捞谁全看概率——这不就是的精髓吗?kVIPk + 1k / i“面完三面等消息?恭喜,你进入了k / N的量子纠缠态。1001000k / N所以,下次面试官问你“如何公平抽奖”,请优雅地回答:“简单,像泡池子一样,先到的不一定稳,后来的未必凉,一切交给蓄水池的数学之美。

2025-06-02 20:51:47 823

原创 儿童节快乐,聊聊数字的规律和同余原理

星期是7天一个循环。所以说,这一天是星期几,7天之后同样也是星期几。而6月30日是在6月1日的29用29除以7,可以得出余数为1。而6月1日那一天是星期日,那么,6月30日就是星期日的后一天,也就是星期一。

2025-06-01 20:26:39 816

原创 recvfrom和sendto函数中地址参数的作用

在UDP通信中,recvfrom和sendto函数的地址参数至关重要。recvfrom通过src_addr参数获取发送方的地址信息,使接收方能够知道数据来源并发送响应;若缺少该参数,接收方无法获取发送方地址。sendto通过dest_addr参数指定消息的接收方地址,确保消息正确发送;若缺少该参数,消息无法发送,操作将失败。文章还提供了一个简单的UDP服务器和客户端通信示例,展示了如何使用这些函数进行数据收发和地址处理。

2025-05-15 17:22:08 485

原创 【滑动窗口+哈希表/数组记录】Leetcode 3. 无重复字符的最长子串

给定一个字符串s,找出其中不含有重复字符的最长子串的长度。子字符串是字符串中字符序列。3解释:无重复字符的最长子串是"abc",长度为3。1解释:无重复字符的最长子串是"b",长度为1。3解释:无重复字符的最长子串是"wke",长度为3。请注意,答案必须是子串的长度,"pwke"是一个子序列,不是子串。

2025-04-25 16:55:30 335

原创 【滑动窗口+哈希表/数组记录】Leetcode 438. 找到字符串中所有字母异位词

给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。

2025-04-25 16:11:38 299

原创 【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组

给定一个整数数组nums和一个整数k,统计并返回该数组中和为k的子数组的个数。子数组是数组中元素的连续非空序列。

2025-04-25 14:48:53 369

原创 【维护窗口内最值+单调队列/优先队列】Leetcode 239. 滑动窗口最大值

给定一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。滑动窗口每次只向右移动一位。要求返回滑动窗口中的最大值。

2025-04-25 14:05:00 415

原创 【滑动窗口+哈希表/数组记录】Leetcode 76. 最小覆盖子串

给定两个字符串s和t,找到s中涵盖t所有字符的最小子串。如果不存在,则返回空字符串。

2025-04-25 10:20:48 332

原创 【行为设计模式】策略模式的常用场景和c++实现

策略模式是一种常见的行为设计模式,它允许你在。通过将不同的算法封装成独立的类,客户端可以在不修改调用代码的情况下动态地选择和切换算法。

2025-04-24 22:56:21 345

原创 抽象类相关

虚函数表的初始化主要在编译阶段和对象构造阶段完成。编译器在编译时为每个类生成虚函数表,在对象构造时为对象的虚表指针赋值。虚函数表的初始化确保了在调用虚函数时能够正确地找到对应的函数实现,支持运行时的多态行为。析构函数是用来在对象生命周期结束时释放资源的特殊成员函数。当基类的析构函数被声明为虚函数时,它就被称为虚析构函数。

2025-04-24 21:35:47 733

原创 力扣经典位运算

颠倒给定的32位无符号整数的二进制位。9641761923221225471输入是一个长度为32的二进制字符串。如果多次调用这个函数,你将如何优化你的算法?

2025-04-22 03:14:00 1099

原创 力扣经典拓扑排序

你这个学期必须选修numCourses门课程,记为0到。在选修某些课程之前需要一些先修课程。先修课程按数组给出,其中,表示如果要学习课程ai则必须先学习课程bi。例如,先修课程对[0, 1]表示:想要学习课程0,你需要先完成课程1。请你判断是否可能完成所有课程的学习?如果可以,返回true;否则,返回false。

2025-04-21 16:28:59 1345

原创 系统中的malloc怎么分配内存

malloc是C标准库中的一个函数,用于动态分配内存。malloc是通过向操作系统申请内存来实现的。

2025-04-20 16:36:30 693

原创 C++ static 关键字的用途与特点

static关键字在C++中是一个多功能的关键字,用于控制变量的存储期、作用域和链接属性。

2025-04-20 16:07:33 377

原创 如何检测内存泄漏

宏定义,并且把自己的函数函数命名为nMalloc和nFree。编译运行,没有段错误。所以通过宏定义能用自己的malloc和free,而不去使用系统的。如果要知道p1p2p3返回的是什么,可以打印地址。但这个情况不太对,返回的不是可以指向的地址。改写nMalloc,把指向内存的指针返回回来。编译运行,内存就对了。这里发现p2写成p1笔误了,但懒得改了,第二个地址应该是p2。😅注意:宏定义在预编译时要展开,所以这两个宏定义放在nMalloc和nFree之上不可行。

2025-04-06 13:17:01 900

原创 内存高级话题

new Anew A()面试凉经,代码最近写的太少了,被面试官屠杀。痛定思痛,对中的内存话题进行复现。new A。

2025-03-20 20:55:41 905

原创 高并发内存池的thread cache部分实现及测试

并发内存池的框架介绍及线程缓存的实现和测试

2025-02-25 22:51:15 837

原创 线程局部存储及thread_local说明符

线程局部存储是指对象内存在线程开始后分配,线程结束后回收;且每个线程都有该对象自己的实例。线程本身是操作系统的概念,线程局部存储这个功能离不开操作系统支持。不同操作系统对线程局部存储的实现有不同,使用的系统API也有区别。

2025-02-25 19:59:21 388

原创 定长内存池的实现、测试及错误分析

定长内存池解决固定大小的内存申请释放需求, 性能达到极致,不考虑内存碎片等问题。并且它到在项目中也是一个组件。

2025-02-24 22:37:17 933

原创 工厂模式简介

由工厂对象通过类型决定创建出来产品类的实例。通过参数控制可以生产任何商品。简单工厂模式下新增多个工厂,多个产品,每个产品对应一个工厂。将相关产品组成产品族,由同一个工厂统一生产。将工厂抽象成两层,抽象工厂具体工厂子类,在工厂子类中生产不同类型的子产品。

2025-02-06 17:49:10 333

原创 设计模式六大原则和单例模式

实现可重用解决方案,构筑易维护、可扩展的软件系统。

2025-02-06 17:40:54 648

原创 C++17新特性:支持初始化语句的if和switch

控制结构可以在执行条件前先执行初始化语句。是一个初始化语句,初始化语句中声明的变量。声明一个数组,并将数组作为实参传入。条件语句之前也可以初始化语句.初始化语句声明的变量会贯穿整个。结构,可以利用这个特性给整个。的初始化语句中可以构造一个。

2025-02-06 17:33:36 209

原创 C++17新特性:结构化绑定

获取上述条件不难,只要为目标类型提供。

2025-02-06 17:26:04 781

原创 职责链模式

避免将请求发送者和接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。处理请求的对象组成一条链(职责链),职责链可以是直线、环、树形结构。请求按职责链传递,链上的处理者对请求进行相应处理。客户端无需关心请求的处理细节及请求的传递,只需要将请求发送到链上。

2025-02-06 17:06:22 416

原创 C++RAII用法

有一个简单的服务器例子。在Windows系统上写一个C++程序,在客户端请求连接时,给客户端发一条消息,然后关闭连接。不需要保证客户端一定能收到。

2025-02-06 16:54:24 389

原创 DHCP协议原理(网络协议)

DHCP(动态主机配置协议)是一种网络管理协议,能够自动为局域网中的每台计算机分配IP地址及其他网络配置参数,包括子网掩码默认网关和DNS服务器等。这一机制极大简化了网络管理,尤其在大型局域网中,管理员无需手动为每台计算机配置TCP/IP协议,从而节省了时间并减少了因IP地址重复导致的网络问题。子网掩码是一种用于区分网络部分和主机部分的32位数字,通常以四个十进制数表示(例如:255.255.255.0)。它在IP地址中扮演重要角色,帮助网络设备识别哪些设备位于同一子网内。默认网关。

2024-09-20 10:28:36 1788

原创 select系统调用(实现I/O复用)

假设FD_SETSIZE是1024,且unsigned long是 8 字节,则8*sizeof(unsigned long)=64,1024/64=16,这意味着fd_set中需要16个unsigned long来表示 1024 个文件描述符的状态。对端调用了关闭操作,本端socket仍然可读,但读取的数据量为 0,表示连接已经正常关闭,而没有任何剩余数据可供读取。一个常量,定义了fd_set能容纳的最大文件描述符的数量,这限制了select能同时处理的文件描述符总量。异常条件通常包括紧急数据等。

2024-09-18 22:56:13 1071

原创 远程连接MySQL并操作

确认mysql.h是否已经正确安装。通常,mysql.h会位于/usr/include/mysql/目录下。如果你使用的是基于Debian的系统(如Ubuntu),可以在终端通过如下步骤安装MySQL开发包。以下两图为运行mysql.cpp前后的数据库数据,可以看到tbl_user成功插入了一条数据。在编译时,确保编译器能找到mysql.h文件。可以通过-I标志指定头文件路径。运行以下命令以确保你拥有最新的软件包列表。执行以下命令以安装MySQL客户端开发包。

2024-09-17 17:18:35 2023

原创 VSCode扩展连接虚拟机MySQL数据库

可以尝试查看数据库中当前的用户列表,判断该用户是否有效。若用户无权限,就需要创建新用户并授权,然后刷新权限。此时可确认用户名和密码是有效的,并且具有访问权限。在MySQL中,运行以下SQL查询,查看MySQL的使用端口。在vscode中打开终端,输入以下命令并输入密码,尝试用。说明用户名和密码有效,可以用这个用户名登录SQL。在终端输入以下命令 ,输入密码后,进入MySQL。在MySQL中,运行以下命令,查看主机名。可以看到,端口配置和默认一样,是3306。在终端中,运行以下命令,查看IP地址。

2024-09-17 13:38:05 1727

原创 TCP并发服务器的实现

打开三个网络调试助手(NetAssist),在每个助手中配置远端主机地址为你的tcp服务器地址(在虚拟机用ifconfig查看),端口设置为 8888,点击连接。首先启动所写的tcp服务器,即确保tcp_server_test.cpp已经编译并运行在虚拟机上,监听指定的端口(8888)。epoll采用事件驱动的方式,仅在有事件发生时通知应用程序,避免了轮询带来的性能开销。支持边缘触发(EPOLLET),在数据到达时通知一次,适合需要高效处理大量事件的场景。能够处理大量的文件描述符,适合高并发应用。

2024-09-16 23:03:03 964

原创 DNS协议与请求的代码实现

/ 定义DNS服务器的IP地址// 定义DNS服务器的端口号// 定义DNS查询类型:主机记录(A记录)// 定义DNS查询类型:别名记录(CNAME记录)// 标识符,用于匹配请求和响应// 标志字段,包含查询类型、响应状态等信息// 查询问题数量(即“问题区域”中的记录数)// 回答数量(即“回答区域”中的记录数)// 权威名称服务器数量(即“授权区域”中的记录数)// 附加记录数量(即“附加区域”中的记录数)

2024-09-16 15:07:19 1244

原创 socket相关API(Linux网络编程基础API)

如果套接字sockfd的类型是SOCK_DGRAM,则addr是默认用于发送数据报的地址,并且是接收数据报的唯一地址。如果套接字的类型是SOCK_STREAM或SOCK_SEQPACKET,此调用尝试连接到绑定到addr指定地址的套接字。如果在队列已满时到达了连接请求,客户端可能会收到ECONNREFUSED错误,或者如果底层协议支持重传,请求可能会被忽略,从而在之后的重试中成功连接。一个指向socklen_t类型的变量的指针,传入时指示addr缓冲区的大小,返回时更新为实际地址长度。

2024-09-15 17:01:00 979

原创 socket地址API(Linux网络编程基础API)

指向一个缓冲区的指针,用于存储转换后的二进制格式的IP地址。转换后的in_addr_t类型的地址(网络字节序)。用于将一个IPv4地址的字符串表示形式转换为网络字节序的二进制格式,并将结果存储在struct in_addr结构体中。:指向struct in_addr结构体的指针,用于存储转换后的二进制地址。地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。指向一个字符数组的指针,用于存储转换后的文本格式的IP地址。

2024-09-14 15:28:01 1435

原创 红黑树的插入(NGINX源码)

红黑树是每个节点都带有颜色属性的二叉查找树。它是一种自平衡的二叉查找树,能够在插入和删除数据时通过特定操作保持二叉查找树的平衡性,从而获得较高的查找性能。节点颜色:每个节点要么是红色,要么是黑色。根节点:根节点必须是黑色。叶节点:所有叶节点都是黑色。红色节点的子节点:红色节点的子节点必须是黑色(即不能有两个连续的红色节点)。每个节点的黑高:从任何节点到其所有后代叶节点的路径上,必须包含相同数量的黑色节点。

2024-09-13 21:42:48 1041

原创 文件操作函数

如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸,从原来的文件末尾到fseek移动之后的读写位置之间的字节都是0。系统对于每个打开的文件都记录着当前读写位置,当文件打开时,读写位置在文件开头,每调用一次fgetc,读写位置向后移动一个字节,因此可以连续多次调用fgetc函数依次读取多个字节。需要注意的是,返回的字符串是静态的,因此每次调用strerror都会覆盖之前的内容。直接在文件中读写结构体的程序是不可移植的,因为不同平台的大小端可能不同,结构体的填充方式也可能不同。

2024-09-12 08:40:31 832

空空如也

空空如也

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

TA关注的人

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