- 博客(84)
- 收藏
- 关注
原创 AutoCAD--图形命令和选项
本文系统介绍了AutoCAD2005中11种基础图形的绘制方法及操作指令。主要内容包括:1)直线(L)的直角坐标和极坐标绘制法;2)圆(C)的四种创建方式;3)矩形(REC)的标准绘制及特殊属性设置;4)多边形(POL)的两种构建方法;5)椭圆(EL)的长短轴绘制技巧;6)圆弧(A)的三点法和圆心法;7)多行文字(T)的格式设置及特殊符号输入;8)填充(H)命令;9)块的创建与插入流程;10)多段线(PL)与双直线(ML)的特性及绘制要点。文章以图文并茂的方式详细说明了各图形命令的具体操作步骤和参数选项。
2026-07-04 19:49:37
419
原创 Linux--日志的模拟实现
本文探讨了日志系统的实现原理,主要分为三个核心部分:1)采用锁机制保证多线程环境下的资源安全访问,通过封装pthread_mutex实现Mutex类和自动锁管理类LockGuard;2)基于策略模式设计日志刷新机制,支持控制台输出(ConsoleLogStrategy)和文件输出(FileLogStrategy)两种方式,后者包含路径创建和文件操作功能;3)构建完整的日志框架Logger,通过内部类LogMessage封装日志格式和输出逻辑,并配合宏定义简化调用接口。系统实现了日志级别、时间戳、进程ID等信
2026-03-27 17:34:16
257
原创 Linux--UDP/TCP客户端与服务端模拟实现计算器原理
本文通过实现一个网络计算器示例,深入探讨了OSI七层模型中应用层、表示层和会话层的实现原理。文章首先分析了TCP/IP模型与OSI模型的差异,重点说明了TCP面向字节流的特性及其序列化问题。随后详细介绍了计算器系统的架构设计,包括协议封装、套接字处理、服务器/客户端实现等核心模块。系统采用JSON进行数据序列化,通过自定义协议保证通信完整性,并使用多进程处理并发请求。文章通过流程图清晰地展示了服务端和客户端的调用逻辑,最后总结了应用层协议实现的关键要素。该示例有效演示了网络协议在实际应用中的具体实现方法。
2026-03-27 17:32:30
523
原创 Linux--信号
本文系统介绍了Linux信号处理的完整机制。首先阐述了信号的多种产生方式,包括键盘输入(如Ctrl+C)、系统调用(kill/raise)、硬件异常和软件条件等。其次解析了信号的保存机制,通过PCB中的block、pending和handler三个表来管理信号状态。最后深入分析了信号处理的时机,指出操作系统在内核态返回用户态时检查并处理信号。文章还探讨了中断机制(硬件中断、时钟中断和软中断)在信号处理中的作用,揭示了操作系统通过中断循环检查并处理信号的本质流程。整个信号处理过程涉及用户态与内核态的多次切换,
2026-03-03 18:36:14
461
原创 Linux-线程概念
本文介绍了Linux系统中线程的实现原理。线程本质上是共享同一虚拟地址空间的轻量级进程,通过多个task_struct结构体指向不同代码数据段实现。文章详细解析了页表映射机制,说明虚拟地址如何通过页目录、页表转换为物理地址。相比进程,线程创建和调度代价更小,且不会导致TLB和硬件缓存失效。虽然线程共享资源,但每个线程仍独占栈、寄存器和上下文数据。Linux通过轻量级进程模拟实现线程功能,体现了线程与进程在资源管理和调度上的关键差异。
2026-03-02 21:05:47
626
原创 Linux--进程间通信
本文介绍了进程间通信的两种管道机制。匿名管道通过pipe()函数创建,仅适用于有血缘关系的进程(如父子进程),具有单向通信、字节流传输和自带同步机制等特点。命名管道通过mkfifo()创建指定路径的管道文件,允许无血缘关系进程通信。文中提供了父子进程匿名管道通信和客户端-服务器命名管道通信的代码示例,展示了读写端操作流程。两种管道都通过让不同进程访问同一资源实现通信,但命名管道突破了血缘关系限制,适用于更广泛的进程间通信场景。
2026-02-14 17:27:40
662
原创 Linux--动静态库
本文介绍了C/C++中动静态库的创建与使用。静态库通过ar命令打包.o文件生成,使用时需在编译时指定库路径和名称。动态库使用gcc -shared生成,运行前需确保系统能找到库文件,可通过拷贝到系统目录、建立软连接、设置环境变量或新增配置文件四种方法解决路径问题。Linux系统默认使用动态库,静态链接需加-static选项。动态库可被多个应用程序共享使用,提高了代码复用性。文章还提供了模拟实现标准I/O库和字符串操作库的示例代码。
2026-02-12 10:59:47
556
原创 Linux--基础IO
本文介绍了Linux系统中的文件操作机制。首先回顾了C语言标准库中的文件操作函数(如fopen、fclose等)及其使用模式,然后深入讲解了Linux系统调用接口(如open、read、write等)的实现原理。重点阐述了文件描述符的概念及其在进程中的组织方式,解释了重定向(如dup2)的底层机制。最后讨论了用户级和内核级文件缓冲区的区别,分析了缓冲区的三种刷新策略(强制刷新、条件刷新、进程退出刷新),并通过示例说明了缓冲机制对程序行为的影响。全文系统性地揭示了从用户空间到内核空间的文件操作实现原理。
2026-02-01 14:15:06
741
原创 Linux--进程控制
本文详细讲解了Linux进程管理的核心概念,包括进程创建、终止、等待和替换四个关键环节。首先介绍了fork()函数创建子进程时的写时拷贝机制,确保进程独立性;其次阐述了进程终止的三种状态及退出码机制,比较了exit()与_exit()的区别;然后重点讲解了进程等待的两种方法(阻塞/非阻塞)及其对僵尸进程的解决方案;最后介绍了exec系列函数实现进程程序替换的原理。全文通过代码示例展示了各环节的实际应用,帮助读者系统理解Linux进程管理的完整生命周期。
2026-01-28 16:39:53
1067
原创 Linux--命令行参数和环境变量
本文介绍了Linux中命令行参数和环境变量的实现原理。命令行参数通过main函数的argv数组接收外部参数,argc记录参数个数,实现指令选项功能。环境变量帮助系统定位程序位置,可通过env命令查看,export/unset修改。程序获取环境变量有三种方式:environ变量、getenv函数及继承父进程环境变量。环境变量具有全局性可被继承,而本地变量仅限当前bash使用。
2026-01-25 14:52:39
328
原创 Linux--进程优先级和进程切换
本文介绍了Linux系统中的进程优先级概念及其操作方法。首先讲解了如何通过ps命令查看进程优先级(PRI),其中PRI值越小优先级越高,默认值为80,可通过修改NI值来调整。其次阐述了进程切换机制:CPU通过寄存器保存进程临时数据,在进程时间片结束后保存状态,下次运行时恢复继续执行。文章还指出Linux优先级范围为[60,99],修改优先级使用topr命令。这些机制共同保证了多进程环境下CPU资源的合理分配和高效利用。
2026-01-24 15:24:43
305
原创 Linux--进程状态
本文分析了Linux操作系统中的进程状态及管理机制。首先介绍了进程的三种核心状态:运行(位于CPU运行队列)、阻塞(移出调度队列)和挂起(数据交换到磁盘)。重点阐述了Linux如何通过struct task_struct和struct list_head结构体实现PCB节点在多个数据结构中的复用。最后详细说明了Linux特有的七种进程状态:R(运行)、S(可中断休眠)、D(不可中断休眠)、T(暂停)、t(调试暂停)、X(死亡)和Z(僵尸),其中特别指出僵尸状态可能导致内存泄漏,而孤儿进程会被init进程回收
2026-01-23 15:09:13
1547
原创 Linux--OS和认识进程
本文摘要:文章首先介绍了操作系统的基本概念和冯诺依曼体系结构的重要性,解释了其作为计算机基础架构的原因。然后阐述了操作系统的核心功能是管理软硬件资源,通过系统调用接口为上层应用提供服务。接着重点讲解了进程的概念,指出进程是程序执行的实例,由数据结构(如Linux中的task_struct)和程序数据组成。文章还介绍了Linux系统中查看进程信息的方法,包括ps命令和/proc目录的使用。最后讨论了fork函数创建子进程的机制,解释了父进程和子进程如何通过不同返回值区分执行路径。全文系统地介绍了操作系统和进程
2026-01-22 16:12:56
769
1
原创 Linux--git和cgdb
本文介绍了Linux环境下代码管理的两个实用工具:Git和CGDB。首先讲解了如何通过Git将代码上传到Gitee平台,包括安装Git、克隆仓库、添加文件、提交更改和同步到云端等操作步骤。接着介绍了CGDB调试器的使用方法,重点说明了如何编译带调试信息的程序,以及常用的调试命令,如设置断点(b)、单步执行(n/s)、查看变量(display)和管理断点(enable/disable)等。这些工具能有效提升Linux环境下的代码管理和调试效率。
2026-01-21 14:52:22
478
原创 C++--可变参数模板和lambda
本文介绍了C++11中的三个重要特性:1.可变参数模板,通过参数包支持可变数量的模板参数,可使用sizeof...计算参数个数,并通过递归展开参数包;2.emplace系列函数与push系列的区别,前者直接构造对象避免隐式转换;3.lambda表达式,包括基本语法、捕获列表(值捕获、引用捕获、混合捕获)及mutable关键字的作用。这些特性提升了C++的灵活性和效率,在模板编程和函数式编程中发挥重要作用。
2026-01-03 21:50:03
678
原创 C++11--引言折叠与完美转发
摘要:本文探讨了C++11中的引用折叠机制及其应用。首先介绍了引用折叠的基本规则:只有两个右值引用折叠才会保留右值引用属性,其他组合都会折叠为左值引用。通过模板函数实例化的案例分析,展示了不同类型参数(左值、右值、const引用等)在引用折叠中的表现。特别分析了"万能引用"的特性,即右值引用模板参数通过引用折叠可以同时接受左值和右值参数。最后介绍了完美转发技术,使用std::forward保留参数的原始值类别属性,解决了引用参数在传递过程中值类别丢失的问题。这些特性共同构成了C++现代模
2026-01-02 17:35:42
843
原创 Linux--gcc/g++
本文介绍了gcc/g++编译器在Linux系统中的使用方法和编译原理。主要内容包括:1)编译过程的四个阶段(预处理、编译、汇编、链接)及其对应的gcc选项(-E、-S、-c);2)动静态库的区别,动态库(.so)采用共享方式加载,静态库(.a)将代码直接拷贝到可执行文件中;3)两者的优缺点对比,动态库节省空间但依赖性强,静态库独立性强但体积较大。文章通过具体示例说明了各编译阶段的操作方法和生成文件,并解释了库文件在程序开发中的作用。
2025-12-18 13:45:19
810
原创 C++--右值和移动语义
本文探讨了C++11中引入的右值引用概念及其应用。首先区分了左值和右值的定义,指出右值通常是临时对象或常量。然后分析了左值引用和右值引用的语法规则及生命周期管理特点,强调右值引用能延长临时对象的生命周期。重点阐述了移动构造和移动赋值机制,通过"抢夺"内存而非深拷贝来优化性能,特别适用于需要频繁拷贝构造的场景。最后总结指出,左值引用和右值引用的核心目标都是减少拷贝、提高效率,而移动语义在深拷贝情况下尤为有效。
2025-12-17 16:07:04
388
原创 C++--哈希封装my_unordered_set和my_unordered_map
本文介绍了哈希表的封装实现及其在unordered_set和unordered_map中的应用。主要内容包括:1) 基本节点结构的修改,通过模板参数T实现通用性;2) 哈希表迭代器的实现,包含节点指针和哈希表指针,支持++操作;3) HashTable基本结构,通过友元声明使迭代器能访问私有成员;4) unordered_set的封装实现,使用SetKeyOfT仿函数获取键值。文章重点阐述了哈希表迭代器的核心逻辑,包括跨桶遍历的实现方法,以及如何通过模板参数区分set和map类型。该实现为unordered
2025-12-12 19:52:46
442
原创 Linux--vim编辑器
本文介绍了vim编辑器的基本使用方法与技巧。首先说明vim是vi的升级版,具有三种主要模式:命令模式(光标移动、复制粘贴等操作)、插入模式(文本输入)和底行模式(保存退出等命令)。重点讲解了命令模式下的常用快捷键,如gg/G跳转行首行尾、yy/dd复制剪切、u撤销等操作。此外还介绍了批量化注释、替换、分屏等实用技巧,以及通过.vimrc文件配置vim环境的方法,提供了一键配置vimforcpp的简易方案。文章内容实用,适合初学者快速掌握vim的基础操作。
2025-12-11 15:58:46
792
原创 哈希表实现--开放定址法
本文摘要:哈希表是一种通过哈希函数建立关键字与存储位置映射关系的数据结构。文章介绍了哈希冲突(不同关键字映射到同一位置)、负载因子(已存数据量与表大小的比值)等核心概念,并阐述了将关键字转化为整数的方法。重点讲解了处理哈希冲突的两种主要方法:开放地址法(包括线性探测、二次探测等)和链地址法(使用链表解决冲突)。文章还提供了链地址法的代码实现,包括节点结构、仿函数特化和扩容策略(使用质数表控制扩容大小),并详细说明了插入操作的实现过程。
2025-12-10 22:22:30
698
原创 Linux权限
Linux文件权限管理摘要:Linux通过角色(u,g,o)和权限位(r,w,x)控制文件访问。权限管理包括:1)chmod修改权限;2)chown/chgrp修改所有者/组;3)umask设置默认权限。目录权限中,r权限控制查看,w控制创建/删除,x控制进入。为保护公共目录文件不被非所有者删除,引入粘滞位机制。权限设置遵循"最终权限=默认权限&(~umask)"规则,普通用户只能修改自己创建的文件权限。
2025-12-04 14:39:49
471
原创 C++ 封装红黑树实现mymap和myset
本文基于红黑树实现了map和set的封装。通过类模板T统一处理不同类型数据,利用仿函数区分set和map的比较逻辑:set直接比较key,map比较键值对的key值。在实现上,set和map都包含迭代器、insert和find等基本接口,其中map还实现了[]运算符重载。特别处理了map中键不可修改而值可修改的特性,通过在pair类型中对key添加const限定来实现。最终实现了基于同一红黑树底层结构的map和set封装,保持了STL容器的核心功能。
2025-12-03 11:21:35
440
原创 C++--红黑树的实现
进⼀步分析,c(新增节点)是红⾊,p(新增节点的父亲节点)为红,g(父亲节点的父亲节点)必为⿊,这三个颜⾊都固定了,关键的变化看u(父亲节点的另一个孩子节点)的情况,需要根据u分为以下几种情况分别处理。2,非空树插⼊后,新增结点必须红⾊结点,如果⽗亲结点是⿊⾊的,则没有违反任何规则,插⼊结束,这就是上述的插入成功的情况。若p是g的右节点,c是p的左节点,则需要先以p节点进行右单旋,之后以g节点进行左单旋了,即右左双旋,c变黑,g变红。此时c节点一定为新增节点。若p是g的左节点,c是p的左节点,进行右单旋。
2025-09-24 13:45:55
677
原创 AVLTree的实现
摘要:本文详细介绍了AVL树的自平衡二叉搜索树特性及其实现。AVL树通过平衡因子(-1/0/1)控制高度差,保证插入、查找等操作的时间复杂度为O(logN)。重点讲解了AVL树的四种旋转操作(左旋、右旋、左右双旋、右左双旋)来维持平衡,并提供了完整的C++代码实现,包括节点结构、插入操作、平衡因子调整和验证方法。文中通过图示和代码示例展示了不同情况下的旋转处理,最后给出了完整的AVL树实现模板类。
2025-08-17 18:47:16
904
2
原创 二叉搜索树的模拟实现
本文介绍了二叉搜索树的数据结构及其基本操作。二叉搜索树具有左子树值小于等于根节点、右子树值大于等于根节点的特性,其时间复杂度最优为O(logN),最差为O(N)。文章详细阐述了二叉搜索树的节点结构、插入逻辑(通过比较key值确定位置)、查找算法(类似插入过程),重点分析了删除操作的三种情况:左右子树为空、单子树为空、双子树非空(需替换删除)。实现时需特别注意对父节点的标记处理,为后续AVL树和红黑树的学习奠定基础。
2025-08-17 08:34:46
1109
原创 算法讲解--水果成篮
题目要求从一系列水果树中选择连续子数组,使得子数组中最多包含两种水果类型,并找出最大子数组长度。关键点在于使用滑动窗口法,通过维护一个map记录当前窗口内水果类型及其数量。当窗口内类型超过两种时,移动左指针缩小窗口,直到满足条件。最终返回最大有效窗口长度。该方法避免了暴力枚举的低效,优化了时间复杂度。示例代码展示了如何用双指针实现滑动窗口,练习可通过LeetCode 904题进行巩固。
2025-08-11 17:56:23
914
原创 算法讲解--将x减到0的最小操作数
摘要:该问题要求通过从数组两端选取数字减去目标数X,找到使X恰好减为0的最小操作次数。解题思路是将问题转化为寻找连续子数组的和等于总和减X的差(target),从而转换为求满足条件的最大子数组长度,最终用数组长度减去该长度即为最小操作数。算法采用滑动窗口法优化暴力枚举,时间复杂度为O(n)。需要注意边界条件如target为负数或零的情况。代码实现展示了滑动窗口的具体应用,并通过练习链接提供了实践机会。
2025-08-11 10:56:17
714
原创 算法讲解--最大连续1的个数
本文介绍了寻找数组中最多翻转k个0为1后最长连续1子数组的算法。核心思路是使用滑动窗口法:维护左右指针left和right,统计窗口内0的数量。当0的数量超过k时,移动left指针并减少0计数;否则继续扩展right指针。每次窗口扩展时更新最大连续1的长度。该方法避免了暴力枚举,将时间复杂度优化至O(n)。文章通过示例详细演示了算法流程,并提供了C++代码实现,其中zero变量记录窗口内0的数量,nurber记录最大长度。最后推荐在LeetCode上进行练习巩固该算法。
2025-08-03 20:36:59
910
原创 C++--多态
本文介绍了C++中多态的概念与实现方式。多态分为编译时多态(静态多态,如函数重载)和运行时多态(动态多态)。动态多态通过虚函数实现,需要满足两个条件:1)使用基类指针或引用调用虚函数;2)派生类对基类虚函数进行重写。文章详细讲解了虚函数的重写规则、析构函数的重写必要性、override和final关键字的作用,以及纯虚函数与抽象类的特性。通过售票和动物叫声等实例,说明了多态如何实现同一函数在不同对象上产生不同行为的效果。
2025-08-01 20:47:08
1005
原创 算法讲解--长度最小的子数组
摘要 本文介绍了求解最小长度子数组的问题,要求子数组和≥target且元素连续。分析了暴力枚举法的不足,提出更优的滑动窗口算法:通过双指针动态调整窗口范围,当和≥target时记录最小长度并移动左指针,否则扩展右指针。给出了C++实现代码,强调边界条件处理,并提供了力扣练习链接。该算法时间复杂度为O(n),有效解决了连续子数组求和问题。
2025-07-29 10:19:58
315
原创 算法讲解--三数之和
这篇讲解介绍了如何用双指针法解决「三数之和」问题。核心思路是先将数组排序,然后固定一个数作为基准,在剩余部分使用双指针寻找和为固定数相反数的两个数。通过跳过重复值来避免结果重复,时间复杂度优化至O(n^2)。代码实现中使用了三层while循环处理去重问题,最终返回所有满足条件的三元组。
2025-07-28 10:49:40
800
原创 算法讲解--查找总价值为目标值的两个商品
本文介绍了在升序数组中寻找两个数使其和等于目标值的算法。暴力解法采用双重循环,时间复杂度O(N²)可能超时。更优解法是双指针法:初始时左指针指向最小元素,右指针指向最大元素,通过比较当前和与目标值调整指针位置(和过大则右指针左移,过小则左指针右移),时间复杂度O(N)。该算法适用于有序数组,能高效找到解或确定无解。文末提供了LeetCode练习题供巩固。
2025-07-25 15:22:35
504
原创 算法讲解--有效三角形的个数
【摘要】本文介绍了如何统计数组中能构成有效三角形的组合数量。关键点在于判断三边是否满足三角形条件:有序数组中只需判断最小两边之和大于第三边。通过排序可将时间复杂度从O(n^3)优化到更优。文章详解两种解法:1)暴力法通过三重循环枚举所有组合;2)双指针法在排序后固定最大边,用双指针高效统计有效组合。最终给出C++实现代码,并推荐LeetCode相关练习题。两种方法均需先排序,双指针法效率更高。
2025-07-25 14:43:39
1099
原创 算法讲解--盛最多水滴容器
摘要:本文介绍了求解最大水池面积的算法。通过暴力解法(O(N²))和双指针法(O(N))对比,重点讲解了双指针法的原理:从数组两端向中间移动,每次移动较小高度的指针,记录各区间最大面积。代码实现采用双指针遍历,动态更新最大面积,避免了额外空间开销。最后推荐LeetCode相关练习题。
2025-07-24 09:17:42
429
原创 Linux--指令初识
本文介绍了Linux常用指令及其用法:1. 目录操作指令:pwd显示当前路径,mkdir创建目录,rmdir删除空目录(支持-p参数删除父目录),rm删除文件或目录(-r递归删除,-i询问确认)2. 文件查看指令:cat查看文件内容(-b/-n编号),more/less分页查看(less支持双向翻页),head/tail查看文件首尾内容3. 其他指令:mv移动/重命名文件,man查看命令手册,echo配合>或>>实现文件重定向/追加重定向4. 文件类型:包括普通文件(-)、目录(d)、字符
2025-07-22 20:50:26
652
原创 Linux--初识linux
本文介绍了Linux系统的基本概念和常用指令。重点讲解了文件/目录的概念,包括文件=内容+属性的特性。详细说明ls指令的三种用法:ls显示文件名、ls -l显示详细信息、ls -a显示所有文件(含隐藏文件)。同时解释了Linux树形目录结构和两种路径表示方式(绝对路径与相对路径),以及cd指令用于切换工作目录的用法。最后指出Linux指令本质上是可执行文件。这些基础知识为Linux操作提供了入门指导。
2025-07-21 20:32:48
470
原创 算法讲解--快乐数
摘要:本文介绍了判断"快乐数"的两种算法。快乐数指经过各位平方和后最终等于1的数字。第一种方法基于快乐数在1000次运算内必循环的规律,通过1000次迭代验证结果是否为1。第二种方法采用双指针技术,通过快慢指针检测循环,若相遇时值为1则为快乐数。两种方法都通过辅助函数计算数字各位平方和。文章最后推荐在LeetCode平台练习相关题目(202题)。
2025-07-21 11:30:08
468
原创 算法讲解--复写零
文章摘要:本文介绍两种在数组中处理零元素的方法。双指针法通过从数组末尾开始复写,遇到零时插入新零并调整指针位置;vector库法则利用insert和resize函数直接在前端插入零并截断数组。两种方法均需处理边界情况,如指针越界或数组长度限制。文末提供力扣练习题链接以供实践。
2025-07-20 17:23:32
343
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅