自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】模拟实现 红黑树(RBTree)

红黑树是一种近似平衡的二叉搜索树,通过节点颜色标记和五条核心规则实现弱平衡。它放弃了AVL树的严格平衡要求,将最长路径控制在最短路径的2倍以内,从而减少旋转次数(插入最多2次,删除最多3次),提高写操作效率。红黑树节点默认红色,通过变色和旋转维护规则:根节点黑色、无连续红节点、所有路径黑高一致。其核心优势在于保持O(logN)时间复杂度同时降低维护成本,广泛应用于C++ STL map/set、Java TreeMap等场景。实现上通过左旋/右旋调整结构,插入时根据叔节点颜色进行变色或旋转操作,确保平衡性。

2026-02-13 09:32:30 533 2

原创 【C++】模拟实现 AVL树

AVL树是一种自平衡二叉搜索树,通过平衡因子和旋转机制确保树高严格控制在O(logN)。其节点包含键值对、父指针和平衡因子(BF=右高-左高),要求BF∈[-1,1]。插入操作分三步:按BST规则插入、向上更新平衡因子、失衡时旋转调整。旋转分为四种情况(左/右单旋、左右/右左双旋)以应对不同失衡形态。AVL树解决了BST退化为链表的问题,保证增删查改操作稳定在O(logN)时间复杂度。

2026-02-13 09:31:49 757 1

原创 【C++】模拟实现 二叉搜索树

二叉搜索树的核心是 “有序性”,其所有操作均围绕这一特性展开。本文实现的基础版本覆盖了二叉搜索树的核心功能,而实际工程中(如 C++ 标准库)会通过红黑树对其进行平衡优化,避免单支树的性能退化。理解二叉搜索树的底层逻辑,是掌握关联式容器、高效检索算法的关键基础。

2026-02-11 22:43:26 1341 14

原创 【C++】多态

多态是继承关系下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了PersonPerson对象买票全价,Student对象优惠买票。

2026-02-11 22:42:49 682 3

原创 【C++】继承

C++继承机制详解:面向对象复用的核心实践 摘要:本文深入解析C++继承机制,重点阐述如何通过继承解决代码冗余问题。通过Student和Teacher类案例,展示将公共成员抽离为Person基类的实践方法。详细讲解继承语法、访问权限控制规则(public/protected/private继承的差异)以及类模板继承的特殊处理。特别强调public继承下的类型转换规则(派生类到基类的"切片"特性)和继承体系中的隐藏规则(同名成员会隐藏基类成员)。文章还指出继承的常见误区,包括基类priva

2026-02-08 14:14:35 1141 16

原创 【C++】模板进阶:非类型参数与特化

本文深入探讨C++模板的进阶特性,包括非类型模板参数的使用限制(仅支持编译期可确定的整型常量)、模板特化技术(函数模板特化和类模板特化)以及模板分离编译问题。重点分析了模板特化的应用场景,如处理指针比较等特殊情况,并通过实际案例演示了全特化和偏特化的实现方式。同时指出模板分离编译可能导致链接错误的本质原因,为开发者掌握模板高级用法提供了实用指导。

2026-02-08 14:13:37 655 6

原创 【C++】揭秘STL:stack与queue的底层实现

本文介绍了STL中的stack、queue和priority_queue容器适配器的实现原理。首先讲解了deque双端队列作为底层容器的优势与缺陷,指出其不适合频繁遍历但适合作为stack/queue的底层容器。然后展示了stack和queue的框架实现,两者基于容器适配器模式,默认使用deque作为底层容器。最后详细介绍了priority_queue优先级队列的特性,它实际上是一个堆结构,默认使用vector实现大顶堆,支持自定义比较规则。文章通过代码示例演示了这些容器的基本使用方法,并强调了自定义类型需

2026-01-01 18:31:09 684 12

原创 【C++】掌握list:C++链表容器的核心奥秘

本文摘要: STL中的list是基于双向循环链表实现的容器,其核心优势在于高效的任意位置插入删除操作。学习list有助于理解链式存储结构、智能迭代器设计以及底层指针操作。list的关键实现包括:节点结构(存储数据及前后指针)、迭代器封装(重载运算符实现遍历访问)和链表管理(哨兵位设计)。与vector相比,list更适合频繁增删场景,而vector则擅长随机访问。掌握list底层原理能帮助开发者根据实际需求选择最优容器,提升程序性能。文章详细剖析了list的节点构造、迭代器实现、常用接口及增删查改操作,揭示

2026-01-01 18:30:39 1012 7

原创 【C++】 list 实现:双向循环链表解析

摘要: 本文深入剖析C++ STL中list容器的底层实现与使用方法。list基于双向循环链表结构,具有高效插入删除(O(1))和无需扩容的特点,与vector形成互补。文章详细讲解了list的核心特性、迭代器使用、多种构造方式、容量查询与元素访问方法,以及增删查改操作接口。通过对比vector,突出list在非连续存储和指针操作方面的优势,并强调其迭代器不支持随机访问的特殊性。代码示例展示了list的实际应用场景,为理解链表底层逻辑提供了实践参考。

2025-12-29 15:12:13 1080 35

原创 【C++】vector底层实现全解析

本文详细讲解了如何从零实现一个C++ vector类,包括基本框架设计、迭代器支持、内存管理、运算符重载以及插入删除操作。重点内容包括: 底层数据结构设计:使用三个指针(_start, _finish, _end_of_storage)管理动态数组; 内存管理实现:通过reserve和resize函数处理扩容和大小调整; 迭代器失效原理:在插入删除操作中如何避免和修正迭代器失效问题; 完整功能实现:包括构造/析构函数、元素访问、运算符重载等核心功能。 通过手动实现vector类,可以深入理解STL容器的底层

2025-12-29 15:11:42 1080 17

原创 【C++】掌握vector:C++动态数组的终极指南

本文介绍了C++中vector容器的基本用法,重点讲解了其动态扩容、迭代器使用、构造方法、容量管理和增删查改操作。vector作为STL中的动态顺序表,相比数组具有自动扩容、连续存储和丰富接口等优势。文章通过代码示例展示了vector的常见操作,包括迭代器遍历、构造函数、resize/reserve容量调整,以及push_back、pop_back、find等增删查改方法。这些功能使vector成为C++开发中处理动态数据的首选容器。

2025-12-23 13:27:07 1201 20

原创 【C++】string模拟实现

本文详细介绍了如何从零开始实现C++ string类,包括基本框架设计、内存管理、默认成员函数实现、基础功能和运算符重载等关键部分。作者首先设计了包含字符数据指针、长度和容量的核心结构,然后实现了扩容函数reserve和三大默认成员函数(构造、拷贝构造和析构)。文章还讲解了迭代器支持、常用访问接口以及运算符重载(包括赋值、下标访问、字符串拼接和关系运算符),最后介绍了插入与删除操作的实现方法。通过这种手把手的方式,读者可以深入理解字符串类的底层实现原理,掌握C++类设计和内存管理的关键技术。

2025-12-21 15:13:45 983 33

原创 【C++】string的使用

适用于数组和支持下标访问的容器(如 string、vector),需要手动控制索引范围。一种简洁的遍历方式,自动迭代容器中所有元素,底层基于迭代器实现。通过交换临时对象的资源简化代码,利用临时对象的生命周期自动释放内存。类封装了字符串的创建、修改和操作,相比 C 风格字符数组(),提供了自动内存管理和丰富的成员函数,是字符串处理的首选。迭代器是 STL 容器的通用遍历方式,适用于所有容器。

2025-12-17 17:10:50 479 23

原创 【C++】模板初阶

摘要:本文介绍了C++中的模板编程技术,包括函数模板和类模板。函数模板通过类型参数实现泛型编程,支持隐式和显式实例化,并遵循特定的匹配原则。类模板用于创建通用数据结构,如栈的实现示例所示。模板技术提高了代码复用性,但需要注意类型推导规则和模板定义的位置限制。这些特性使模板成为C++中实现通用编程的重要工具。

2025-12-16 18:52:49 374 15

原创 【C++】内存管理

本文介绍了C/C++中的内存管理机制,重点对比了malloc/free和new/delete的区别。主要内容包括: C/C++内存分区:栈、内存映射段、数据段和代码段的功能特点 C语言内存管理:使用malloc/calloc/realloc/free进行动态内存分配和释放 C++内存管理:new/delete操作符的使用方法,包括内置类型和自定义类型的初始化及内存释放 底层原理:operator new/delete函数的工作机制及异常处理 实现原理:详细分析了new/delete对内置类型和自定义类型的处

2025-12-15 16:47:39 1324 18

原创 【C++】类和对象下

类和对象(下)总结: 初始化列表:必须用于const成员、引用成员和自定义类型成员(无默认构造时)。成员按声明顺序初始化,与初始化列表顺序无关。C++11支持声明时赋缺省值。 类型转换:单参构造函数支持隐式类型转换,用explicit可禁止。C++11支持多参数隐式转换(通过初始化列表{})。 static成员:静态成员属于类,需类外初始化。静态函数无this指针,只能访问静态成员,常用于对象计数或单例模式。 友元:突破封装,允许外部函数或类访问私有成员(友元函数/友元类),但会增加耦合度。 内部类:定义在

2025-12-14 19:53:04 1009 16

原创 【C++】类和对象(中)

本文介绍了C++中类的默认成员函数,重点讲解了构造函数、析构函数和拷贝构造函数的核心概念与使用要点。主要内容包括: 构造函数:用于对象初始化,特点包括与类同名、无返回值、可重载等。编译器会默认生成无参构造函数,但内置类型成员初始化不确定,自定义类型会调用其默认构造。 析构函数:用于资源清理,特点包括~类名形式、无参无返回值。内置类型成员不处理,自定义类型会调用其析构函数。有资源申请时必须显式实现。 拷贝构造:特殊的构造函数,第一个参数必须是类类型引用,否则会无限递归。默认生成的拷贝构造对内置类型浅拷贝,自定

2025-12-01 16:22:45 1182 42

原创 【C++】类和对象(上)

本文介绍了C++类定义的基本概念和使用方法。主要内容包括:1)类定义格式,使用class关键字定义类,包含成员变量和成员函数;2)访问限定符(public/protected/private)的作用及使用规范;3)类域的概念,如何在类外定义成员函数;4)实例化对象的过程和内存分配原理;5)this指针的工作原理及其隐式调用机制。文章还通过代码示例展示了类的基本用法,并解释了空类大小和成员函数调用的特殊情况。这些内容是理解C++面向对象编程的基础。

2025-11-29 10:48:13 1306 28

原创 【C++】初识C++基础

本文介绍了C++基础入门知识,包括:1)C++的第一个程序实现,对比C和C++版本的"hello world";2)命名空间(namespace)的概念与使用,解决命名冲突问题,介绍三种访问方式;3)C++输入输出流的基本用法,包括cout/cin等标准IO对象的使用。重点讲解了命名空间的嵌套定义、多文件合并特性,以及域作用限定符(::)的用法。文章通过代码示例展示了C++相比C语言在命名管理和IO操作上的改进,为C++初学者提供了基础语法参考。

2025-11-25 14:47:37 1510 35

原创 【数据结构&C语言】排序大汇总

实现了常见的排序

2025-11-23 19:29:49 1638 25

原创 【C语言&数据结构】二叉树的链式递归

本文介绍了二叉树的链式存储结构及其实现方法。主要内容包括: 链式二叉树的定义:使用包含数据域和左右指针域的节点结构(二叉链)表示二叉树; 创建方法:通过动态分配内存创建节点并构建二叉树; 遍历算法:详细讲解了前序、中序和后序三种递归遍历方式; 常用操作:实现节点计数、叶子节点计数、树高计算、查找特定节点等基本功能; 销毁方法:采用后序遍历顺序释放节点内存。 文章通过代码示例和图解详细说明了各功能的实现过程,特别强调了递归在二叉树操作中的核心作用。

2025-11-22 20:16:17 1151 29

原创 【C语言&数据结构】完全二叉树上(堆的实现)

本文主要讲解了二叉树中的两种形式,其中顺序结构就可以用堆来实现

2025-11-19 17:16:25 1183 24

原创 【C语言&数据结构】队列

本文全面介绍了队列这一重要数据结构。队列遵循"先进先出"原则,核心操作包括入队、出队、判空等。文章详细讲解了链式队列(链表实现)和顺序队列(数组实现)的代码实现,包括结构定义、初始化及核心操作函数。并对两种实现方式进行了对比,指出顺序队列效率高但容量固定,链式队列灵活但需额外内存。最后列举了队列在任务调度、广度优先搜索、消息队列等场景的应用。掌握队列有助于理解各类顺序处理问题的解决方案。

2025-11-18 11:16:11 1164 29

原创 【数据结构】栈

本文介绍了计算机的存储体系(内存与硬盘的区别)以及CPU访问数据的机制,重点讲解了栈数据结构的概念与实现方式。栈遵循"后进先出"原则,可通过数组(顺序栈)或链表(链式栈)实现。顺序栈通过数组和栈顶指针实现高效操作,链式栈则利用链表头节点作为栈顶实现动态扩容。文章详细阐述了栈的初始化、入栈、出栈、判空等核心操作的具体代码实现,为理解和使用栈这一基础数据结构提供了完整指南。

2025-11-17 13:55:14 1223 33

原创 【数据结构】常见时间复杂度以及空间复杂度

本文介绍了算法复杂度的时间复杂度和空间复杂度概念。时间复杂度衡量算法运行速度,使用大O表示法分析函数的最高阶项;空间复杂度衡量算法额外占用空间,主要关注运行时申请的额外空间。通过多个代码示例分析了常见复杂度类型(常数阶O(1)、线性阶O(n)、平方阶O(n²)、对数阶O(logn)等),并对比了递归函数的复杂度计算方法。强调在实际编程中更关注时间复杂度,而空间复杂度在嵌入式领域更受重视。文章提供了使用clock函数测量运行时间的方法,并通过冒泡排序和数组反转案例说明空间复杂度的实际应用。

2025-11-16 16:03:39 1281 44

原创 【数据结构】双向链表的实现

首先定义双向链表的节点结构,这是实现所有操作的基础://定义双向链表节点的结构//数据域:存储节点数据//前驱指针:指向前一个节点//后驱指针:指向后一个节点}ListNode;

2025-11-04 18:06:34 1268 30

原创 【数据结构】单链表的实现

本文介绍了单链表的基本概念、结构组成和核心特性。单链表是一种线性数据结构,通过指针将节点串联成单向序列。文章详细讲解了单链表的节点结构(数据域和指针域)以及其动态性、单向性等特点。重点阐述了单链表的基本操作实现方法,包括初始化、头插/尾插、遍历、查找和删除等。通过代码示例展示了链表打印、尾插、头插和尾删等功能的实现过程,并配以火车类比帮助理解。文章为学习单链表数据结构提供了清晰的入门指导。

2025-11-03 16:37:29 1176 40

原创 【数据结构】用顺序表实现通讯录

本文用顺序表存储联系人数据,结合递归实现了通讯录的核心功能。顺序表适合存储线性结构数据,支持快速访问和动态扩容。递归通过 “终止条件 + 自身调用” 实现遍历 / 查询,代码简洁且适合嵌套结构。扩展方向增加文件存储功能(将联系人保存到本地文件)。实现分组联系人(用递归遍历嵌套分组)。优化查询效率(添加哈希表索引,快速定位联系人)。通过这个案例,我们不仅掌握了通讯录的实现,更理解了 “数据结构 + 算法思想(递归)” 如何协同解决实际问题。

2025-11-02 19:58:02 1449 26

原创 【数据结构】顺序表+回调函数

通过将顺序表操作与回调函数结合,我们实现了代码解耦、灵活扩展的目标。核心步骤是:定义函数指针类型 → 实现基础操作 → 通过函数指针调用操作。这种设计不仅让顺序表的代码结构更优雅,也为后续复杂功能的扩展(如日志、性能监控、自定义策略)打下了基础。掌握回调函数的思路,也能帮助你在其他数据结构(如链表、栈、队列)中写出更灵活的代码。

2025-10-27 22:47:30 1274 40

原创 【数据结构】顺序表的实现

核心就一个“挪”字边界检查是“保命符”下标别把‘1’和‘0’搞混。

2025-10-25 20:28:55 946 33

原创 【C语言】预处理详解

第一条:定义后:MAX = 1000第二条:#define reg register //为 register这个关键字,创建⼀个简短的名字定义后:reg = register第三条:;) //用更形象的符号来替换⼀种实现定义后:第四条:case //在写case语句的时候⾃动把 break写上。例如://如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加⼀个反斜杠(续行符)可以写成:关于第三条for(;;初始化部分,调整部分,判断部分都可以省略省略判断。

2025-10-22 20:19:49 1019 29

原创 【C语言】程序的编译和链接(基础向)

预处理阶段主要处理那些源文件中#开始的预编译指令。执行顺序:C代码 — 预处理 — 编译 — 汇编 — 链接 — 可执行程序。多个目标文件和链接库一起经过链接器处理生成最终的可执行程序。多个.C文件单独经过编译器,编译处理生成对应的目标文件。的任何一种实现中,存在两个不同的环境。Windows环境下的目标文件的后缀是。,Linux环境下目标文件的后缀是。时将汇编代码转变成技巧可执行的指令。根据记号,会生成下列的语法树。文件组成,下面是组成的原理。编译时,编译器会怎么做呢?,生成相应的汇编代码文件。

2025-10-20 21:17:17 1278 16

原创 【C语言】文件操作(附源码与图片)

上面说的适用于所有输入流一般只适用于标准输入流和其他输入流(如文件输入流);的作用是:当文件读取结束的时候,判断读取结束的元素是否是:遇到文件尾结束。:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否接受。根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)!我们要把一个文件拷贝给另一个文件,可以用到上面学过的知识。建立时,将文本里的数据拿出时,要用到fcanf来读取。返回文件指针相对于起始位置的偏移量。让文件指针的位置回到文件的起始位置。张三 20 66.0。张三 20 66.0。

2025-10-19 17:30:12 3275 37

原创 【C语言】自定义类型(附源码与图片分析)

位段的成员必须是int、unsigned、signed int,在C99中位段成员也可以是其他类型。位段的成员名后边有个冒号和一个数字。int a:5;int a:10;

2025-10-18 18:20:28 1354 26

原创 动态内存管理

前言。

2025-10-17 13:07:35 541 22

原创 指针和数组与字符串(附代码和图解)

编写一个C函数,将“I am from shanghai”倒置为“shanghai from am I”,即将句子中的单词位置倒置,而不改变单词内部结构。

2025-10-16 22:25:28 562 12

原创 指针基础概念(附有图片解释|超详细)

而用结构体传参,需要的空间很大,但如果时用指针传入结构体的地址,也才花8个字节,效率就会大大增高。在写代码中,我们会经常遇到野指针,我们接下来看一下什么是野指针,遇到野指针会出现什么问题。不同类型中,指针指向的类型也不同,这次我们看看char类型的指针是如何表示的。我们在函数中传入a、b的地址,通过指针来找到a、b的地址再进行修改。C语言中规定,不管变量占多少个字节,是取它最前面的地址。p指向的是整数,整数占4个字节,所有p+1加4个字节。q指向的是字符,字符占1个字节,所有q+1加1个字节。

2025-10-15 16:03:01 1160 14

原创 内存函数(附有图解)

这就是为什么**[[内存函数#错误示例:|前面代码]]**错误的原因。与memcpy形式一模一样。

2025-10-11 08:46:17 902 11

原创 字符串函数的模拟实现

思路:通过指针指向数组首地址,向右找到字符串末尾的\0,每走一次计数器+1。思路:先设定一个首元素地址,再利用末元素地址,然后相减。上面不同字符串追加成功了,那能不能追加自己。思路:由复杂到简单的思想。

2025-10-10 11:52:36 532 8

原创 字符函数和字符串函数(附代码与图示详解)

判断一个字符是否为字母、数字,还是大小写的互相转换,都以简洁的形式封装了底层ASCLL码逻辑命令行输入的合法性检验字符串处理中对特定字符的筛选数据格式化输出的大小写调整以上功能不仅简化了代码的编写,更规避了因直接操作ASCLL码可能导致的逻辑漏洞,时构建字符串逻辑的基础。本文将围绕常用字符函数的功能、实现原理及典型应用场景展开,带你吃透这些“小而美”的工具背后的设计逻辑与实用价值。回顾下下列表格,是不是其他的也会用啦!注意包含头文件***ctype.h***。iscntrl任何控制字符。

2025-10-09 12:45:13 6450 9

空空如也

空空如也

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

TA关注的人

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