自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ 智能指针深度解析:原理、实现与实战避坑

本文深入探讨了C++智能指针的原理与应用。通过分析内存泄漏问题,引出RAII(资源获取即初始化)设计思想,详细解析了标准库中四种智能指针(auto_ptr、unique_ptr、shared_ptr、weak_ptr)的实现机制与适用场景。重点包括:1) 智能指针如何通过对象生命周期自动管理资源;2) unique_ptr的独占所有权特性;3) shared_ptr的引用计数实现;4) weak_ptr解决循环引用的原理。文章还提供了完整自定义实现代码,并配以可视化说明,帮助开发者深入理解智能指针的核心概念

2025-12-18 21:07:08 682

原创 C++11 核心特性实战博客

C++11通过列表初始化和右值引用两大特性显著提升开发效率与性能。列表初始化({}语法)统一了内置类型和自定义类型的初始化方式,简化代码并支持容器直接初始化。右值引用(&&)配合移动语义有效减少临时对象的拷贝开销,通过移动构造和移动赋值直接转移资源所有权。这两项特性使代码更简洁,同时大幅提升处理字符串、容器等大对象时的性能,是现代C++开发的核心技能。

2025-12-08 22:14:59 260

原创 哈希表实现与解析:从理论到实践

本文详细介绍了哈希表的实现原理与C++实现。哈希表是一种基于键值映射的高效数据结构,通过哈希函数实现O(1)平均时间复杂度的操作。文章首先阐述了哈希表的核心概念(哈希函数、冲突处理、负载因子)和特性,重点讲解了链地址法解决哈希冲突的原理。随后提供了完整的哈希表模板实现,包括哈希节点结构、迭代器设计和核心操作(插入、查找、删除),并采用素数容量和负载因子控制优化性能。此外,还实现了unordered_map和unordered_set容器,包含字符串特化哈希函数。最后通过全面的测试用例验证了实现的正确性,包括

2025-12-04 19:25:12 668 1

原创 红黑树深度解析:原理、实现与验证

红黑树是一种自平衡二叉搜索树,通过颜色标记和旋转操作维持近似平衡。其核心特性包括:节点非红即黑、根节点为黑、红色节点的子节点必须为黑、所有路径黑节点数相同。这些规则确保最长路径不超过最短路径的两倍,保证O(logN)的操作复杂度。实现上包含节点结构定义、左旋/右旋操作以及插入时的三种情况处理(变色、单旋+变色、双旋+变色)。插入算法通过检查父节点和叔节点颜色来决定调整策略,最终保持红黑树性质。验证函数会检查路径黑节点数和连续红节点情况,确保树的正确性。

2025-11-25 17:09:08 604 1

原创 深入理解 AVL 树:自平衡二叉搜索树的实现与原理

AVL树是一种自平衡二叉搜索树,由Adelson-Velsky和Landis于1962年提出。它通过平衡因子(右子树高度减左子树高度)确保每个节点的平衡因子绝对值不超过1,从而维持树的高度平衡。核心操作包括插入时的平衡因子更新和四种旋转调整(左旋、右旋、左右双旋、右左双旋),使所有操作时间复杂度稳定在O(logN)。AVL树相比普通二叉搜索树具有更好的查询性能,但插入/删除成本略高。适用于需要频繁查询但对插入删除效率要求不高的场景。

2025-11-23 22:02:33 829 1

原创 STL map/set 全家桶完全攻略:从原理到实战(含 LeetCode 题解)

本文深入解析C++ STL中的map和set系列关联式容器。基于红黑树实现,它们具备自动排序和高效查找特性,适用于去重、键值映射等场景。文章详细对比了set/multiset和map/multimap的核心差异,包括元素重复性、接口特性等,并通过代码示例展示了构造、增删查改等操作。特别强调了operator[]的复合功能、multimap的equal_range使用技巧等关键点。最后结合LeetCode经典题目,演示了这些容器在算法中的实际应用。文中还总结了使用时的常见注意事项,如避免修改key、优先使用容

2025-11-22 20:13:04 1012

原创 二叉搜索树深度解析:概念、实现与应用场景

本文介绍了二叉搜索树的核心概念及其两种实现模式。二叉搜索树通过左小右大的规则保证数据有序性,其中序遍历结果即为排序序列。文章详细解析了插入、查找和删除(包括单子结点和双子结点处理)三大核心操作,并提供了完整的C++模板实现代码。二叉搜索树分为仅存储键的Key模式和存储键值对的Key-Value模式,分别适用于车牌验证等存在性判断场景和字典等键值关联场景。虽然普通二叉搜索树在数据分布不均时会退化为单支树,但其动态操作优势使其成为AVL树、红黑树等更高级结构的基础。

2025-11-16 00:05:08 916

原创 C++ 小白入门:多态到底是什么?一篇看懂!

摘要:本文通俗讲解C++多态概念,通过买票等生活例子说明"同一行为不同结果"的多态本质。详细讲解实现多态的两大条件:基类指针/引用调用和虚函数重写,并给出完整代码示例。特别说明析构函数重写防止内存泄漏的重要性,介绍C++11的override/final关键字,以及纯虚函数和抽象类的作用。最后简要解析多态底层原理,总结多态的核心知识点和应用场景。文章采用生活化语言和实例代码,帮助编程新手理解这个面向对象的重要特性。

2025-11-13 22:36:09 1130

原创 手撕优先队列:从零理解 priority_queue

本文介绍了优先队列的实现原理。优先队列不同于普通队列,每次出队的是优先级最高或最低的元素,通常用堆结构实现,分为大根堆和小根堆。文章解析了手写优先队列的代码结构,包括仿函数Less和Greater的设计、核心类模板的参数配置,以及向上调整(插入时)和向下调整(删除时)两个关键操作。同时说明了push、pop、top等对外接口的使用方法,并演示了如何通过仿函数切换大小根堆模式。该实现虽简单但完整展示了优先队列的核心机制,有助于深入理解STL中的priority_queue。

2025-11-08 00:42:03 490

原创 手把手教你实现 C++ 中的 list 容器

本文介绍了C++双向链表的实现方法。首先定义链表节点结构,包含数据存储和前驱/后继指针。通过模板迭代器实现遍历功能,支持前后移动和解引用操作。链表主体采用哨兵节点形成循环结构,实现了初始化、拷贝构造、赋值和析构等基本方法。提供了头尾插入删除、指定位置操作等常用功能,使用"拷贝并交换"技术保证操作安全高效。示例展示了链表的创建、元素添加删除和遍历操作。该实现遵循STL风格,可作为自定义容器的基础框架。

2025-11-06 00:07:50 585

原创 手撕vector:从零实现一个C++动态数组

摘要:本文详细讲解了如何手写实现C++ STL中的vector容器。主要内容包括:1) 定义基本框架,使用三个指针管理动态数组;2) 实现迭代器和内存管理(reserve函数);3) 提供多种构造函数(默认、初始化、区间、拷贝构造);4) 实现基本操作(容量查询、元素访问);5) 实现修改操作(尾插尾删、插入删除);6) 工具函数(调整大小、交换、打印)和析构函数;7) 测试代码验证功能。通过完整实现,帮助理解vector底层原理和内存管理机制。

2025-11-01 19:55:23 727

原创 手写一个C++字符串类:从底层理解String的实现

这是我通过自己动手实现一个字符串类,希望能够让你更好地理解C++的类设计、内存管理和运算符重载等概念。

2025-10-28 23:07:33 965

原创 C++ 函数模板与类模板详解

函数模板代表了一组与类型无关的函数,使用时通过参数化生成特定版本。基本格式为template<typename T> 返回值 函数名(参数){}。编译器根据实参类型自动推导生成对应函数,如sum(a,b)会根据a、b的类型推导T。模板函数与普通函数同名时,优先调用普通函数,除非模板匹配更好。类模板定义类似,如template<class T> class Stack{},使用时需显式指定类型Stack<int>。注意模板不支持自动类型转换,且声明和定义通常要放在同一文件中

2025-10-18 01:04:52 703

原创 C++ 类与对象:从入门到实践

本文系统介绍了C++类和对象的核心概念。主要内容包括:1)类的基本定义与成员变量/函数;2)访问权限控制(public/private);3)struct的类特性;4)类作用域与作用域解析符;5)类对象内存大小计算;6)this指针原理;7)构造函数与析构函数;8)拷贝构造函数;9)const成员函数。通过Stack、Date等示例代码展示了面向对象编程的关键特性:封装、构造析构、this指针、拷贝控制和const安全机制,为理解C++面向对象编程提供了实践基础。

2025-10-13 00:56:39 667

原创 日期类(Date)的完整实现与详解

本文介绍了一个完整的C++日期类实现,封装了日期处理的常用功能。主要内容包括:日期类的设计思路,包含日期合法性检查、加减运算、比较运算等功能;核心实现细节,如获取月份天数、日期合法性验证、日期加减运算处理等;关键功能实现,包括运算符重载、自增自减运算、日期差值计算等。该日期类支持各种日期操作,如计算两个日期之间的天数差、日期加减天数、比较日期先后等,并提供了完善的输入输出支持,可直接用于流操作。文中还给出了使用示例,展示了该日期类的基本用法。

2025-10-13 00:53:06 1051

原创 C++基础语法详解:从命名空间到内联函数

本文系统介绍了C++的核心特性,包括命名空间解决命名冲突、输入输出流的安全操作、缺省参数的灵活使用、函数重载的多态实现、引用的内存共享机制、const关键字的常量定义、内联函数的性能优化以及nullptr的空指针表示。这些特性使C++在保留C语言优势的同时,增强了代码的可读性、安全性和效率。通过对比分析,文章详细阐述了各特性的语法规则和使用场景,为C++开发者提供了实用的编程参考。

2025-10-07 22:21:13 1127

原创 计数排序算法详解

计数排序是一种非比较型整数排序算法,通过统计元素出现次数实现排序。算法步骤包括:确定数据范围、创建统计数组、统计元素频次、重构排序数组。时间复杂度为O(N+range),空间复杂度为O(range)。该算法在数据范围较小、重复元素多时效率高,但不适用于浮点数且空间消耗较大。当前实现为不稳定排序,若需稳定可改进为使用前缀和技巧。计数排序以空间换时间,在特定条件下能达到线性时间复杂度。

2025-10-03 16:38:18 1155

原创 深入解析快速排序

while (j >= left && a[j] > tmp) { //与要插入的元素进行比较,>为升序,<为降序。//选首元素为key值,则右边先走,选尾元素为key值,则左边先走。//key与begin交换,因为begin与end相遇的地方,值一定小于key。//将中值与左值交换。StackEmpty(&s)) { //栈为空跳出循环。

2025-10-03 14:14:29 836

原创 归并排序详解:递归与非递归实现

归并排序是一种采用分治策略的高效排序算法,由冯·诺依曼于1945年提出。其核心思想是将数组递归分成两半分别排序,再合并有序子数组。说一说归并排序的要点:1. 时间复杂度稳定为O(nlogn);2. 需要O(n)额外空间;3. 是稳定排序;4. 特别适合大数据排序。算法实现包括递归和非递归两种方式,均需处理边界条件。递归版本采用自顶向下分解,非递归版本则自底向上直接合并。归ershuffle排序在大数据排序和稳定排序需求场景中表现优异。

2025-10-01 14:52:44 721

原创 直接插入排序与希尔排序

本文介绍了两种插入类排序算法:直接插入排序和希尔排序。直接插入排序通过将数组分为已排序和未排序部分,逐个插入元素实现排序,时间复杂度为O(n²)。希尔排序则是对直接插入排序的优化,采用分组插入和逐步缩小间隔的方式,时间复杂度约为O(n^1.3)。文章详细说明了两种算法的实现思路、代码示例和时间复杂度分析,并分享了学习心得,强调理解算法思想比单纯记忆代码更重要。

2025-09-28 18:22:06 1117

原创 判断子树:基于相同树思想的递归解法

摘要:该问题要求判断二叉树root中是否存在与subRoot结构相同的子树。解决方案采用递归两步法:1)实现isSameTree函数比较两树是否完全相同;2)在isSubtree函数中递归搜索root树,当节点值与subRoot根节点相同时调用isSameTree验证。时间复杂度为O(m×n),空间复杂度为O(max(m,n))。关键优化包括提前返回和短路求值策略,有效减少不必要的递归调用。

2025-09-27 16:49:20 541

原创 二叉树的基本实现(C语言)

本文介绍了C语言实现二叉树的基本操作,包括创建(前序遍历序列构建)、销毁、节点统计、深度计算、查找、三种遍历方式(前序/中序/后序)以及层序遍历等。通过tree.h头文件定义结构体,tree.c实现核心功能,test.c完成测试验证。特别实现了判断完全二叉树的算法,并强调使用"#"表示空节点的前序遍历构建方式。代码采用递归实现主要功能,层序遍历借助队列完成,所有操作均提供完整测试案例,适合初学者学习二叉树的基本原理和实现方法。

2025-09-27 16:39:11 1078

原创 堆排序的强大应用:高效解决Top K问题

TopK问题指从海量数据中找出最大/最小的K个元素,常见于大数据分析、推荐系统等场景。传统排序法在数据量大时效率低下,推荐使用部分建堆法:维护一个K大小的小顶堆(找最大K元素),遍历数据时替换堆顶并调整,保持堆性质。该方法时间复杂度为O(NlogK),空间复杂度仅O(K),特别适合处理无法全加载到内存的超大规模数据集。基于堆的实现先读取前K个数据建堆,后续数据逐个比较替换堆顶,最终堆中即为TopK结果,兼具高效性和内存友好性。

2025-09-22 01:23:06 697

原创 堆排序详解:从原理到实现

堆是一种特殊的完全二叉树,分为大顶堆和小顶堆两种类型,分别适用于升序和降序排序。建堆的核心算法包括向上调整(O(logn))和向下调整(O(logn)),其中向下调整建堆效率更高(O(n))。堆排序通过构建大顶堆、交换堆顶与末尾元素并重复调整,实现O(nlogn)时间复杂度的高效排序,且空间复杂度为O(1)。该算法不仅用于排序,还广泛应用于优先级队列、Top-K问题等场景,其关键在于掌握调整算法和从最后一个非叶子节点开始建堆的优化策略。

2025-09-22 01:03:32 1078

原创 循环队列:高效利用空间的队列实现

循环队列是一种环形结构的先进先出(FIFO)数据结构,通过将队列首尾相连解决普通队列的"假溢出"问题。其核心实现采用取模运算循环移动指针:1)多分配1个空间区分队空(front=rear)和队满((rear+1)%Maxlen=front);2)入队操作rear指针循环前进;3)出队操作front指针循环移动。相比普通队列,循环队列空间利用率更高,入队出队均为O(1)时间复杂度,广泛应用于进程调度、网络缓存等场景。

2025-09-15 23:58:55 681

原创 用C语言实现链式队列

队列是一种遵循"先进先出"(FIFO)原则的线性数据结构,类似生活中的排队。文章详细介绍了队列的基本操作(入队、出队、获取队头/尾元素等)及其C语言实现,包括节点定义、初始化、增删操作和辅助功能。通过链表结构实现队列,使用front和rear指针分别指向队头和队尾。测试示例展示了队列的基本使用流程,最后说明了队列在消息处理、算法、操作系统等领域的广泛应用。

2025-09-15 23:52:36 664

原创 【C语言入门】手把手教你实现顺序栈

顺序栈是使用数组实现的栈结构,具有以下特点:元素在内存中连续存储有一个指针(top)始终指向栈顶位置支持基本的入栈(push)和出栈(pop)操作首先我们需要定义栈的结构和声明相关操作函数:// 定义栈中元素的数据类型// 栈的结构定义// 指向动态数组的指针int _top;// 栈顶位置// 当前容量}Stack;// 函数声明// 初始化栈// 入栈// 出栈// 获取栈顶元素// 获取元素个数// 检查栈是否为空// 销毁栈。

2025-09-15 23:41:27 969

原创 带头双向循环链表的C语言实现

带头双向循环链表是一种常见的数据结构,它具有以下特点:包含一个不存储实际数据的头节点每个节点都有指向前驱和后继的指针尾节点的后继指向头节点,头节点的前驱指向尾节点形成一个循环结构这种结构在插入、删除操作上具有很高的效率,特别是在头尾操作时时间复杂度为O(1)。// 前驱指针// 后继指针} LTNode;带头双向循环链表是一种高效的数据结构,具有以下优点:任意位置的插入和删除操作时间复杂度为O(1)可以双向遍历头尾操作效率高不需要特殊处理边界情况。

2025-09-12 13:40:33 814

原创 算法复杂度解析(C语言)

本文介绍了时间复杂度和空间复杂度的概念及计算方法。时间复杂度表示算法运行时间随输入规模的增长趋势,空间复杂度则描述算法所需存储空间。使用大O表示法,常见的时间复杂度包括O(1)、O(logn)、O(n)、O(n²)等。通过代码示例展示了不同复杂度级别的实现,如常数时间访问(O(1))、线性遍历(O(n))、嵌套循环(O(n²))和二分查找(O(logn))。同时说明了空间复杂度的计算规则,包括递归调用的空间消耗。最后给出了复杂度计算的简化规则和实际应用建议,强调在大数据场景下应避免高复杂度算法。

2025-09-12 13:38:48 915

原创 单链表的C语言实现详解

大家好!今天我们来聊聊数据结构中的基础但非常重要的内容——单链表。我会用最详细的方式,从零开始教你如何用C语言实现一个单链表(无头结点、不循环)。即使你完全没有链表的概念,相信通过这篇博客也能完全理解!单链表是一种常见的线性数据结构,它由一系列节点数据域- 存储实际的数据指针域- 存储下一个节点的地址这些节点通过指针连接起来,形成一个链式结构。单链表的特点是:不需要连续的内存空间插入和删除效率高(O(1)时间复杂度)访问效率相对较低(O(n)时间复杂度)// 指向同类型结构体的指针这里。

2025-09-08 20:34:37 1140

原创 深入解析函数栈帧核心机制

文章摘要: 栈帧是函数调用时在栈内存中创建的连续区域,用于存储函数执行所需的信息(如参数、返回地址、局部变量等)。每个函数调用对应一个栈帧,遵循后进先出(LIFO)原则。栈帧通过基址指针(ebp)和栈指针(esp)管理,确保函数调用和返回时能正确恢复上下文。其生命周期包括参数压栈、保存返回地址、分配局部变量空间及返回后清理。栈帧的标准化布局支持递归和嵌套调用,同时高效的内存管理(通过移动指针实现)与堆内存形成对比。缓冲区溢出等操作可能破坏栈帧结构,引发安全漏洞。

2025-09-01 14:44:37 923 1

空空如也

空空如也

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

TA关注的人

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