- 博客(61)
- 收藏
- 关注
原创 18.C++:封装红黑树实现 map 和 set
本文详细介绍了如何基于红黑树模拟实现C++ STL中的map和set容器。主要内容包括:1. 分析STL源码中map和set的实现原理;2. 设计红黑树节点结构和基础框架,支持插入操作;3. 实现迭代器功能,包括operator++和operator--等运算符重载;4. 通过仿函数解决map和set在比较键值时的差异问题;5. 给出完整的红黑树模板类实现代码,以及基于该模板的map和set容器实现。文章重点讲解了迭代器的实现原理和各种遍历场景的处理方法,最后提供了完整的头文件实现(mytree.h、mys
2025-11-22 17:16:25
574
原创 17.C++:红黑树的实现
红黑树是一种自平衡二叉搜索树,通过节点着色规则(红/黑)和旋转操作保持近似平衡。其核心规则包括:根节点为黑、红节点的子节点必须为黑、任意路径黑节点数相同。这些规则确保最长路径不超过最短路径的2倍,保证查找效率为O(logN)。插入操作分为三种情况处理:变色、单旋变色和双旋变色。实现时需维护节点颜色和父子指针,通过递归检查确保符合红黑树特性。该数据结构在插入和查找时都具有较高的效率,适用于需要频繁插入和查找的场景。
2025-11-22 10:30:17
822
原创 16、C++:AVL树
AVL树是一种高度平衡的二叉搜索树,其左右子树高度差的绝对值不超过1。本文详细介绍了AVL树的实现原理:1. 节点结构包含平衡因子(bf)记录左右子树高度差;2. 插入操作分为三步:按BST规则插入、更新平衡因子、必要时通过旋转调整结构;3. 重点讲解了四种旋转操作(左单旋、右单旋、左右双旋、右左双旋)及其实现代码;4. 分析了不同情况下平衡因子的更新规则和旋转条件。AVL树通过严格的平衡控制,将查找效率保持在O(logN),适用于需要高效查找的场景。
2025-11-16 10:20:33
1113
原创 15.C++:map 和 set 的使用
Note:(1)T 为 set底层关键字 key 的类型;(2)Compare 为仿函数,比较大小用的;(3)set 的底层存储数据的内存是从空间配置器申请的,如果需要可以用自己实现的内存池,传给第三个参数;(4)set 底层用红黑树实现,增删查的效率为 O(logN);(5)迭代器遍历走的中序。
2025-11-12 14:19:43
941
原创 14:C++:二叉搜索树
本文介绍了二叉搜索树(BST)的基本概念与实现。二叉搜索树具有左子树值≤根节点≤右子树值的特性。其查找性能为O(logN)最优至O(N)最坏。文章详细阐述了BST的节点结构设计(key-value对),并给出了插入(避免重复)、查找和删除三种核心操作的代码实现。删除操作根据不同情况(无子节点、单个子节点、双子节点)采用不同处理策略,其中双子节点情况需寻找替代节点(右子树最小值或左子树最大值)来保持BST结构特性。全文通过代码示例展示了BST的具体实现方法。
2025-11-06 19:14:15
952
原创 13.C++:多态
本文通过"吃午饭"的生动例子,介绍了C++多态的概念与实现。多态分为静态多态(函数重载)和动态多态(运行时确定)。实现多态需要两个条件:使用基类指针/引用调用虚函数,并且完成虚函数重写。文章详细讲解了虚函数、虚函数表、重写规则、override/final关键字的使用,以及纯虚函数和抽象类。通过剖析虚函数表指针的工作原理,揭示了多态底层实现的原理:派生类虚表指向重写的虚函数地址,在运行时动态绑定。最后对比了重载、重写和隐藏的区别,帮助读者全面理解C++多态机制。
2025-11-02 16:42:42
705
1
原创 13.C++:继承
本文详细介绍了C++面向对象编程中的继承机制。文章首先通过类比的引入继承的概念,解释了基类和派生类的关系。重点阐述了继承的三种方式(public/protected/private)及其访问权限变化,以及继承中的特殊规则:隐藏规则、派生类默认成员函数调用顺序等。同时探讨了友元与继承、静态成员在继承体系中的特性。针对多继承带来的菱形继承问题,提出了虚继承的解决方案。最后对比了继承与组合的差异,建议优先使用组合。文章通过丰富的代码示例和练习题,系统地讲解了C++继承的核心知识点和使用技巧。
2025-11-02 11:23:39
572
原创 12.C++:模版进阶
本文探讨了C++模板编程的几个关键方面:1)非类型模板参数及其限制(仅支持整型且需编译期确定);2)模板特化的两种形式:函数模板特化(需与原模板参数类型匹配)和类模板特化(分为全特化和偏特化);3)模板分离编译问题及解决方案(显示实例化但不推荐);4)模板的优缺点(泛型编程优势vs编译错误难查、代码膨胀)。文章特别强调模板定义与声明应放在同一文件中以避免分离编译问题。
2025-11-01 16:06:26
767
1
原创 215.数组中第k个最大元素
Note:hoare找基准值,left向又走,寻找比基准值大的数,right向左走,寻找比基准值小的数,如果在 left > right之前找到,那么 left 和 right交换,然后right在和基准值交换。知道你不懂,别急,先来回顾一下快速排序的核心思想吧:对一个序列找基准值,小于基准值的放一边,大于基准值的放另一边,然后再在两边分别找新的基准值,以此类推。而我们要做的就是在每次基准值确定位置之后和 k -1作比较,如果小了,证明我们要找的数在右边,就继续在右边找基准值,反之,在左边找。
2025-11-01 13:47:32
368
原创 C++:stack 和 queue
本文主要介绍了C++中stack、queue、deque和priority_queue的使用与模拟实现。首先讲解了stack的基本用法及经典题目如最小栈、逆波兰表达式等,随后介绍了queue的使用及其在二叉树层次遍历中的应用。接着对比了list和vector的优缺点,引出双端队列deque的设计原理。最后深入剖析了优先级队列priority_queue的实现,重点讲解了堆的调整算法和仿函数机制。文章通过大量力扣真题演示了这些容器的实际应用,并给出了完整的模拟实现代码,帮助读者深入理解这些常用数据结构的底层原
2025-11-01 13:02:55
804
原创 155.最小栈
当第一个数据入栈,那肯定要给两个栈都入栈。后面入栈的时候,根 _min_st 的栈顶比较,如果小,就给 _min_st 和 _st 都入栈,否则,只给 _st 入栈;出栈的时候,就判断 _st 的栈顶是否根 _min_st 的栈顶一致,一致,两个就都出栈。第一次入栈的时候,就给 min 存放,后面每次入栈时都比较一下,如果比 min 还小,min 就存放新的值。题目要求我们设计一个栈,其他的都还好说,C++已经提供好了 stack ,唯一需要我们解决的就是获取栈中最小的数。
2025-10-26 23:55:38
296
原创 Linux 的基本操作指令
本文介绍了Linux系统的基础知识和常用指令。首先概述了Linux系统的特点和发展历史,并推荐初学者使用Ubuntu发行版。然后详细讲解了文件路径、目录结构、文件类型等基础概念,强调"Linux下一切皆文件"的特性。重点整理了30多个常用指令的用法和参数选项,包括文件操作、权限管理、压缩解压等。最后深入解析了Linux权限系统,包括用户角色划分、权限修改方法、目录权限设置等,特别介绍了粘滞位的应用场景。文章内容详实系统,可作为Linux初学者的入门指南,帮助读者快速掌握Linux系统的基
2025-10-26 19:47:13
771
原创 C++:list
list 可以理解为一个带头双向循环链表。使用的时候需要包含头文件 <list>在命名空间 std 内list 是标准模板库里的重要内容,通过之前 string、vector、的学习,list 的学习就显得非常简单了,包括后面的一些 STL 也是,但是,每个 STL 都有其独特的地方,还需要我们继续深入。
2025-10-19 10:47:48
762
原创 C++:vector
在C++中,vector是标准模板库(STL)中的一个动态数组容器。其实vector就是一个会自己管理大小的智能数组,你用的时候只管往里面放东西,它会自动处理所有内存问题!可以认为是比C语言的malloc更加高级的存在。在使用 vector 必须包含头文件 <vector> ,并且 vector 是位于命名空间 std 内的。vector 本质上是一个模版,使用时需要指定类型。
2025-10-15 00:05:13
1571
2
原创 17. 电话号码的字母组合(有动画演示)
给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
2025-10-13 12:32:55
274
原创 JZ39 数组中出现次数超过一半的数字
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。数据范围:n≤50000n≤50000,数组中元素的值 0≤val≤100000≤val≤10000要求:空间复杂度:O(1)O(1),时间复杂度 O(n)O(n)
2025-10-12 00:01:15
389
原创 260. 只出现一次的数字 III
给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。以上就是这道题目的全部条件,下面我来为大家讲解。
2025-10-11 16:29:30
809
原创 C++:string 类
string类用来管理程序中的字符串,出现的时间比STL要早,SLT很多内容都是参考的string,后面STL成熟了,string也有些内容是参考STL修改的。在C语言中,用数组存放字符串,我们需要担心是否越界,需要手动扩容和释放。但在C++中,我们有string类,它可以帮助我们完成这些事情,节省程序员的精力。使用string类是需要头文件的:<string>,同时也是有命名空间的 :std。
2025-10-05 11:30:11
922
原创 C++:类和对象(下)
class A;class Bprivate:public:class A//声明:B里面的func是A的友元函数private:int main()A aa;B bb;return 0;上述代码就上将 B 的成员函数作为了 A 的友元函数,可以访问A的成员。同样的,如果 B 的大部分函数都要与 A 有练习,可以将 B 作为 A 的友元类。
2025-09-14 22:45:34
870
原创 C++:类和对象(中)
让它们用起来和内置类型(如 int, double)一样直观。什么意思?比如一开始我们创建的Student这个类,你拿两个学生相减 s1 - s2 算怎么回事?编译器无法理解,这时候你可以通过特殊手段赋予减号一定的含义,比如:两个学生的成绩之差。
2025-09-04 22:58:42
1090
原创 C语言:归并排序和计数排序
比如:{100 ,105, 102, 104 } 这四个数据,最小值 min = 100 ,所以在下标为 0 的地方就代表着100 ,下标为2的地方代表着102,以此类推。那怎么得到有序序列呢?将序列分成最小单元,只有一个元素的序列就是有序的。如图,将序列中各个元素出现的次数统计出来,并将次数放入数组对应的位置(把原来序列元素当做下标,出现次数当做元素)里。假设在待排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,则成这种排序算法是稳定的,否则,为不稳定。
2025-09-02 21:05:18
574
1
原创 C语言:树的实现和剖析
树是一种非线性结构,它是由 n (n>=0)个有限节点组成的一个具有层次关系的集合。由于数组的物理结构与顺序表非常近似,所以堆可以认为是用顺序表实现的,因此,堆的实现和顺序表非常近似。//数组int size;//有效元素个数//容量}Heap;//数据//左孩子//右孩子}Tree;相信本篇文章对你有所收获,但这远远不够,要勤加练习,打牢基础,加油!追梦人!1%29。
2025-09-01 19:48:50
817
1
原创 C语言:栈的实现和剖析
栈是一种特殊的线性表,只允许在固定的一端进行插入和删除操作。栈就是先进后出,后进先出恭喜你已经学完了栈的全部内容,如果有什么问题欢迎私信我或者评论区见哦。
2025-08-06 12:57:25
933
原创 C语言:选择排序算法深度剖析!
在介绍堆的时候,我们计算过在堆排序中,向上和向下调整法的时间复杂度,最后得出向下调整法更好,因此,堆排序通常采用向下调整法建堆。本文堆采用顺序表表示。首先,交换完 mini 和 begin ,maxi 会随着begin的交换跑到 mini 去,因此,将maxi赋值为mini是正确的。但是,如果为了一个堆排序而去专门写一个堆的结构,就显得小题大作了,因此,堆排序只是借鉴堆的思想,然后在原数组上改造。这是一个乱序的二叉树,要想将其变为堆,就需要进行向下调整,但是,向下调整一次只能调整一个分支,由此可见,
2025-08-05 14:26:21
636
原创 从C语言到C++:拥抱面向对象编程的全新世界
/成员,可以为变量,也可以为函数,结构体等int n = 10;*x = *y;*y = tmd;//…………(2)namespace 的本质是定义出一个域,这个域与全局域各自独立,不同的域可以定义同一个变量名,使用时,只要标明变量来自哪个域就好了(3)namespace 只能定义在全局,但是可以嵌套定义(4)同一个项目中,同名namespace会被认为是同一个命名空间,不会发生冲突(5)C++的标准库都放在一个叫 std 的命名空间中在声明或定义函数时,函数的参数有一个指定的值。
2025-07-31 18:14:23
1274
原创 深入理解C语言:详解直接插入排序的实现与优化
恭喜你,你已经掌握了C语言插入排序算法的核心知识!通过本文的学习,你不仅理解了直接插入排序的原理,还学会了用C语言实现它,并了解了它的优缺点。掌握直接插入排序,是成为一名合格程序员的必经之路。希望你能够将所学知识应用到实际项目中,不断提升自己的编程能力。记住,实践是检验真理的唯一标准,多写代码,多思考,你就能在编程的世界里越走越远!祝你在编程的道路上越走越好!
2025-07-29 12:40:40
1008
原创 C 语言深度剖析:快速排序算法的原理与实现
在浩瀚的计算机算法世界中,排序算法无疑扮演着基石性的角色。从早期的数据处理到现代的机器学习,高效的排序能力始终是衡量程序性能的重要指标。在众多排序算法中,“快速排序”(Quick Sort)以其卓越的平均性能、简洁的递归结构以及在实际应用中的广泛普及,赢得了算法“皇帝”的美誉。它不仅仅是一种将无序序列变为有序序列的工具,更是一种分治策略思想的完美体现。本篇文章将带领大家深入C语言的殿堂,揭开快速排序算法的神秘面纱。
2025-07-28 12:03:57
655
原创 探索双链表:C语言中的链式结构魔法
双链表同单链表一样,是一种线性结构的数据结构,与单链表不同的是,双链表的每个节点有两个指针,分别指向下一个节点和上一个节点。这使得双链表既可以向前遍历,也可以向后遍历,极大的节省了时间,但代价就是每个节点所占用的空间变大了。//节点的数据域//指向下一个节点//指向上一个节点}DListNode;掌握了单链表,那么掌握双链表也是分分钟的事,本篇以有哨兵位,循环的双链表为目的编写的代码。双链表的实际应用广泛,例如播放器的歌曲上一首下一首 ,以及网页的进一步退一步等。双链表非常好掌握,这里就不多赘述了。
2025-07-24 18:17:49
379
原创 玩转C语言:从零打造你的第一个单链表
单链表是一种重要的数据结构,它允许动态分配内存,在插入和删除元素时效率高,但访问元素需要顺序遍历。理解其概念和结构对于理解更复杂的数据结构和算法非常重要。在实际编程中,选择使用链表还是数组取决于具体的需求,考虑内存使用、访问效率和插入/删除操作的频率。
2025-07-11 18:17:02
760
原创 C语言顺序表:从零开始,解锁数据结构之门!
顺序表,是使用一段连续的存储空间存储数据元素的线性表。其不管在逻辑结构上还是物理结构上,数据的存储都是连续紧挨着的。静态顺序表,顾名思义,它的大小是一定的,不可改变的。常见的静态顺序表就是数组,但是这不够严谨,因为我们只知道静态顺序表的大小,却不知道它的有效元素的个数,因此我们使用结构体来表示静态顺序表,动态顺表也是同样的。动态顺序表本质和静态顺序表一样,都是一段连续的存储空间存储数据元素的线性表。不同的是,动态顺序表可以随时调整自己的大小来满足需求,比静态顺序表更加灵活恭喜你!
2025-07-10 16:51:45
1087
原创 你的 C 程序够快吗?一文搞懂数据结构时间空间复杂度,提升代码效率
你是否遇到过这样的困惑:同样的功能,别人的程序跑得飞快,而你的却慢如蜗牛?或者,你的程序在处理大数据时,总是提示内存不足?如果你的答案是肯定的,那么恭喜你,这篇文章正是为你量身定做的!在软件开发的世界里,数据结构和算法是构建高效程序的基石。而时间复杂度和空间复杂度,就像是衡量程序性能的标尺,决定了你的代码是否能够“跑得动、跑得快、跑得稳”。本文将以通俗易懂的语言,结合 C 语言实例,带你深入理解数据结构的时间复杂度和空间复杂度。
2025-06-21 13:37:59
574
原创 C语言宏:是神来之笔,还是埋雷陷阱?
初识C语言,你也许会被它的简洁和强大所吸引。而当你逐渐深入,一个古老而神秘的“生物”便会跳入你的视野——那就是宏(Macro)。它以 #define 为咒语,拥有变幻莫测的力量:可以将代码片段简化为几个字符,能自定义类型,甚至还能实现条件编译。有人视它为提高效率、简化代码的神来之笔;也有人对其避之不及,称其为BUG的温床、代码维护的噩梦。那么,C语言宏,究竟是帮助我们披荆斩棘的利器,还是悄然埋下隐患的陷阱?今天,我们就一起撕开宏的神秘面纱,探究它的魅力与危险,助你驯服这个既强大又棘手的伙伴。
2025-06-20 14:52:06
1185
原创 解密C语言:从源代码到可执行文件的编译与链接之旅
当你第一次写完一段C语言程序,满心期待地点击“运行”按钮,却发现程序无法直接启动,甚至出现诸如“未定义引用”或“找不到符号”的错误。你是否曾好奇,为什么看似简单的源代码要经历那么复杂的步骤才能变成一个可以在计算机上运行的可执行文件?事实上,C语言的编译和链接过程正是让这所有魔法发生的关键环节。在本篇博客中,我们将带你深入理解C程序从源代码到可执行文件的完整流程,揭示隐藏在背后的技术细节,帮助你写出更高效、更可靠的程序。
2025-06-19 12:59:17
658
原创 C语言文件操作全攻略:让你的程序拥有记忆!
说白了,文件就是硬盘上的文件。我知道这句话跟说了没说,但是你先别急。恭喜你,通过本文的学习,相信你已经对C语言的文件操作有了一个全面的了解。文件操作是C语言编程中一项重要的技能,掌握它可以让你更好地处理数据,开发更实用的程序。希望本文能够帮助你入门C语言的文件操作,并为你的程序开发之路添砖加瓦。在实际应用中,文件操作可能涉及到更复杂的情况,例如错误处理、文件格式的设计等。建议你多加练习,查阅相关资料,不断提升自己的技能。记住,熟能生巧!只有通过不断的实践,才能真正掌握文件操作的精髓。
2025-06-18 18:20:28
1109
原创 灵活掌控:深入理解C语言的动态内存管理
掌握C语言的动态内存管理,不仅是写出高效程序的关键,也是开发安全稳健软件的重要保障。善用malloc、realloc和free等函数,我们可以灵活应对各种复杂场景,实现资源的动态高效利用。在未来的编程旅程中,让我们不断深入探索与实践,成为内存管理的高手,从而写出更加出色与安全的C语言程序。
2025-06-13 13:28:50
816
原创 C语言联合体和枚举:你真的用对了吗?
与结构体类似,可以是几个不同类型元素的集合,但是,与结构体不同的是:这几个元素公用一块空间枚举就是字面意思:列举,把所有可能都列出来。比如性别:男、女、保密,就这三种。
2025-06-05 10:38:32
606
原创 C语言探索之旅:深入理解结构体的奥秘
首先来回顾一下数组的定义:数组就是相同类型元素的集合。但是,实际中描述某个物体的数据绝大部分都是不同类型,这时候就需要一个新的东西来把这些数据集合起来:结构体结构体就是存放不同类型的数据的集合。int _b : 5;冒号后面的数字比啊是这个成员要占用的比特位的数量,比如a只占两个比特位位段的成员必须是 int ,unsigned int ,signed int 类型结构体作为C语言中实现复杂数据管理的重要机制,理解并善用它,能够极大地提升你的程序设计水平。
2025-06-04 14:04:04
1331
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅