自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 用红黑树封装map和set

本文详细介绍了红黑树的实现及其在STL容器set和map中的应用。主要内容包括:1)红黑树节点的模板化设计,使其能同时支持set(存储key)和map(存储pair);2)通过仿函数KeyOfT统一提取节点中的key值,解决不同类型数据比较问题;3)迭代器实现,包括operator++和operator--的中序遍历逻辑;4)红黑树插入操作的完整实现,包括颜色调整和旋转处理;5)set和map的封装,通过模板参数控制key的不可修改性;6)map中operator[]的实现原理。最后给出了完整的红黑树、se

2025-11-24 23:54:12 892 10

原创 《红黑树的平衡密码:不追求完美,却赢了性能^~^》

红黑树是一种自平衡二叉搜索树,通过颜色标记和旋转操作维持平衡。其核心规则包括:节点为红或黑、根节点为黑、无连续红节点、各路径黑节点数相同。插入时通过变色和旋转(单旋或双旋)调整结构,保持平衡。查找效率为O(logN),验证平衡需检查颜色规则和路径黑节点数。红黑树通过限制最长路径不超过最短路径2倍,避免退化为单支树,确保高效操作。

2025-10-19 20:45:59 618 15

原创 《二叉树“防塌”指南:AVL 树如何用旋转 “稳住” 平衡?》

AVL树是一种平衡二叉搜索树,通过控制左右子树高度差不超过1来保证高效查找(O(logN))。本文详细介绍了AVL树的结构、插入操作及四种旋转方式(右单旋、左单旋、左右双旋和右左双旋),并提供了检查平衡性、计算高度、节点数量和中序遍历等功能的实现代码。与普通BST相比,AVL树能有效避免退化成单支树的情况,确保操作效率。文中还包含了平衡因子更新规则和异常处理机制,为理解和实现AVL树提供了完整指导。

2025-10-19 20:45:56 996 13

原创 C++:set和map详解版

本文主要介绍了C++ STL中的关联式容器set和map,重点讲解了它们的基本特性、迭代器、构造方法以及增删查操作。set是基于红黑树实现的平衡二叉搜索树,具有自动排序和去重功能,支持高效查找、插入和删除操作。map则是key-value结构,同样基于红黑树实现,支持通过key快速查找和修改value。文章还详细介绍了它们的插入方法、删除操作、查找功能以及特殊函数如lower_bound和upper_bound的使用。此外,还对比了set和multiset的区别,以及map的特殊操作符[]的实现原理。最后通

2025-10-11 14:06:46 1019 17

原创 C++--二叉搜索树

本文介绍了二叉搜索树(BST)的基本概念和实现方法。BST是一种左子树节点值均小于根节点,右子树节点值均大于根节点的数据结构,查找效率在O(log2N)到O(N)之间。文章详细讲解了BST的节点结构、插入(insert)、中序遍历(InOrder)、查找(Find)和删除(Erase)等操作的具体实现,并分析了各种情况下的处理逻辑。此外,还介绍了BST在key/value应用场景中的扩展使用,如通讯录、停车场系统等,展示了如何通过key索引value。文章强调BST不允许修改key值以避免破坏结构,并提供了

2025-10-06 20:39:32 949 12

原创 C++多态详解

文章摘要:本文深入探讨了C++多态的实现原理与关键概念。首先分析了多态的实现条件,包括基类指针/引用调用虚函数和虚函数重写的要求。重点讨论了虚函数重写中的特殊问题:协变(允许返回派生类指针)和析构函数重写(需统一处理函数名)。介绍了override和final关键字的作用,对比了重载、重写和隐藏的区别。解析了抽象类和纯虚函数的概念,通过形状类示例说明其应用。详细阐述了多态底层原理,包括虚函数表指针(_vfptr)和虚函数表的结构,展示了父子类虚函数表的差异。最后说明虚函数表存储于常量区。

2025-10-01 17:26:18 784 3

原创 《当子类遇见父类:一场 C++ 继承的奇妙旅程》

本文系统介绍了C++继承机制,包括访问限定符、继承方式、派生类成员函数等核心概念。重点分析了赋值兼容转换、作用域隐藏规则、派生类默认成员函数的实现原理。通过实例讲解了如何实现不可继承类、友元关系继承、静态成员处理等特殊场景。深入探讨了单继承、多继承和菱形继承问题,提出了虚继承解决方案。最后对比了继承(is-a)和组合(has-a)的适用场景,指出组合能更好保持封装性。全文通过代码示例演示了继承体系中的各种特性,为理解C++面向对象编程提供了全面指导。

2025-09-25 21:04:08 877 1

原创 模板进阶:非类型参数详解与编译链接机制

本文介绍了C++模板中的非类型模板参数和模板特化。非类型模板参数允许使用常量作为模板参数,用于定义静态数组大小等场景,相比宏更加灵活。模板特化分为函数模板特化和类模板特化,可针对特定类型进行特殊处理。函数模板特化需遵循固定格式,但容易出错;类模板特化包括全特化和偏特化。文章还分析了模板分离编译导致链接失败的原因,并给出两种解决方案:显式实例化或将模板定义直接写在头文件中。这些技术能提升代码的灵活性和可维护性,但需注意使用细节。

2025-09-21 15:05:26 588 1

原创 《C++ 容器适配器:stack、queue 与 priority_queue 的设计》

本文介绍了C++中栈、队列和优先级队列的适配器实现方式。通过模板参数传入底层容器(如vector、list或deque),可以灵活构建不同特性的数据结构:栈默认使用deque实现,队列也用deque适配,避免vector头删效率低的问题。优先级队列基于堆实现,默认使用vector容器和大堆排序。重点讲解了仿函数的应用,通过Less和Greater仿函数类实现对比较逻辑的封装,使得优先级队列可以灵活切换大小堆模式而无需修改核心代码。这种适配器模式充分利用现有容器特性,仅暴露特定接口,既简化了实现又保证了灵活性

2025-09-14 18:00:12 823 2

原创 《链表的优雅封装:C++ list 模拟实现与迭代器之美》

摘要: 本文详细分析了C++中list的实现原理及其特性。list底层采用双向链表结构,相比数组结构的vector和string,其优点包括:插入/删除操作仅需调整指针(时间复杂度O(1)),迭代器稳定性(插入/删除不导致其他迭代器失效)。缺点是无法随机访问(需遍历),且迭代器需封装指针以支持++、*等操作。 实现分为三类: 节点类(list_node):存储数据及前后指针; 链表类(list):维护哨兵节点_head及大小_size,提供push_back、insert等方法; 迭代器类:封装节点指针,重

2025-09-10 19:53:02 629 2

原创 《从模板初阶到 vector 实战:解锁 C++ 容器的底层逻辑》

这篇文章主要介绍了C++模板编程的概念和应用。首先解释了模板的作用是解决代码复用和泛型编程问题,通过函数模板和类模板实现。函数模板通过隐式实例化自动推导类型参数,类模板则需要显式实例化。文章详细讲解了vector容器的实现,包括迭代器、构造函数、插入删除等操作,重点分析了迭代器失效问题及解决方法。最后指出对于包含动态资源的类型,必须使用深拷贝而非简单的memcpy复制。全文通过具体代码示例展示了模板编程的实际应用和注意事项。

2025-09-01 20:13:37 941 1

原创 《不止“字符串”:C++string类的设计哲学与使用指南》

本文介绍了C++标准库中的string类及其常用成员函数实现。主要内容包括:1. 三种打印字符串方式(下标、迭代器、范围for);2. 构造函数、析构函数、拷贝构造和赋值运算符重载的实现;3. 容量相关函数(size/capacity/reserve/resize)和修改函数(push_back/append/insert/erase);4. 字符串操作函数(find/substr/c_str);5. 非成员函数(流运算符重载/swap/getline)。重点讲解了string类的底层实现原理和深拷贝问题,

2025-08-26 14:51:12 950 3

原创 内存管理c++

仅回收内存,不清理对象),new,delete会在申请空间和自动调用构造函数完成对象的初始化,释放空间之前会调用析构函数完成对象成员资源的释放。operator new实际上通过malloc来申请空间,当malloc申请成功时直接返回,申请失败则抛异常,仅负责分配内存,不初始化对象;delete和free类似,注意new/delete申请释放的是单个元素的空间,new[]/delete[]申请和释放的是连续的内存空间。局部数据,用一会就销毁,栈帧销毁就销毁,长期使用的,不修改的数据,动态申请的数据。

2025-08-16 13:42:42 884 1

原创 类和对象-下

文章摘要:本文介绍了C++中的构造函数初始化列表与体内赋值的区别,重点分析了三种必须使用初始化列表的情况:const成员、引用成员和无默认构造的自定义类型成员。同时讲解了static成员的特性、友元机制、内部类概念以及匿名对象的使用场景。最后讨论了编译器对对象拷贝的优化策略,包括临时对象的产生和传值优化的处理方式.

2025-08-12 15:26:14 456 1

原创 类和对象(中)

本文介绍了C++类的6个默认成员函数,重点阐述了前4类:构造函数、析构函数、拷贝构造函数和运算符重载。构造函数用于对象初始化,编译器会默认生成无参构造函数但对内置类型不做初始化;析构函数用于资源释放,默认生成版本对内置类型不做处理;拷贝构造函数实现对象拷贝,默认浅拷贝可能导致双重释放问题;运算符重载允许自定义类型使用运算符,需注意特殊语法规则。

2025-08-05 20:09:28 1844 1

原创 类和对象(上)

本文介绍了C++中类的定义与使用要点:1.类由成员变量和成员函数组成,使用class/struct关键字定义;2.class默认私有访问,struct默认公有;3.类中成员变量仅声明,实例化时才分配内存;4.成员函数存储在代码段,通过this指针区分不同对象;5.介绍了访问限定符、内存对齐、空类大小等特性;6.对比了C/C++在类定义上的差异,如C++不需要typedef。重点阐述了this指针的作用机制,它是连接共享函数代码与独立对象数据的关键。

2025-08-04 17:35:29 873 1

原创 选择排序(直接选择+堆排序)+归并排序

本文介绍了三种排序算法:选择排序、堆排序和归并排序。选择排序通过每次选取最小/最大值进行排序,时间复杂度为O(n²)且不稳定;堆排序利用大/小堆结构进行排序,时间复杂度为O(nlogn)也不稳定;归并排序采用分治思想递归或非递归实现,时间复杂度为O(nlogn)且稳定。

2025-08-04 09:30:00 1038

原创 插入排序-直接插入+希尔

摘要:插入排序通过将元素逐个插入已排序序列来实现排序,包括直接插入排序和希尔排序。直接插入排序时间复杂度为O(n^2)(最坏)到O(n)(最好),适用于小规模数据且稳定。希尔排序是改进版,先进行gap分组的预排序(时间复杂度约O(n^1.3)),最后执行直接插入排序。希尔排序效率更高但不稳定,适用于大规模数据。两种排序均通过元素比较和移动实现,但希尔排序通过分组预排序显著提升了性能。

2025-07-30 13:00:00 604

原创 交换排序-冒泡+快速排序(无优化+有优化+非递归)

本文介绍了两种交换排序算法:冒泡排序和快速排序。冒泡排序通过n-1趟相邻元素比较交换完成排序,时间复杂度最坏和最好均为O(n²);优化版本通过标志位可提前终止,最好情况时间复杂度降为O(n)。快速排序采用分治思想,hoare版本通过基准值划分左右子序列,时间复杂度最优为O(nlogn),最坏为O(n²)。优化方案包括:三数取中法选择基准值、小区间改用插入排序,也介绍了前后指针版本。还介绍了非递归实现方法,使用栈模拟递归过程。文章详细分析了各算法的时间复杂度,并提供了优化思路和具体实现代码。

2025-07-29 12:00:00 2038

原创 二叉树相关知识点

本文介绍了二叉树的基本概念和常见操作。二叉树由节点组成,每个节点包含数据、左右孩子指针。文章详细讲解了二叉树的创建(前序遍历方式)、节点计数(总节点数和特定层节点数)、叶子节点统计、查找特定值节点、计算树高以及销毁二叉树等核心操作。重点分析了递归实现方法,包括参数传递方式(值传递与指针传递的区别)和递归终止条件。对于关键操作如节点查找和树高计算,提供了清晰的实现思路和代码示例,并强调了空指针处理的重要性。最后提醒销毁后需手动置空指针以避免访问已释放内存。

2025-07-27 13:00:00 517

原创 二叉树-堆

本文介绍了堆数据结构的基本概念和实现方法。堆是一种完全二叉树,分为大根堆(父节点大于子节点)和小根堆(父节点小于子节点)。文章详细阐述了堆的存储方式(数组实现)和父子节点下标的计算关系。重点讲解了两种调整算法:向上调整(插入元素时使用)和向下调整(删除堆顶元素时使用)。同时给出了堆的结构体定义和基本操作实现,包括初始化、插入、删除、取堆顶元素等。最后比较了两种建堆方式(向上调整和向下调整)的时间复杂度,指出向下调整算法效率更高。

2025-07-23 23:56:09 592

原创 栈和队列,循环队列

本文详细介绍了栈和队列两种数据结构及其实现方法。栈采用数组实现,支持初始化、入栈、出栈、取栈顶等操作,具有"先进后出"特性;队列采用链表实现,支持初始化、入队、出队、获取队首队尾元素等操作,具有"先进先出"特性。此外还介绍了循环队列的实现,通过数组和取模运算解决假溢出问题,包含空满判断、插入删除等操作。文章通过C语言代码展示了各数据结构的实现细节,包括内存管理、边界条件处理等关键点,并提供了测试示例。

2025-07-22 23:17:33 790 3

原创 顺序表和链表-单链表,双链表知识及代码实现

本文比较了顺序表和链表两种数据结构的特点与实现。顺序表采用数组存储,分为静态和动态两种形式,动态顺序表利用malloc/realloc实现扩容,但存在空间浪费和移动元素开销大的缺点。链表通过指针链接节点,重点介绍了单链表和双向循环链表的实现,包括节点初始化、头尾插/删、指定位置操作等接口函数。单链表使用二级指针修改头节点,双向链表通过哨兵位简化操作。链表优点是不需连续空间,但缓存利用率低。两种结构各有优劣,适用于不同场景。

2025-07-18 23:48:49 939

原创 c语言--指针,数组,和函数之间的关系

c语言--指针,数组,和函数之间的关系

2025-06-17 15:22:14 680

原创 C语言实现扫雷简易小游戏

摘要: 本文介绍了9×9扫雷游戏的实现方法。使用二维数组mine存储雷的位置信息,show数组显示玩家视图。游戏流程包括:1)初始化11×11的mine数组和9×9的show数组;2)随机布置10个雷;3)通过GetMineCount函数计算周围雷数;4)FindMine函数处理玩家输入并判断输赢。游戏采用模块化设计,分为game.h、game.c和test.c三个文件,包含棋盘初始化、雷区布置、雷数统计、排雷判断等功能函数。玩家可重复游戏直到触发地雷或完成所有安全位置排查。

2025-06-15 22:24:15 1658

空空如也

空空如也

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

TA关注的人

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