自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基础IO

本文系统性地阐述了文件操作的核心概念与实现机制。首先从狭义和广义角度定义文件,指出Linux中一切皆文件的抽象理念,分析文件由元数据和内容组成的本质。文章详细解析了进程与文件的关系,包括文件描述符、内核数据结构关联及重定向原理,并通过代码示例展示了系统调用与库函数的封装关系。深入探讨了缓冲区的类型与作用机制,对比了用户级与内核级缓冲区的差异。最后从操作系统层面揭示了虚拟文件系统(VFS)的设计思想,通过函数指针实现设备无关的统一接口。全文通过理论阐述与代码实践相结合的方式,完整呈现了文件I/O从应用到内核的

2026-06-04 20:25:19 259

原创 自定义Shell

核心逻辑:通过getenv函数获取系统环境变量USER(用户名)、HOSTNAME(主机名)、PWD(当前工作路径),按格式拼接并打印命令行提示符。str: 目标字符缓冲区指针,用于存储格式化后的字符串。size: 缓冲区总大小(字节)。函数最多写入size-1个有效字符,并自动在末尾补\0。format: 格式化字符串(与printf用法完全一致,如%d%s%f...: 可变参数列表,对应format中的占位符。snprintf 本身不会把内容打印到屏幕上!它只负责。

2026-06-01 17:44:09 205

原创 跳表(skiplist)

跳表是一种基于多层有序链表的高效查找结构,由William Pugh在1990年提出。它通过在底层有序链表上建立多层索引,将查找时间复杂度优化至O(logn)。跳表通过随机层数分配(通常p=1/4,maxlevel=32)来平衡插入/删除效率,避免严格的比例维护。相比平衡树,跳表实现更简单,空间消耗更低(平均1.33指针/节点),且天然支持范围查询。其核心操作包括:查找(逐层比较)、插入(随机层数+前驱链接)和删除(前驱解除链接)。虽然存在随机性导致局部波动,但跳表在实现复杂度、空间效率和功能扩展性方面具有

2026-05-26 22:51:33 430

原创 B-树

B树是一种高效的外存数据结构,主要用于处理大规模数据存储和检索问题。它通过多叉树结构降低树高,减少磁盘I/O次数,显著提升查询效率。B树的核心特性包括:节点包含多个关键字和子节点指针,所有叶子节点位于同一层,关键字有序排列。B+树和B树是其优化版本,B+树将数据全部存储在叶子节点并通过链表连接,适合范围查询;B树通过兄弟指针减少分裂概率。这些结构广泛应用于数据库索引(如MySQL的InnoDB和MyISAM引擎),其中InnoDB采用聚集索引直接存储数据,MyISAM使用非聚集索引存储数据地址。B树系列因其

2026-05-26 19:42:02 370

原创 LRU Cache

LRU是least Recently Used的缩写,意思是最近最少使用,他是一种Cache替换算法。什么是Cache?狭义的Cache指的是位于CPU和主存之间的快速RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache,内存与磁盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache——称为Internet临时文件夹或网络内容缓存等。

2026-05-21 21:20:08 256

原创 数据结构:图

本文系统介绍了图论的基本概念、存储结构、遍历算法以及最短路径和最小生成树算法。主要内容包括:1. 图的基本概念:定义有向图、无向图、完全图、连通图等术语,解释顶点度、路径、子图等核心概念。2. 存储结构:详细讲解邻接矩阵和邻接表两种存储方式,分析各自的优缺点,并提供完整的C++实现代码。3. 遍历算法:介绍广度优先搜索(BFS)和深度优先搜索(DFS)的实现原理和应用场景。4. 最小生成树算法:对比Kruskal和Prim算法的设计思路、实现方法和适用场景。5. 最短路径算法:分析Dijkstra、Bell

2026-05-21 17:11:27 484

原创 并查集

本文介绍了并查集(Union-Find)数据结构及其应用。并查集用于管理不相交集合的合并与查询操作,通过数组实现树形结构,其中负数表示根节点并存储集合大小。文章通过校招学生分组案例说明并查集的四个核心操作:查找元素所属集合、判断元素是否同属一个集合、合并两个集合以及统计集合数量。随后给出了并查集的C++模拟实现代码,包含查找根节点、合并集合和统计集合数等方法。最后通过LeetCode两道题目展示了并查集的实际应用:省份数量问题通过城市连接关系统计省份数,等式方程问题利用并查集验证方程的可满足性。

2026-04-21 21:03:17 407

原创 进程控制

在Linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。include<unistd.h>pid_tforkvoid返回值:⼦进程中返回0,⽗进程返回⼦进程id,出错返回-1fork之前父进程独立执行,fork之后,父子两个执行流分别执行。(注意:fork之后,谁先执行完全由调度器决定)。

2026-04-17 19:50:25 361

原创 进程概念

本文系统介绍了计算机系统中的核心概念:冯诺依曼体系结构、操作系统管理和进程机制。首先阐述了冯诺依曼体系的基本组成(输入单元、CPU、内存、输出单元)及其"所有设备只能直接和内存打交道"的关键原则。然后详细讲解了操作系统的管理功能,包括进程管理(通过PCB/task_struct描述和组织进程)、内存管理和文件系统。在进程部分,深入分析了进程状态(运行、阻塞、僵尸等)、优先级调度、地址空间映射(虚拟地址到物理地址的转换)以及进程创建(fork机制)等核心机制。最后探讨了环境变量的作用机制和

2026-04-10 10:22:19 407

原创 Linux基础开发工具

本文摘要:本文系统介绍了Linux系统下的核心开发工具链,包括软件包管理器(yum/apt)、文本编辑器(vim)、编译器(gcc/g++)、构建工具(make/Makefile)以及调试器(gdb/cgdb)的使用方法。重点讲解了vim的三种模式及高效编辑技巧,gcc的编译四阶段(预处理-编译-汇编-链接),Makefile的自动化构建原理和进阶语法,并演示了进度条程序的实现。最后介绍了版本控制工具Git的基本操作和调试技巧,为Linux环境下的软件开发提供了全面的技术指导。

2026-03-17 17:28:24 382

原创 Linux的权限

Linux严格意义上来说是一个操作系统,我们称之“核心(kernel)”,但是我们一般用户不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。为什么不能直接使用kernel呢?从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含,我们操作windows不是直接操作windows内核,而是通过图形接口,点击从而完成我们的操作。,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。

2025-12-29 19:45:58 884

原创 计算器实现

我们日常写的计算表达式都是中缀表达式,也就是运算符在中间,运算数在两边,但是直接读取无法马上进行运算因为一个计算表达式还涉及到运算符优先级文题。如:1-2*(3-4)+5中遇到 -和 * 都无法运算,因为后面还有括号优先级更高。所以其中一种思路是把中缀表达式转换成后缀表达式,将运算数放到前面,运算符放到运算数的后面,然后我们依次读取后缀表达式,遇到运算符就可以直接进行运算了。

2025-12-28 17:28:22 503

原创 Linux的基本指令

语法:ls [选项] [目录或文件]功能:对于目录(这里的目录就相当于文件夹),该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。建立一个空的文件夹也会占据磁盘空间(文件夹属性占据的空间)文件 = 内容 + 属性Linux系统中一切皆文件,键盘,显示器等也都是文件- :普通文件d :目录文件c :字符文件,键盘、显示器、终端、输入的数据具有顺序性b :块设备文件,磁盘| :连接文件p :管道文件任何一个目录,即便是空目录,默认系统都会自带 . 和 .. 目录。

2025-12-27 18:03:55 851

原创 模拟实现反向迭代器

本文实现了一个通用的反向迭代器适配器模板ReverseIterator,通过封装正向迭代器实现反向遍历功能。关键点包括:1) 反向迭代器operator++底层调用正向迭代器的operator--;2) operator*访问当前位置前一个元素;3) rbegin()封装end()位置,rend()封装begin()位置。同时实现了list容器及其迭代器,支持正向/反向迭代、插入删除等操作。反向迭代器作为独立组件,可以与不同容器配合使用,只需传递对应正向迭代器即可生成相应的反向迭代器。

2025-12-20 17:17:22 348

原创 智能指针的使用及其原理

本文系统介绍了C++智能指针的原理与应用。首先通过内存泄漏案例展示了智能指针的使用场景,阐述了RAII资源管理思想及其在智能指针中的实现。重点分析了标准库中的四种智能指针:auto_ptr(已废弃)、unique_ptr(独占所有权)、shared_ptr(共享所有权)和weak_ptr(解决循环引用)。详细讲解了它们的实现原理,包括引用计数机制和删除器支持,并提供了模拟实现代码。特别探讨了shared_ptr循环引用问题及weak_ptr的解决方案。最后总结了内存泄漏的危害与检测方法,强调智能指针在资源管

2025-12-11 15:53:23 670

原创 C++异常

本文系统介绍了C++异常处理机制。异常处理通过抛出对象实现错误通信,允许将错误检测和处理分离。主要内容包括:1)异常概念,相比C语言错误码更全面;2)抛出和捕获机制,通过try-catch匹配处理;3)栈展开过程,从内到外查找匹配catch;4)异常继承体系,通过基类捕获派生类异常;5)异常重抛机制处理特定错误;6)异常安全问题及RAII解决方案;7)C++11的noexcept规范;8)标准库异常继承体系。文章通过多个代码示例展示了异常处理的实际应用,包括数据库、缓存、网络等模块的异常处理设计。

2025-12-05 10:49:10 854

原创 C++11

本文主要介绍了C++11标准引入的重要新特性,包括列表初始化、右值引用、移动语义、可变模板参数、lambda表达式等。重点阐述了右值引用如何通过移动语义解决传值返回的性能问题,以及完美转发机制保持了参数原有属性。同时详细解析了lambda表达式的语法原理及其应用场景,展示了std::function包装器和bind适配器的使用方法,并介绍了类默认成员函数的扩展规则。这些新特性显著提升了C++的性能表现和代码简洁性,为现代C++开发提供了更强大的工具支持。

2025-10-30 19:15:14 905

原创 算法:分治-快速排序

本文介绍了四种基于三路划分的排序与选择算法:1.颜色分类算法通过划分0、1、2三个区域实现O(n)时间复杂度排序;2.三路快速排序利用随机枢轴和区间划分实现高效排序;3.快速选择算法通过三路划分在O(n)时间内寻找第k大元素;4.库存管理问题采用类似快速选择的方法获取前k小元素。这些算法都利用了区间划分的思想,通过维护多个指针来高效处理元素分组,其中随机化枢轴选择和三路划分特性使其在处理重复元素时表现优异,平均时间复杂度为线性或准线性。

2025-08-01 18:07:56 575

原创 用哈希表封装Myunordered_map和Myunordered_set

本文分析了C++中set/map与unordered_set/map的区别及实现原理。在SGI-STL30版本中,unordered容器以非标准的hash_map/hash_set形式实现,基于hashtable构建。文章详细介绍了哈希表的模拟实现过程:1) 框架搭建,通过KeyOfT仿函数解决不同类型数据访问问题;2) 迭代器实现,重点解决了operator++的跨桶遍历问题;3) 针对unordered_map实现了operator[]操作;4) 处理了key不可修改的特性。通过模板参数和仿函数设计,实

2025-07-27 11:26:29 672

原创 哈希的使用及其模拟实现

本文详细介绍了C++中unordered_map和unordered_set的实现原理及使用方法。首先分析了unordered_set的底层实现,指出其基于哈希表实现,平均时间复杂度为O(1),与set的红黑树实现(O(logN))形成对比。然后深入探讨了哈希表的实现机制,包括哈希函数设计(除法散列法、乘法散列法、全域散列法等)和冲突解决策略(开放定址法、链地址法)。文章还提供了两种冲突处理方式的完整代码实现:开放定址法采用线性探测策略,并引入状态标识解决删除问题;链地址法通过链表连接冲突元素,支持负载因子

2025-07-25 11:18:22 709

原创 算法:模拟

'a''z'???

2025-06-09 21:53:02 1102

原创 算法:位运算

: 有0就是0。|:有一就是一^:相同为0,相异为1。哈希表中里面开32个空间n & (-n)。将最右侧的1,左边的区域全部变成相反的。

2025-06-08 21:11:47 759

原创 算法:前缀和

这道题如果使用暴力解法时间复杂度为O(n*m),会超时,所以要使用前缀和算法。前缀和->快速求出数组中某一个连续区间的和。第一步:预处理出一个前缀和数组 dp。dp[i]表示[1, i] 区间内所有元素的和,dp[i] = dp[i - 1] + arr[i]。第二步:使用前缀和数组要求[l, r] 区间的值,就等于dp[r] - dp[l - 1]。

2025-06-05 17:47:37 1220

原创 算法:二分查找

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)用二分查找解决,要查找一个区间要找去左端点和右端点。1. 查找区间的左端点细节处理:1.循环条件 left < right而不是left <= right ,因为left == right 的时候就是最终结果,无需判断。

2025-06-02 12:26:36 937

原创 算法:滑动窗口

​数据污染​当处理完偏移量i=0后,hash2会保留窗口中的单词频次。当处理i=1单词频次统计错误(包含前一轮的数据)count计数器失效(累计了无效计数)public://保存words里面所以单词的频次hash1[e]++;i < len;i++)//执行len次,因为words字符串出现的地方不一定是len整数倍的地方//维护窗内单词的频次//进窗口count++;if(right - left + 1 > len * m)//判断count--;//出窗口。

2025-05-31 23:15:49 1374

原创 封装红黑树实现map和set

如果节点的右不为空,说明这个子树的中序没有走完,再走右子树的最左节点;如果节点的右为空,那么这棵子树已经中序遍历完了,此时下一步要找祖先结点,当当前节点是父亲节点的左的时候停止,这个父亲节点就是下一步要走的结点。,其中构造时要传_root是因为在实现operaor--时需要--end(),需要找到这棵树的最右节点,所以需要传_root。--的逻辑与上面++的逻辑相反,节点的左不为空,就先走左的最右节点;左为空,就找祖先中,当前节点是父亲的右就停止。

2025-05-28 19:17:04 753

原创 红黑树实现

红黑树是一棵二叉搜索树,他的每个节点增加一个存储位来表示节点的颜色,可以是红丝或者黑色。通过对任何一条从根到叶子的路径上各个节点的颜色进行约束,,因而是接近平衡的。

2025-05-16 21:10:38 1116

原创 AVL树实现

AVL树是一种自平衡二叉搜索树,由G.M. Adelson-Velsky和E.M. Landis于1962年提出。其核心特性是每个节点的左右子树高度差不超过1,通过平衡因子(右子树高度减左子树高度)来维护平衡。AVL树的插入操作遵循二叉搜索树规则,插入后更新平衡因子,若出现不平衡(平衡因子为2或-2),则通过旋转操作恢复平衡。旋转分为四种:左单旋、右单旋、左右双旋和右左双旋。AVL树的查找、插入、删除等操作的时间复杂度均为O(logN),相较于普通二叉搜索树,其平衡性显著提升了操作效率。代码实现中,通过平衡

2025-05-10 18:03:51 824

原创 map和set的使用

set的声明如上,T是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历走的是搜索树的中序,所以是有序的。

2025-05-03 11:43:47 911

原创 二叉搜索树

场景1:⼩区⽆⼈值守⻋库,⼩区⻋库买了⻋位的业主⻋才能进⼩区,那么物业会把买了⻋位的业主的⻋牌号录⼊后台系统,⻋辆进⼊时扫描⻋牌在不在系统中,在则抬杆,不在则提⽰⾮本⼩区⻋辆,⽆法进⼊。场景2:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。场景3:统计⼀篇⽂章中单词出现的次数,读取⼀个单词,查找单词是否存在,不存在这个说明第⼀次出现,(单词,1),单词存在,则++单词对应的次数。

2025-04-23 11:10:36 984

原创 C++ 多态

多态是一个继承关系下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象全价买票。Student对象优惠买票。

2025-04-20 19:38:55 886

原创 算法专题:双指针

双指针算法两个指针的作用:cur:从左向右遍历数组 dest:已处理区间内非零元素的最后一个位置。非零元素0待处理cur遍历过程中遇到0元素cur++,遇到非0元素交换cur和dest+1位置的值,dest++和cur++

2025-04-12 20:06:58 964

原创 C++ 继承

我们看到Person是基类,也称作父类,Student是派生类,也叫做子类。

2025-04-12 20:06:27 891

原创 stack和queue

适配器是一种设计模式(设计模式是一套反复使用的,多数人知晓的,经过分类编目的,代码设计经验的总结)该种模式是将一个类的接口转换成了客户希望的另一个接口。容器适配器就像我们的电源适配器一样。是一种转化接口,把一种接口转化为我们需要的接口。deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入删除操作,且时间复杂度为O(1),与vector相比,头插效率高,不需要搬移元素,与list相比,空间利用率高。

2025-04-05 22:54:36 1083

原创 模版的特性及其编译分离

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所以目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。优点1.模版复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性缺点1.模版会导致代码膨胀问题,也会导致编译时间变长2.出现模版编译错误时,错误信息非常凌乱,不易定位错误。

2025-04-05 22:54:06 1025

原创 vector及其模拟实现

构造函数声明接口说明vector()无参构造构造并初始化n个val拷贝构造使用迭代器进行初始化构造int main()return 0;

2025-03-16 17:06:32 1092

原创 list及其模拟实现

list其实就是一个带头双向链表。

2025-03-16 17:06:09 1023

原创 string类

string的文档介绍在使用string类时,必须包含using namespace std;

2025-02-17 11:28:34 988

原创 C++模版(初阶)

templateclassT1classT2, ...,classTnclass类模板名// 类内成员定义public:,_size(0){}~Stack()//模板不建议声明和定义分离到两个文件.h和.cpp中,会出现链接错误。int main()//类模板类型都是显示实例化return 0;

2024-12-08 21:57:47 961

原创 C/C++内存管理

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc和free不会。int main()// new/delete对于自定义类型除了开空间还会调用构造函数和析构函数free(p1);delete p2;*/A aa1(1);A aa2(2);A aa3(3);return 0;new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造new T[N] 的原理。

2024-12-07 22:48:39 938

空空如也

空空如也

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

TA关注的人

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