- 博客(99)
- 收藏
- 关注
原创 Linux多线程(六):线程池
本文摘要: 线程池是一种基于池化技术的多线程管理方案,其核心思想是预先创建并维护一组可重用的线程资源,通过"空间换时间"和"复用"机制提升系统性能。文章首先通过共享单车的比喻形象说明池化技术的优势,然后重点分析了线程池的应用场景(如Web服务器处理短时任务)和实现原理。作者实现了三个版本的线程池(基础版、C++11版和模板版),其中基础版采用生产者-消费者模型,使用互斥锁和条件变量保证线程安全,通过封装原生线程库简化操作。测试结果表明线程池能有效避免频繁创建/销毁线程
2025-12-01 16:57:24
635
原创 Linux多线程(五):POSIX信号量+生产者消费者模型(下)
本文介绍了POSIX信号量的概念及其在生产者和消费者模型中的应用。POSIX信号量是一种用于线程和进程同步的计数器机制,通过PV操作(原子性的增减操作)实现对共享资源的无冲突访问。信号量包含等待队列,当资源不足时会挂起执行流。 在基于环形队列的生产者消费者模型中,使用两个信号量分别管理空间资源(p_sem)和数据资源(c_sem)。生产者申请空间资源后生产数据并释放数据资源,消费者则相反。关键规则是:生产者和消费者不能访问同一位置,且生产者不能超过消费者一圈以上。文章提供了单生产单消费模型的C++实现代码,
2025-11-25 22:17:12
385
原创 Linux多线程(四):生产者消费者模型(上)
生产者消费者模型通过缓冲区解耦生产者和消费者,提升系统效率。该模型遵循"321原则":三种互斥关系(生产者间、消费者间、生产消费间)、两种角色(生产者和消费者)、一个交易场所(共享缓冲区)。基于阻塞队列的实现中,当队列空/满时自动阻塞消费者/生产者,确保同步与互斥。其核心优势包括:降低耦合、支持并发、平衡负载、削峰填谷。代码示例展示了使用互斥锁和条件变量实现的线程安全阻塞队列,通过条件变量实现生产消费的协同,避免死锁并处理伪唤醒问题。该模型广泛应用于多线程编程,提升系统吞吐量和资源利用率
2025-11-24 13:24:30
881
原创 Linux多线程(三):线程同步与互斥
本文介绍了线程互斥的相关概念及实现方法。首先解释了临界资源、临界区、互斥和原子性等关键概念,通过黄牛抢票示例揭示了非原子操作带来的问题。重点分析了ticket--操作的非原子性导致的条件判断失效问题,并提出使用互斥量(mutex)解决方案。文章详细讲解了互斥量的初始化、销毁、加锁和解锁接口,并以抢票问题为例展示了如何用互斥量保护临界资源。最后强调加锁的本质是用时间换取安全,实现线程对临界区代码的串行执行,同时指出应尽量缩小临界区范围以提高效率。
2025-11-18 13:14:40
1067
原创 【0基础学算法】常见位运算总结
位运算操作指南 本文总结了常见位运算操作,包括基础运算符(左移、右移、取反、与、或、异或)及其实际应用。重点介绍了7种实用技巧:判断某二进制位状态、修改特定位的值、位图哈希思想、提取/删除最右侧的1等,均配有图解说明和代码示例。特别强调了异或运算的三大定律和位运算优先级的处理建议(多用括号)。内容简明实用,适合编程人员快速掌握位运算核心技巧。
2025-11-13 11:31:32
293
原创 Linux多线程(二):线程控制和线程的深入理解
本文主要介绍了Linux中的POSIX线程库pthread的基本用法。pthread是Linux应用层的原生线程库,属于第三方动态库,需通过-lpthread选项链接。文章详细讲解了线程创建函数pthread_create的参数说明,并通过示例代码演示了多线程创建。还介绍了获取线程ID的pthread_self函数和线程等待函数pthread_join,强调了线程等待的重要性以避免内存泄漏。文中指出Linux中用户级线程ID与内核LWP的对应关系,并通过ps -aL命令展示了线程的实际运行情况。最后通过示例
2025-11-09 17:09:13
636
原创 Linux多线程(一):线程概念
本文从内核角度深入探讨了线程的本质,解释线程是进程内的执行分支,通过task_struct结构实现轻量化调度。文章分析了Linux采用"轻量级进程"模拟线程的设计优势,对比了Windows的真线程方案。同时详细剖析了多级页表映射机制和虚拟地址转换原理,阐述了页表基地址+偏移量的设计思想。最后总结了线程在创建开销、切换效率、资源占用等方面的优点,以及可能带来的性能损失和健壮性降低问题,区分了计算密集型和IO密集型任务的特点。
2025-11-08 21:32:34
915
2
原创 Linux信号(下):信号保存和信号处理
本文深入探讨了Linux信号处理机制,主要包含以下内容: 信号基本概念:解释信号递达、未决和阻塞的区别,强调阻塞不同于忽略。 内核表示:通过位图结构(block、pending)和函数指针数组(hander)描述信号在进程控制块中的存储方式,说明普通信号和实时信号的处理差异。 信号集操作:介绍sigset_t类型及相关函数(sigemptyset、sigaddset等),强调必须初始化信号集。 信号屏蔽:详细说明sigprocmask函数如何修改信号屏蔽字,以及sigpending获取未决信号集的方法。 处
2025-11-04 15:21:32
749
2
原创 Linux信号(上):信号概念、信号产生
信号机制与进程控制 摘要:信号是Linux系统中进程间异步通信的软中断机制。通过硬件中断触发(如Ctrl+C)或系统调用(如kill)产生信号后,进程可能延迟处理但必须临时保存信号。信号处理方式包括默认动作、忽略或自定义捕捉(如signal函数注册)。关键特性包括:1)前台进程可接收终端信号;2)9号等特定信号无法被捕捉;3)异步处理机制使进程能继续执行主要任务。实验证明,通过修改31个普通信号的处理动作可创建"顽固"进程,但操作系统保留了9号信号作为强制终止手段。该机制实现了灵活进程控
2025-11-02 20:52:23
577
原创 Linux的31个普通信号含义表
Linux系统信号概述:kill -l命令可查看所有信号,其中1-31号为普通信号,其余为实时信号。普通信号包含SIGHUP(1)、SIGINT(2)、SIGQUIT(3)等终端控制信号,SIGKILL(9)强制终止信号,以及SIGSEGV(11)内存访问错误等系统异常信号。部分信号如SIGUSR1(10)、SIGUSR2(12)支持用户自定义用途。这些信号主要用于进程控制(终止/暂停)、错误处理(产生core文件)和进程间通信,默认动作多为终止进程。
2025-10-31 10:53:24
951
原创 【0基础学算法】前缀和刷题日志(三):连续数组、矩阵区域和
连续数组问题 题目要求找出最长的连续子数组,其中0和1的数量相等 解题方法:将0转为-1后,转化为求最长和为0的子数组问题 使用前缀和+哈希表策略: 哈希表记录前缀和首次出现位置 遇到相同前缀和时计算当前子数组长度 时间复杂度:O(n),空间复杂度:O(n) 矩阵区域和问题 题目要求计算每个元素在k距离内的邻域和 解题方法:构建二维前缀和矩阵快速计算区域和 关键步骤: 预处理生成前缀和矩阵 对每个元素确定邻域边界坐标 使用前缀和公式计算区域和 时间复杂度:O(nm),空间复杂度:O(nm) 两题均利用前缀和
2025-10-30 22:35:39
438
原创 【0基础学算法】前缀和刷题日志(二):前缀和与子数组的心动瞬间
该文章介绍了两道与子数组和相关的问题及解法: 和为k的子数组(LeetCode 560): 暴力解法(O(n²))会超时 优化解法使用哈希表存储前缀和及其出现次数 通过查找sum-k的前缀和数量来统计结果 关键点:哈希表更新时机及边界处理(hash[0]=1) 和可被K整除的子数组(LeetCode 974): 基于同余定理的解法 负数取模需要特殊处理((sum%k+k)%k) 使用哈希表存储前缀和模k的余数 查找相同余数的前缀和数量进行统计 两题均通过前缀和+哈希表将时间复杂度优化到O(n),避免了暴力解
2025-10-29 12:52:33
905
原创 Linux进程间通信:管道与System V IPC的全解析
进程间通信摘要 进程间通信(IPC)是不同进程之间进行数据交互的机制。由于进程独立性,通信成本较高。IPC本质是让不同进程访问同一份资源(特定内存空间),通常由操作系统提供。主要分类包括管道(匿名/命名)、System V IPC和POSIX IPC等。 匿名管道通过父子进程共享文件资源实现单向通信,需搭配pipe和fork函数使用。其特征包括:血缘关系限制、单向通信、同步互斥、字节流传输等。命名管道则通过唯一文件名允许无亲缘关系进程通信。 管道使用需注意四种读写情况,包括阻塞机制和异常处理。管道文件是内存
2025-10-26 16:24:31
1158
原创 Linux进程地址空间二谈:动态库加载原理揭秘
本文深入探讨了动态库加载原理和进程地址空间管理机制。动态库在运行时被加载到所有进程共享的虚拟地址空间共享区,通过页表映射到物理内存。系统采用"先描述再组织"方式管理多个动态库。文章还分析了程序编译后的ELF文件结构,解释了程序加载前后虚拟地址与物理地址的映射关系,以及动态库采用相对地址(fPIC位置无关码)而非绝对地址的设计原理。这种机制使得动态库可以灵活加载到共享区的任意位置,通过库头地址和偏移量准确定位函数,而无需固定加载位置。
2025-10-18 12:02:25
1014
原创 Linux动静态库:库的制作与使用
本文介绍了Linux下动静态库的制作与使用方法。主要内容包括: 概念补充:库由编译后的.o文件打包而成,分为静态库(.a)和动态库(.so),介绍了库的命名规则和系统搜索路径。 静态库制作: 通过gcc -c生成.o文件 使用ar -rc命令打包成.a文件 提供makefile自动打包脚本 链接时需用-I、-L、-l选项指定路径 动态库制作: 编译时需加-fPIC选项 使用gcc -shared打包成.so文件 同样提供makefile自动化脚本 库的安装:可将库文件和头文件拷贝到系统目录,简化链接命令。
2025-10-14 23:08:36
661
原创 Linux的Ext文件系统:硬盘理解和inode及软硬链接
摘要 本文深入探讨了Linux文件系统与磁盘管理机制。主要内容包括:1)磁盘物理结构(机械硬盘与固态硬盘)及逻辑存储方式(LBA寻址);2)文件系统核心概念,重点分析Ext2文件系统的分区结构(启动块+块组)及块组内部组成(超级块、inode表、位图等);3)inode机制详解,说明其如何通过多级索引管理文件数据块。文章通过类比磁带线性存储、学校分治管理等生动案例,阐释了操作系统高效管理磁盘资源的底层原理。
2025-10-11 14:49:00
1548
2
原创 Linux基础IO(下):文件重定向和缓冲区
摘要 本文深入探讨了Linux文件描述符(fd)的本质与工作机制。文件描述符实质是进程文件表数组的下标,通过该下标可定位到具体的文件对象。系统采用"先描述再组织"方式管理文件,以双链表结构维护所有打开的文件。标准输入(0)、输出(1)和错误(2)是默认打开的3个文件描述符。 重定向的实现原理基于文件描述符的拷贝机制,通过修改文件描述符指向的文件对象来改变数据流向。文章通过实验演示了关闭标准输出后printf输出重定向到文件的现象,并详细解析了输出重定向(>)、追加重定向(>&
2025-10-06 16:57:10
881
7
原创 Linux基础IO(上):文件理解与文件操作
本文系统性地介绍了文件操作的核心概念与实现机制。首先从狭义和广义两个角度理解文件,指出Linux下一切皆文件的哲学思想。文件由内容与属性构成,分为打开与未打开两种状态,操作系统通过"先描述再组织"的方式管理打开的文件。文章回顾了C语言文件接口(fopen、fclose、fwrite等),并揭示了其底层通过系统调用实现。重点讲解了Linux系统级文件操作,包括open函数的位图传参设计、文件描述符概念,以及write/close等系统调用接口。通过位图示例展示了如何高效传递多选项参数,体现
2025-10-01 18:16:04
996
原创 【0基础学算法】前缀和刷题日志(一):前缀与后缀的交织
文章摘要:本文介绍了两个数组处理问题,分别使用前缀和与前缀积的方法求解。第一个问题是寻找数组中心下标,通过预处理前缀和数组f(前i-1项和)与后缀和数组g(后i+1项和),比较f[i]与g[i]来找到中心位置。第二个问题是计算除自身外的数组乘积,利用前缀积数组f(前i-1项积)和后缀积数组g(后i+1项积),将结果ret[i]设为f[i]*g[i]。两个问题都需注意边界处理,并强调理解原理的重要性。代码实现简洁高效,时间复杂度均为O(n)。
2025-09-25 18:12:19
872
原创 【0基础学算法】前缀和(算法原理+经典例题)
本文介绍了前缀和算法在一维和二维数组中的应用。一维前缀和通过预处理数组快速计算区间和,递推公式为dp[i]=dp[i-1]+arr[i],使用区间和为dp[r]-dp[l-1]。二维前缀和通过预处理矩阵计算子矩阵和,递推公式结合区域划分实现。两种方法均需从下标1开始存储数据以避免边界问题,并给出相应代码实现。前缀和算法能有效将区间求和的时间复杂度降为O(1)。
2025-09-24 21:30:38
884
原创 在Linux环境制作一个简易的Shell
摘要 本文介绍了Shell的基本概念,实现了一个简易Shell的关键步骤。Shell作为用户与操作系统内核之间的接口,负责解释和执行用户命令。文章首先通过比喻解释Shell与内核的关系,然后详细讲解了实现Shell的三个核心模块: 获取命令行:使用fgets()接收用户输入,处理换行符和空命令等细节 解析命令行:利用strtok函数以空格为分隔符提取命令参数 指令判断:区分普通命令(需创建子进程执行)和内建命令(直接由Shell处理) 代码部分展示了如何实现命令行提示符、输入处理和命令解析,通过循环结构实现
2025-09-21 18:30:58
753
原创 Linux进程控制(下):进程等待和进程替换
摘要 本文详细介绍了Linux系统中的进程等待与进程替换机制。在进程等待部分,阐述了通过wait/waitpid系统调用来回收子进程资源、获取退出状态的必要性,并解析了status参数的结构与获取方法,提供了阻塞与非阻塞两种等待方式的代码实现。在进程替换部分,解释了exec系列函数的原理,说明替换后原程序代码不再执行,且不影响父进程,同时介绍了七种替换函数及其区别。文章通过代码示例和原理图示,全面展示了Linux进程管理中的这两个重要机制。
2025-09-19 23:36:54
663
原创 Linux进程控制(上):进程创建和进程终止
摘要:本文详细介绍了Linux进程创建与终止的相关知识。在进程创建部分,重点讲解了fork函数的工作原理、写时拷贝机制及其优势,以及fork的常规用法和失败原因。进程终止部分分析了三种退出场景,介绍了退出码的作用和查看方法,比较了exit和_exit函数的区别,并解释了缓冲区的位置问题。文章还预告了后续将讨论进程等待和进程替换的内容,为深入理解Linux进程控制提供了基础。
2025-09-16 11:08:17
767
原创 Linux进程概念(下):进程地址空间
本文探讨了程序地址空间、虚拟地址和进程地址空间的概念,重点分析了Linux环境下进程地址空间的实现机制。通过代码实验验证了程序地址空间布局图的正确性,并解释了父子进程共享相同虚拟地址但不同物理地址的现象。文章详细阐述了页表的工作原理及其在虚拟地址到物理地址转换中的作用,介绍了写时拷贝技术及其重要性。最后,文章从系统设计的角度解释了进程地址空间存在的必要性,包括统一内存视角、保护物理内存和解耦系统模块等优点。文章指出,进程地址空间由内核数据结构(task_struct、mm_struct和页表)与程序代码和数
2025-09-13 18:17:02
632
原创 Linux进程概念(中):进程优先级和环境变量
进程优先级与环境变量摘要 进程优先级决定了CPU资源分配顺序,PRI(优先级)值越小优先级越高。Linux系统中PRI=80+NI,NI(nice值)范围为-20到19,可通过top或renice命令修改。环境变量是操作系统的全局参数,如PATH(命令搜索路径)、HOME(用户主目录)和SHELL(命令行解释器)。PATH使系统能直接执行命令而无需路径,可通过export添加自定义路径。环境变量可通过命令行参数或extern char **environ获取,在程序启动时由父进程传递给子进程,具有全局特性。
2025-09-12 19:26:09
670
1
原创 Linux进程概念(上):进程基本概念和进程状态
本文从操作系统角度深入探讨了进程的概念与状态管理。首先阐述了进程的本质是内核PCB数据结构与代码数据的组合,并介绍了Linux中task_struct的具体属性和组织方式。通过系统目录和ps命令展示了进程查看方法,重点讲解了fork系统调用创建子进程的机制,包括父子进程的代码共享与数据独立特性。文章还详细解析了Linux进程的六种状态(R运行、S睡眠、D磁盘休眠、T停止等),并解释了运行队列在单CPU并发执行多个进程中的作用。通过系统调用示例和状态转换图,完整呈现了进程从创建到终止的生命周期管理过程。
2025-09-10 22:05:22
693
原创 你真的了解操作系统吗?
任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。笼统的说,操作系统包括:在整个计算机软硬件架构中,操作系统的定位是:⼀款纯正的“搞管理”的软件对什么进行管理呢?操作系统就是一款对计算机硬件和软件进行管理的软件。我们知道,一个良好的秩序是需要管理的,有了良好的秩序,做事情才可以简单而高效。以我们人类社会为例,每个国家都有政府,政府制定法律法规对人们进行管理,这是人类社会井然有序的关键,这是亘古不变的。计算机的世界也是如此,操作系统就是“政府”,各个硬件软件就是“人民”。所以,操作系统通过管理好
2025-08-26 23:24:49
1039
2
原创 冯·诺依曼体系结构
冯·诺依曼体系结构是现代计算机的基础,由输入设备、输出设备、存储器、运算器和控制器组成。其中,运算器和控制器构成CPU,存储器特指内存。所有设备通过总线连接,且只能与内存交互。输入设备将数据传输到内存,CPU处理后返回内存,再由输出设备呈现。内存作为缓冲层,解决了CPU与低速外设间的速度差异问题,通过预加载数据提升效率。实际应用中,如QQ聊天,数据从键盘输入到内存,经CPU处理后通过网卡发送;接收方则逆向处理后在显示器显示。这一体系确保了计算机高效、有序地运行。
2025-08-24 17:20:04
760
原创 Linux开发工具的使用(三):gdb
本文介绍了Linux下gdb调试器的基本使用方法。主要内容包括:debug和release模式的区别,Linux默认生成release模式程序,需使用-g选项编译为debug模式才能调试。详细说明了gdb常用命令:启动和退出调试、显示源代码(l)、逐语句(n)与逐过程(s)执行、断点设置(b)与管理、运行程序(r)、监视变量(display)、查看函数调用(bt)和局部变量(info locals)、修改变量值(set var)等。这些命令可以帮助开发者定位和解决程序问题,是Linux环境下C/C++程序调
2025-08-18 05:15:00
753
1
原创 【C++篇】智能指针
本文介绍了C++中智能指针的必要性和实现原理。传统手动内存管理在异常发生时容易出现内存泄漏,智能指针通过RAII(资源获取即初始化)技术自动管理资源生命周期。文章分析了auto_ptr(管理权转移)、unique_ptr(禁止拷贝)和shared_ptr(引用计数)三种智能指针的实现方式,重点阐述了它们解决拷贝问题的不同策略:auto_ptr通过转移所有权但会导致悬空指针,unique_ptr直接禁止拷贝,shared_ptr则采用引用计数实现安全的资源共享。通过示例代码展示了各种智能指针的模拟实现,帮助理
2025-08-09 05:45:00
934
原创 【C++篇】C++11:包装器
本文介绍了C++中的两种函数包装器:function和bind。function是一个类模板,可以将不同类型的函数(普通函数、仿函数、lambda表达式等)包装成统一的function类型,解决函数模板多实例化的问题。bind是一种函数适配器,通过绑定参数或调整参数顺序生成新的可调用对象。使用bind可以固定函数的部分参数,或改变参数的传递顺序,特别适用于绑定类的成员函数。两种包装器都需要包含<functional>头文件,能有效提高代码的灵活性和复用性,是函数式编程的重要工具。
2025-08-08 12:20:26
715
原创 【C++篇】C++11:类的新功能
C++11新增了移动构造函数和移动赋值运算符两个默认成员函数。默认生成的移动操作对内置类型浅拷贝,对自定义类型根据其是否实现移动操作决定调用方式。若实现了析构、拷贝构造或拷贝赋值中的一个,编译器不会自动生成移动操作,此时可用default强制生成。反之,可用delete禁止生成特定默认函数。这些特性为类设计提供了更灵活的控制,既支持高效资源转移,又能防止不必要的拷贝或限制特定操作。
2025-08-08 09:52:52
298
原创 【C++篇】C++11:可变参数模板
本文介绍了C++11可变参数模板的基本语法及实现原理。可变参数模板允许函数和类模板接收任意数量和类型的参数,通过参数包实现。文章详细讲解了两种展开参数包的方式:递归函数法和逗号表达式法,并分析了STL容器中emplace系列接口的优势。emplace接口可直接构造对象,相比push_back减少了一次拷贝或移动操作,在浅拷贝类中性能提升更明显。可变参数模板是C++11的重要改进,虽然语法晦涩但功能强大,合理使用能提升代码灵活性。
2025-08-07 16:11:22
912
原创 【C++篇】C++11:lambda表达式
本文介绍了C++11中lambda表达式的语法特性及其底层实现原理。首先对比了传统排序方法(函数指针和仿函数)的不足,指出lambda表达式作为匿名函数能简化代码并提升可读性。详细解析了lambda的语法结构,包括捕获列表、参数列表、mutable修饰符和返回值类型等组成部分,重点说明了不同捕获方式的区别和使用场景。最后通过反汇编分析揭示了lambda的底层实现原理:编译器将其转换为仿函数类,重载operator()运算符来实现函数功能。lambda表达式既保持了语法简洁性,又具备与仿函数相同的性能表现。
2025-08-06 12:22:04
809
原创 【C++篇】C++11:右值引用与移动语义
本文介绍了C++中左值引用和右值引用的概念及其应用场景。左值是可取地址、可修改的变量,右值是临时不可修改的值。左值引用只能引用左值,而const左值引用可引用右值;右值引用只能引用右值,但可通过move引用左值。 重点分析了右值引用在解决深拷贝类传值返回时的效率问题。通过引入移动语义(移动构造和移动赋值),可以直接"窃取"右值资源,避免不必要的深拷贝操作。文中以自定义string类为例,展示了移动构造函数如何通过swap交换资源来提升性能,相比传统拷贝构造减少了资源分配和释放的开销。
2025-08-05 16:19:13
976
原创 【C++篇】C++11入门:踏入C++新世界的大门
C++11标准引入了多项重要更新,包括新的初始化语法、类型推导、容器改进等。摘要如下: C++11在C++98/03基础上新增约140个特性,修正600多处问题,功能更强大且稳定安全。 列表初始化扩展:支持{}初始化内置类型和自定义类型,新增initializer_list容器实现容器列表初始化。 声明改进:auto实现自动类型推导,decltype获取表达式类型,nullptr替代NULL表示空指针。 STL新增容器:array(静态数组)、forward_list(单链表)以及unordered_map
2025-08-01 13:20:36
1071
原创 【C++篇】哈希扩展:位图和布隆过滤器+哈希切割
摘要 本文介绍了位图和布隆过滤器两种数据结构及其应用。位图通过比特位存储状态,适合处理海量整数数据,支持快速查找、排序去重等操作。文章详细讲解了位图的实现原理,包括set、reset、test等核心操作,并通过位运算实现。针对40亿整数查找问题,位图仅需500MB内存,远优于常规方法。 布隆过滤器是位图的扩展,采用多个哈希函数处理字符串数据,降低误判率。虽然存在误判可能,但其空间效率高,适用于判断数据不存在。文章分析了布隆过滤器的实现方式,选取三种高效哈希函数,并解释了其优缺点。两者在大数据处理中具有重要应
2025-07-30 15:36:12
1033
原创 【C++篇】STL的关联容器:unordered_map和unordered_set(下篇):用一个哈希表同时封装unordered_map和unordered_set
本文介绍了如何基于哈希表封装实现unordered_map和unordered_set的核心技术要点。主要内容包括:(1)通过模板参数控制,使同一个哈希表能同时适配K模型(set)和KV模型(map);(2)通过仿函数KeyOfT提取键值,解决pair类型比较问题;(3)迭代器实现的关键点,包括维护哈希表指针以支持跨桶遍历。文中给出了哈希表源码、模板参数调整方案、仿函数设计以及迭代器operator++的具体实现逻辑,展示了STL关联式容器底层数据结构的封装技巧。
2025-07-28 22:09:10
643
原创 【C++篇】STL的关联容器:unordered_map和unordered_set(上篇):哈希表的模拟实现
本文介绍了C++中unordered系列关联式容器(unordered_map、unordered_set等)与哈希表的相关知识。主要内容包括:1. unordered容器与map/set的区别,如无序性、底层哈希表结构及性能优势;2. 哈希表原理,包括哈希函数设计(直接定址法、除留取余法)和冲突解决方法(开放定址法、链地址法);3. 重点模拟实现了基于线性探测的哈希表,详细讲解了节点结构、插入扩容机制及查找删除操作。文章通过代码示例展示了哈希表的核心实现,对比了不同冲突解决策略的优缺点,为理解STL哈希容
2025-07-27 16:45:38
728
原创 【C++篇】STL的关联容器:map和set(下篇):用一颗红黑树同时封装出map和set
本文介绍了如何将红黑树封装为map和set的底层实现,主要包括:1)通过模板参数适配KV模型和K模型;2)为红黑树添加仿函数提取键值;3)实现红黑树的迭代器。通过模板参数修改使红黑树可同时支持map和set,使用仿函数解决pair比较问题,并详细说明了迭代器的实现思路,包括解引用和指针操作符的重载。这使得红黑树能够作为通用底层结构支持map和set的功能需求。
2025-07-26 18:22:09
962
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅