- 博客(30)
- 收藏
- 关注
原创 Linux系统篇(三十三)深入理解EXT2文件系统:块组、inode、目录与链接机制详解
本文深入解析EXT2文件系统,从磁盘分区与块设备出发,详解块组(Block Group)的布局结构。通过数据块、inode表、位图及超级块等核心组件,揭示文件系统如何管理空间与文件元信息。重点剖析inode与数据块的多级索引映射机制,实现高效寻址,并阐明“属性与内容分离”的设计思想,全面展现EXT2在存储组织上的精妙逻辑。
2026-09-10 22:16:17
552
9
原创 C++11新特性(3):lambda不是玄学:从编译器生成的仿函数类彻底搞懂 C++ 匿名函数
本文详细解析了C++11中的lambda表达式特性。lambda本质是编译器生成的匿名函数对象,可以定义在函数内部。其语法包含捕捉列表、参数列表、返回值类型和函数体四部分,其中捕捉列表不可省略,支持显式/隐式/混合三种捕捉方式。通过mutable关键字可修改值捕获的变量。底层实现上,每个lambda会被转换为一个具有唯一UUID的仿函数类,捕获变量成为成员变量,函数体转为operator()。lambda调用时直接执行该operator(),效率与普通函数相当。最后提出lambda类型不明确导致难以存入容器
2026-04-27 22:54:50
614
31
原创 C++11新特性(2):深入 C++ 参数传递黑盒:从引用折叠到完美转发,再到可变参数模板
C++11参数传递黑盒解析:引用折叠与完美转发 本文深入探讨了C++11中参数传递的核心机制,重点解析了引用折叠、完美转发和可变参数模板三大特性。主要内容包括: 引用折叠规则:解释了C++11中引用折叠的运作原理,展示了模板实例化时如何通过类型推导生成左值或右值引用版本。 完美转发实现:通过forward函数模板,演示了如何保持参数原始值类别(左值/右值)进行传递,解决了参数传递过程中的值类别退化问题。 可变参数模板:介绍了模板参数包的语法和使用方法,说明了如何实现接受任意数量参数的函数模板。 这些特性共同
2026-04-26 22:06:31
757
40
原创 C++11新特性(1):从列表初始化到右值引用
本文详细介绍了C++11的两个重要新特性:列表初始化和右值引用。在列表初始化部分,文章对比了C++98和C++11的初始化方式,展示了C++11如何通过initializer_list实现更灵活的统一初始化语法,包括对内置类型、自定义类型和容器的初始化支持。右值引用部分则深入讲解了左值/右值的区别,右值引用的基本概念和使用场景,包括如何通过右值引用绑定临时对象,以及move语义的应用。这些特性为C++带来了更高效的资源管理和更简洁的代码书写方式,是现代化C++编程的重要基础。
2026-04-25 19:26:21
501
14
原创 C++庖丁解牛:AVL 树详解:让二叉搜索树不再“歪脖子”
这篇博客详细讲解了AVL树的概念与实现。AVL树通过平衡因子(右子树高度减左子树高度,取值0/1/-1)控制左右子树高度差。文章介绍了带父指针的节点结构,便于插入后更新平衡因子。插入操作遵循二叉搜索树规则,然后根据平衡因子变化决定是否旋转:单旋(左/右)处理完全一边高场景,双旋(左右/右左)处理折线型结构,并重点说明了旋转后平衡因子的更新策略。最后提供了判断AVL树合法性的IsAVLTree函数和计算树高的Height函数。
2026-04-04 15:46:37
586
28
原创 C++庖丁解牛:深入理解多态:从虚函数表到底层实现
本文深入探讨了C++多态的实现机制。首先区分了编译时多态(函数重载和模板)与运行时多态(虚函数重写),指出多态的核心在于运行时确定调用函数。重点分析了虚函数表的底层实现原理,包括虚函数表指针、动态绑定过程等。通过具体示例展示了析构函数重写、override/final关键字的使用场景,并解释了纯虚函数和抽象类的特性。最后详细讲解了虚函数表的工作机制,包括继承关系中的虚函数表变化规则。全文从概念到实现层层深入,为理解C++多态提供了全面指导。
2026-03-23 22:52:08
848
28
原创 C++继承详解
本文详细介绍了C++继承的概念和使用方法。主要内容包括:1) 继承的基本概念和定义,通过Person、Student、Teacher类示例说明继承关系;2) 继承权限问题,分析了访问限定符与继承方式的区别,并给出权限变化表格;3) 继承类模板的特殊处理;4) 基类和派生类之间的转换规则;5) 继承中的作用域和隐藏规则;6) 派生类中基类对象的构造、赋值和析构的特殊处理方式。文章通过具体代码示例,深入浅出地讲解了继承中的关键知识点,为理解和使用C++继承机制提供了全面指导。
2026-03-22 19:40:31
591
22
原创 C++STL详解2:stack和queue
本文详细介绍了C++ STL中的容器适配器stack、queue和priority_queue。stack基于vector实现,遵循先进后出原则;queue基于list实现,遵循先进先出原则。重点剖析了deque的结构与特性,它结合了vector和list的优点,支持随机访问但效率略低。文章还讲解了仿函数的概念及其在priority_queue中的应用,priority_queue默认以大堆形式实现。通过代码示例展示了这些容器的基本实现方式和使用方法,帮助读者理解STL容器的底层机制和使用场景。
2026-03-16 22:57:57
558
11
原创 C++STL详解1:list
本文详细介绍了C++标准库中的list容器,主要包括以下内容: list的本质是带头双向链表,属于顺序表的一种链式实现 list迭代器属于双向迭代器,与vector的随机访问迭代器不同,不支持+=等操作 重点分析了emplace_back接口,它支持可变参数模板和隐式类型转换 分类整理了list的各种接口,特别讲解了splice接口的剪切功能 探讨了list排序的效率问题,建议先拷贝到vector排序再转回 深入剖析了list的底层实现,包括节点类、迭代器类和list本体的设计思路 详细讲解了如何通过模板参
2026-03-14 23:06:19
931
10
原创 类和对象(下):流重载、初始化列表、友元
本文介绍了C++中类的两个重要特性:初始化列表和流重载。初始化列表是构造函数中用于初始化成员变量的专用语法,特别适用于const成员、引用成员和没有默认构造的自定义类型成员。文章详细讲解了初始化列表的使用方法、成员变量初始化顺序以及C++11新增的成员缺省值特性。在流重载部分,重点阐述了如何通过友元函数实现<<和>>运算符的重载,使自定义类型支持流式输入输出,并解释了为何重载函数需要设为全局函数而非成员函数。全文通过代码示例和原理分析,帮助读者深入理解这些核心概念。
2026-02-05 20:59:26
1260
13
原创 类和对象(上)
本文介绍了C++中类和对象的基础知识,主要包括三部分内容:类的定义、实例化和this指针。在类的定义部分,讲解了命名规则、访问限定符和类域的概念,重点说明了成员变量和成员函数的区别。实例化部分阐述了类模板与实例对象的关系,分析了类对象的内存分配规则。最后详细讲解了this指针的作用机制和使用规则,揭示了编译器如何通过隐式this指针区分不同对象的成员变量。全文通过代码示例直观展示了类的基本使用方式,为理解面向对象编程奠定了基础。
2026-01-31 16:05:15
862
12
原创 类和对象(中)
本文介绍了C++中类的默认成员函数,重点讲解了构造函数、析构函数和拷贝构造函数。构造函数用于初始化成员变量,有默认、显式和拷贝三种形式;析构函数用于释放申请的空间,遵循先构造先析构原则;拷贝构造函数用于创建对象的副本,需要注意深拷贝与浅拷贝的区别。文章通过代码示例展示了这些函数的实现和使用场景,并强调了注意事项,如拷贝构造函数的参数必须为引用类型、传值返回会创建临时变量等。这些内容是理解和使用C++类的基础知识。
2026-01-31 00:16:50
917
7
原创 记数排序(基数排序和桶排序)
本文介绍了三种非比较型排序算法。记数排序通过统计元素出现次数实现排序,先确定数据范围(range),统计各元素出现次数后重新填充原数组,时间复杂度O(N+range),适合数据范围集中的情况。基数排序和桶排序仅简要提及未深入讲解,配图展示了这两种算法的基本思路。记数排序是本文重点,详细说明了其实现步骤和性能特点,能处理包含负数的情况,但对数据范围敏感。
2025-12-26 23:07:21
485
5
原创 快排(非递归)和归并的实现
本文介绍了两种排序算法的实现方法:快速排序的非递归版本和归并排序的递归/非递归版本。 快速排序(非递归): 使用栈模拟递归过程,按照深度优先遍历的顺序处理子区间。先将右区间压栈再压左区间,保证处理顺序正确。时间复杂度为O(N*logN)。 归并排序: 递归版本:采用后序遍历思想,将数组不断二分直至单个元素,再逐层合并有序子数组。需额外O(N)空间存储临时数组。 非递归版本:通过gap控制合并步长,从单个元素开始两两合并。需注意处理边界条件防止越界,当右子数组超出范围时需调整边界或跳过。 两种算法的时间复杂度
2025-12-24 09:55:23
608
4
原创 直接插入排序、希尔排序、选择排序
本文介绍了三种排序算法:直接插入排序、希尔排序和选择排序。直接插入排序通过逐个插入元素实现排序,希尔排序是其改进版本,采用分组策略和动态调整增量来提高效率。选择排序则通过不断选择最小/最大值来完成排序。文章详细说明了各算法的实现原理和代码细节,包括边界条件处理,如希尔排序的动态gap调整和选择排序的特殊情况处理。这些排序算法在时间复杂度和适用场景上各有特点,为不同数据规模和应用需求提供了多样化的解决方案。
2025-12-22 20:43:56
1187
2
原创 TOP-K问题
【摘要】本文介绍了top-k问题的解决方案,重点阐述了基于堆结构的实现方法。通过建立大小为k的小顶堆,依次比较数据源元素与堆顶元素,保留最大的k个元素。该方法时间复杂度为O(N),空间复杂度为O(K)。文中还提供了C语言实现代码,包括随机数生成、文件读写、堆操作等核心功能,并展示了如何利用小顶堆查找文件中最大的k个数值。该方案适用于各类需要获取极值数据的应用场景。
2025-12-18 17:39:11
510
2
原创 堆排序的实现
本文详细讲解了堆排序的实现原理和优化方法。首先分析了向上调整和向下调整两种建堆方式的时间复杂度差异,证明向下调整算法(O(N))比向上调整(O(NlogN))更高效。然后阐述了堆排序的核心思想:升序建大堆,降序建小堆,通过不断交换堆顶元素和末尾元素并调整堆结构来完成排序。文中提供了完整的C语言实现代码,包括堆的初始化、调整、排序等核心函数,并展示了如何将数组转化为堆结构进行排序。此外还介绍了利用堆结构解决TopK问题的应用实例。
2025-12-18 16:39:52
1512
8
原创 堆的实现与操作详解
本文介绍了堆数据结构的概念与实现。堆是一种完全二叉树,可以使用数组存储,通过父子节点索引关系实现高效操作。文章详细讲解了向上调整(从子节点到父节点)和向下调整(从父节点到子节点)两种核心算法,分别用于插入和删除元素时维护堆的有序性。在功能实现方面,提供了堆的创建、销毁、插入(push)和删除(pop)等操作的代码实现,其中插入操作使用向上调整算法,删除操作使用向下调整算法。所有操作都保证了堆的性质不受破坏,且时间复杂度保持在O(log n)级别。
2025-12-15 22:23:33
1078
3
原创 设计循环队列
本文介绍了循环队列的设计实现方案。通过分析链表和数组两种实现方式的优劣,最终选择使用数组实现循环队列。关键点包括:1)使用_head和_tail指针标记队列首尾;2)通过多分配一个空间来区分队列满和空的状态;3)利用取模运算处理指针回转问题。文中详细说明了初始化、判空判满、获取首尾元素以及入队出队等核心操作的实现逻辑,并给出了完整的C++代码实现。这种设计保证了循环队列的高效操作,时间复杂度均为O(1)。
2025-12-15 20:11:07
1043
3
原创 链表的终极考验:随机链表的复制
本文讲解LeetCode"复制带随机指针的链表"问题。该问题要求深拷贝一个包含next和random指针的链表,难点在于如何正确复制random指针。作者提出创新解法:1.在原链表每个节点后插入其复制节点;2.通过原节点的random指针定位复制节点的random指针;3.分离两个链表。这种方法时间复杂度O(n),空间复杂度O(1),巧妙地利用原链表建立映射关系,避免了额外空间开销。代码实现包含创建复制节点、设置random指针和分离链表三个主要步骤,并处理了边界条件。
2025-12-13 19:52:35
1392
5
原创 数据结构:队列(C++含量更多)
本文介绍了一个基于C++实现的队列数据结构(QT),相比C版本有以下改进:1) 使用类封装成员变量和方法,避免重复传参;2) 内置构造函数和析构函数自动处理初始化和清理;3) 支持多个实例独立操作。队列核心功能包括:入队(push)、出队(pop)、获取头尾元素(front/tail)以及展示全部元素(display)。实现采用链表结构,使用malloc分配节点内存,特别注意出队操作中需要正确处理指针关系防止越界访问。示例代码展示了基本使用方法,包括创建队列、入队、出队和元素访问等操作。
2025-12-12 16:06:13
516
2
原创 数据结构:栈的实现(C++)
本文介绍了栈数据结构的基本概念和C++实现。栈遵循先进后出原则,支持压栈和出栈操作。文章详细说明了使用数组实现栈的优势,并提供了一个基于类的实现方案,包含构造函数、析构函数以及核心操作函数(STPush、STPop、STTop等)。实现中考虑了动态扩容机制,当栈满时自动增加容量。示例代码演示了栈的基本操作流程,包括压栈、查看栈顶元素和出栈操作。该实现通过类封装保证了数据安全性,使用动态内存管理避免内存泄漏,展现了栈数据结构在C++中的典型实现方式。
2025-12-11 20:13:01
549
2
原创 数据结构:队列(C++)
本文介绍了使用链表实现队列数据结构的方法。队列具有先进先出(FIFO)特性,相比数组实现,链表能更灵活地处理元素的添加和删除操作。文章详细说明了队列的节点和结构体设计,包括初始化、添加元素、删除元素、获取大小、访问首尾元素等核心功能的实现。通过typedef定义节点数据类型提高代码复用性,并提供了完整的使用示例。该实现避免了数组方式的空间浪费问题,更适合队列的动态操作需求。
2025-12-11 19:24:19
548
1
原创 C语言中的动态内存管理
最好不要在函数中使用malloc为一个指针变量申请空间,因为函数的内容是在栈空间中的,在出函数时会直接销毁,如果在主函数中使用在函数中申请的指针变量就会找不到对应的空间。在C语言中,使用malloc函数申请的空间是不会自动释放的,我们一定要在使用malloc申请空间后再使用free释放。包含柔性数组成员的结构⽤malloc ()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤。有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的使。
2025-12-02 22:42:25
1238
1
原创 整数和浮点数在内存中的存储
还有一件事:在浮点数的储存中,在2的零次之后的二进制位都是有权重的,所以我们就可以使用这些二进制位来凑齐小数点后的数字。例如:在16进制数字0x11223344中最高位的1的权重就是16的7次方,而最低位的4的权重就是16的0次方。对于64位的浮点数(double),最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数(float),最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。⼀个中间数,对于8位的E,这个中间数是127;
2025-11-29 16:37:15
1288
原创 fopen_s函数的一些基本的使用
我刚刚做了一个需要使用到文件操作和链表的小项目,也踩了不少坑,现在对文件操作也有了新的认知,现在分享给大家。##返回值当打开失败时,返回errno_t类型的错误代码(该错误代码是可以被解析的)当打开成功时,返回值是0,pFile变为一个有效内存地址(相当于是文件的一个代理指针),以后再对文件中的内容进行操作的时候就用这个指针。其中,Pfile就是FILE*类型的变量的指针。filename就是文件名。mode就是打开方式,以下是常用的打开方式:发现了没有,当我们想在不改变文件中的数据的情况下将文
2025-11-29 10:58:16
654
原创 fopen_s和strtok_s函数中FILE**类型参数详解
fopen_s是 C11 标准中引入的安全版本的文件打开函数,用于替代不安全的fopen函数。strtok_s是 C11 标准中引入的安全版本的字符串分割函数,用于替代不安全的strtok函数。我在初识这两个函数时,在使用时总是传错参数,故细细研究,出此博文,望对大家有所帮助。
2025-11-27 17:19:59
392
原创 简易学生成绩管理系统
本文介绍了一个基于C语言的多级菜单学生管理系统实现方案。系统采用链表存储学生信息(学号、姓名、成绩),实现了录入、查询、删除和排序功能。关键技术包括:1) 使用链表结构动态管理数据;2) 采用qsort实现成绩排序;3) 通过文件操作实现数据持久化;4) 使用sscanf_s进行输入合法性验证。系统具有完整的多级菜单交互界面,支持数据重复检测和错误输入提示。该方案充分考虑了内存管理、数据完整性和用户体验,可作为学生信息管理的基础框架。
2025-11-26 17:56:51
1408
原创 二进制和二进制的转换以及左移右移操作符
本文介绍了二进制的基础知识及其在计算机中的应用。首先阐述了二进制的表示方法,包括正负数的原码、反码和补码转换,说明变量在内存中以补码形式存储。其次讲解了二进制与八进制、十六进制的转换关系及表示方法。最后详细解释了左移和右移操作符的工作原理:左移实现乘二效果,右移分为算术右移(保留符号位)和逻辑右移(补零),具体取决于编译器实现(如VS2022采用算术右移)。全文系统性地梳理了二进制的基本概念、转换方法和移位运算规则。
2025-11-13 23:00:09
381
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅