自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉搜索树的实现与应用详解

本文系统介绍了二叉搜索树(BST)的实现与应用。首先阐述了BST的基本概念和性质:左子树节点值均小于根节点,右子树节点值均大于根节点。重点讲解了BST的三大核心操作实现:查找、插入和删除,包括代码实现和不同情况的处理逻辑(如删除节点时的直接删除和替换法)。其次分析了BST的两种应用模型:K模型(纯键值存储)和KV模型(键值对存储),并提供了完整代码实现。最后讨论了BST的性能特点,指出在平衡情况下操作时间复杂度为O(logn),但在最坏情况下会退化为O(n),为后续介绍AVL树和红黑树等平衡二叉搜索树做铺垫

2025-08-20 11:35:09 344

原创 深入理解C++多态原理

本文系统介绍了C++多态的核心概念与实现机制。主要内容包括:1)多态的定义与构成条件,通过基类指针/引用调用虚函数时产生不同行为;2)虚函数的重写规则与两个特例(协变和析构函数重写);3)C++11的override和final关键字;4)抽象类与纯虚函数的接口继承特性;5)多态的实现原理(虚函数表机制);6)单继承与多继承下的虚表结构;7)动态绑定与静态绑定的区别。文章还解答了多态相关的常见面试问题,如虚函数表生成时机、虚析构函数必要性等,全面剖析了C++多态从语法到底层实现的全貌。

2025-08-19 21:09:50 599

原创 深入理解C++继承机制

本文系统介绍了C++中的继承机制。主要内容包括:继承的基本概念和定义,基类与派生类的对象赋值转换规则,继承中的作用域问题,派生类默认成员函数的生成规则,继承与友元、静态成员的关系。重点分析了复杂的菱形继承及其带来的数据冗余和二义性问题,提出了通过虚拟继承(使用虚基表和虚基表指针)的解决方案。最后总结了继承与组合的区别,建议优先使用组合降低耦合度,仅在需要表达"is-a"关系或实现多态时使用继承。文章还提供了相关笔试面试题的解答要点。

2025-08-19 14:49:50 734

原创 深入浅出C++模板编程(进阶)

本文主要介绍了C++模板编程中的关键概念和技术要点。首先阐述了非类型模板参数的使用限制(如浮点数、类对象等原本不能作为参数,但C++20有所放宽)。其次详细讲解了模板特化的两种形式:函数模板特化(必须完全特化)和类模板特化(包括全特化和偏特化),并通过日期比较的实例说明了特化的实际应用。然后分析了模板分离编译导致链接错误的原因,提出了将声明定义合并在头文件中的解决方案。最后总结了模板的优点(代码复用、灵活性)和缺点(代码膨胀、错误信息难读)。全文通过丰富代码示例,系统性地介绍了模板技术的核心知识点。

2025-08-19 08:00:00 542

原创 深入解析C++ STL中的容器适配器(含模拟实现)

本文介绍了C++标准库中三种容器适配器:stack、queue和priority_queue的实现原理及使用方式。stack基于后进先出(LIFO)原则,默认使用deque作为底层容器;queue遵循先进先出(FIFO)原则,同样默认采用deque;priority_queue则是基于堆结构实现,默认使用vector作为底层容器。文章详细分析了各适配器的接口设计,包括push、pop、top等核心操作,并比较了不同底层容器的优缺点。重点讲解了priority_queue的仿函数机制和自定义排序规则实现方法,

2025-08-18 16:51:26 749

原创 深入理解C++中的list容器(含模拟实现)

本文介绍了C++中list容器的特性、使用方法和底层实现原理。list是一种基于双向循环链表的序列容器,具有高效的任意位置插入/删除能力,但不支持随机访问。文章详细讲解了list的构造方式、迭代器使用、元素访问及修改操作,并重点分析了迭代器失效问题。通过模拟实现list的核心功能,包括节点结构、迭代器封装和基本操作(如push_back、insert、erase等),揭示了带头双向循环链表的设计优势。最后对比了list与vector的特性差异:list适合频繁插入删除的场景,而vector更适合随机访问操作

2025-08-18 10:35:42 596

原创 C++ vector类操作全解析(含模拟实现)

本文详细介绍了C++标准库中的vector容器及其模拟实现。主要内容包括:1. vector的基本特性:动态数组、连续存储、自动扩容机制(不同编译器采用1.5倍或2倍增长策略);2. vector的基本操作:构造方法(默认构造、拷贝构造等)、迭代器使用(正向/反向迭代器)、空间管理(resize/reserve);3. 增删查改操作:push_back/pop_back、insert/erase、find等,特别强调了迭代器失效问题;4. vector的模拟实现:框架设计(三个指针维护)、关键接口实现(re

2025-08-17 11:39:08 1107

原创 C++ string类操作全解析(含模拟实现)

本文介绍了C++中string类的重要性及其实现原理。首先对比了C语言字符串操作的不足:需手动管理内存、不符合面向对象思想。string类提供了更安全便捷的字符串操作,包括构造、容量管理、访问修改等接口。重点剖析了string类的模拟实现:1)深拷贝解决浅拷贝问题;2)现代写法通过swap优化赋值效率;3)详细实现了reserve、push_back、append等核心功能;4)介绍了写时拷贝机制。文章还对比了传统与现代实现方式的优劣,为理解和自定义字符串类提供了完整的技术路径。

2025-08-16 15:48:41 684

原创 深入浅出C++模板编程(初阶)

本文介绍了C++中的泛型编程与模板技术。主要内容包括:1)函数模板的概念与实现,通过模板可以避免函数重载带来的代码冗余;2)函数模板的原理是编译器根据实参类型生成特定版本函数;3)模板实例化的两种方式(隐式和显式)及参数匹配原则;4)类模板的定义格式和使用方法,类模板需要通过指定类型参数进行实例化。文章通过交换函数和动态顺序表示例,展示了模板在提高代码复用性和可维护性方面的优势。

2025-08-16 09:38:27 620

原创 深入解析C/C++内存管理与动态分配

本文系统介绍了C/C++中的内存管理和动态内存分配机制。首先分析了C/C++程序内存区域划分(栈、堆、数据段、代码段等),然后详细讲解了C语言的动态内存管理函数(malloc/calloc/realloc/free)及其区别。重点阐述了C++的new/delete操作符,包括其与malloc/free的关键区别:new/delete会自动调用构造函数/析构函数。文章还深入探讨了operator new/delete的实现原理,定位new表达式的作用,以及常见的内存泄漏问题。最后通过对比表格总结了malloc

2025-08-15 20:36:29 1063

原创 C++类与对象核心知识点全解析(下)

本文深入探讨了C++面向对象编程中的关键概念。首先分析了构造函数的初始化列表与构造函数体的区别,强调初始化列表的重要性。接着讲解了static成员的特性及其应用场景,包括实现对象计数功能。文章还详细介绍了友元机制(友元函数和友元类)以及内部类的定义和使用规则。此外,还探讨了匿名对象的应用、编译器对拷贝构造的优化策略,最后从计算机认识实体的角度重新阐释了封装的意义。这些核心概念对于深入理解C++面向对象编程至关重要。

2025-08-15 18:29:51 947 1

原创 C++类与对象核心知识点全解析(中)【六大默认成员函数详解】

C++类中的6个默认成员函数包括:构造函数、析构函数、拷贝构造函数、赋值运算符重载、取地址运算符重载和const取地址运算符重载。构造函数负责对象初始化,可重载,若无显式定义则生成默认无参构造函数。析构函数负责资源清理,自动调用,需手动释放动态分配的资源。拷贝构造函数实现对象复制,默认浅拷贝,资源管理需自定义深拷贝。赋值运算符重载支持对象赋值,默认浅赋值,资源管理需自定义。const成员函数修饰this指针保证不修改对象状态。

2025-08-14 20:36:55 882

原创 C++类与对象核心知识点全解析(上)

本文介绍了C++面向对象编程的核心概念,重点讲解了类与对象的基础知识。文章首先对比了C语言面向过程和C++面向对象的区别,详细说明了类的定义方式、访问限定符(public/private)、封装特性、类作用域和实例化过程。在内存模型方面,分析了类对象大小的计算规则和内存对齐原则,指出成员变量决定对象大小,成员函数存储在代码段。最后深入解析了this指针的工作原理,包括其作为隐藏参数的传递机制、特性和使用注意事项,并通过实例分析了this指针为空时的不同行为表现。这些内容构成了C++面向对象编程的基础知识体系

2025-08-14 11:14:22 530

原创 C->C++核心过渡语法精讲与实战

本文介绍了C++对C语言的扩展与优化,重点讲解以下核心特性:1. 命名空间解决了全局作用域中的命名冲突问题,支持嵌套定义和三种使用方式(作用域限定符、using引入部分成员、using namespace引入全部成员);2. C++输入输出使用iostream库,通过cout/cin和流运算符实现类型自适应的IO操作;3. 缺省参数支持全缺省和半缺省(必须右起连续),提高了函数灵活性;4. 函数重载通过参数类型/数量/顺序区分同名函数,其底层实现依赖编译器对函数名的修饰规则;5. 引用作为变量别名,必须初始

2025-08-13 21:00:55 1176

原创 七大排序算法全解析:从入门到精通

本文系统介绍了排序算法概念与实现。排序是将记录按关键字大小排列的操作,分为内部排序(内存中)和外部排序(数据过大)。算法特性包括时间复杂度、空间复杂度和稳定性(相同元素相对位置不变)。重点分析了插入排序(直接插入O(n²)稳定、希尔排序O(n^1.3)不稳定)、选择排序(直接选择O(n²)不稳定、堆排序O(nlogn)不稳定)、交换排序(冒泡O(n²)稳定、快速排序O(nlogn)不稳定)以及归并排序(O(nlogn)稳定)。特别对快速排序的三种实现(挖坑法、左右指针法、前后指针法)和非递归实现进行详解,并

2025-08-13 11:39:17 1278 1

原创 深入解析二叉树(包含堆结构)数据结构

树是一种非线性数据结构,由节点组成层次关系集合,具有根节点、子树、节点度等概念。二叉树是特殊的树结构,每个节点最多有两个子节点,分为满二叉树和完全二叉树。二叉树可以通过顺序存储(数组)或链式存储(链表)实现。堆是一种特殊的完全二叉树,分为大根堆和小根堆,支持插入、删除等操作,时间复杂度为O(logn)。二叉树的遍历包括前序、中序、后序和层序遍历,其中层序遍历需要借助队列实现。

2025-08-12 19:35:09 996

原创 深入解析栈与队列:数据结构基础

本文介绍了栈和队列两种数据结构的基本概念及实现方式。栈是遵循后进先出(LIFO)原则的线性表,支持在栈顶进行压栈和出栈操作,通常使用数组实现更优。队列则是遵循先进先出(FIFO)原则的线性表,在队尾入队、队头出队,采用链表实现效率更高。文中提供了两种数据结构的具体C++模板类实现代码,包含基本操作如push、pop、empty等,并详细说明了各自的特点和适用场景。栈的实现利用了动态数组扩容机制,而队列则采用链表节点连接方式实现。

2025-08-12 16:19:20 159

原创 链表的知识总结以及模拟实现

本文介绍了链表的基本概念、分类及实现方法。链表是一种非连续、非顺序的物理存储结构,通过指针实现数据元素的逻辑顺序。文中重点分析了链表的三种分类方式(单向/双向、带头/不带头、循环/非循环),并详细讲解了无头单向非循环链表和带头双向循环链表的实际应用场景。文章还以C++为例,展示了链表的实现过程,包括节点结构定义、链表类的基本操作(尾插尾删、头插头删、查找、指定位置插入删除等)。最后对比了顺序表与链表的区别,突出了链表在动态内存管理方面的优势。

2025-08-12 16:00:28 272

原创 顺序表的总结及模拟实现

摘要:本文介绍了线性表和顺序表的基本概念及实现。线性表是n个相同特性数据元素的有限序列,逻辑上线性连续,物理上可离散存储。顺序表采用连续存储单元实现,分静态和动态两种。文章重点使用C++模拟实现动态顺序表,包括初始化、扩容检查、头尾插删、查找修改等功能接口,并分析了顺序表的优缺点:支持高效随机访问(O(1))但插入删除需移动元素(O(N)),扩容可能造成空间浪费。顺序表适合频繁查询场景,其连续存储特性也使其具有较高的存储密度和缓存友好性。

2025-08-12 12:08:08 948

原创 类和对象(下)

四.友元。

2024-06-16 16:59:16 1099

原创 类和对象(中)

讨论: 关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??

2024-06-16 16:53:34 1018

原创 类和对象(上)

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。

2024-06-11 21:09:01 1144 1

原创 c++入门必备基础

不能作为函数的参数。

2024-06-11 21:03:22 1006

原创 栈和队列的实现

1.头文件代码实现:2.各接口函数函数的实现:(1):初始化和销毁

2024-05-13 18:57:31 242 1

原创 关于“旋转字符串”的两种解题方法

前面的1,2,3,4也倒置成4,3,2,1.这样就变成了4,3,2,1,7,6,5.再将整体倒置,我们发现,就变成了5,6,7,1,2,3,4,这不就是我们想要的结果吗?这里有两种代码实现,共同思路都是后三个元素:5,6,7放到临时数组变量的前三个,再将前面的1,2,3,4,5放到后面,要注意k的值可能比数组元素个数大,所以我们要求出实际要旋转的个数,即k=k-(k/n)*n。

2024-04-26 20:30:00 240 2

原创 双向带头循环链表的接口函数实现

/指定位置之后插入。void LTNInsertAfter(LTNode* pos, DataType x)//指定位置之后插入。void LTNPushFront(LTNode* phead, DataType x)//头插。void LTNPushBack(LTNode* phead, DataType x)//尾插。LTNode* LTNFInd(LTNode* phead, DataType x)//查找。void LTNInit(LTNode** phead)//初始化,创建头结点。

2024-04-15 17:19:14 709

原创 单链表接口函数的实现(增删查改)

void SLTInsert(SLTNODE** phead, SLTNODE* pos, DataType x)//待定位置之前的插入。void SLTErase(SLTNODE** phead, SLTNODE* pos)//删除待定节点。void SLTPushFront(SLTNODE** phead, DataType x)//头插。SLTNODE* SLTFind(SLTNODE* phead, DataType x)//查找。

2024-04-15 16:54:53 876 1

原创 动态顺序表的接口函数的实现(增删查改)

动态顺序表就是要讲究容量足够用,即每次存储的个数达到了容量大小时,顺序表都能将容量扩大,而size就代表着存储个数的大小,capacity代表顺序表的容量大小,当两者相等时,我们给出一个新的容量newcapacity,给其赋为原来容量的2倍,如果原容量为0,那就赋为4,此操作通过三目运算符实现。关于插入数据,首先要想到ps->size是已经存储到的个数,同时也是我们要新插入数据的下标,其次还要考虑到我们插入数据后,是否会超出容量,所以需要对是否需要扩容进行判断。3.顺序表的检查扩容。8.顺序表的随机插入。

2024-04-05 19:37:47 336 1

原创 【字符串左旋右旋不会做?快来看看这篇“弹幕滚动”,你就有思路了!】

不知道大家在做题时有没有遇到过“字符串旋转”的题目,很多人可能没有思路,这里我不具体讲解单一的题目,而是展现一个“弹幕滚动”的示例,相信大家看懂后就能做出“字符串旋转”的题了!2.另创变量cnt,打头元素靠他变,末尾元素照不误int i;for (i = 0;i < len;i++)else。

2024-03-02 21:17:22 502 4

原创 【利用clock函数操纵时间,以及让程序暂停运行】

不知道大家有没有注意到,很多时候我们在运行代码时内容会直接显示出来,但有时候我们又想让某段内容延迟出现,以达到想要的效果,并且还有些时候我们想将某段代码运行所用的时间记录显示出来,这都要用到clock函数。

2024-02-26 22:15:00 544 1

原创 迭代、递归、尾递归实现斐波那契数列的第n项

相加。

2024-02-25 20:57:09 483

原创 三种方法用c语言求最大公约数以及最小公倍数

掌握求最大公约数(最小公倍数)的三种基本方法。

2024-02-25 19:55:36 1581

原创 c语言数组和函数实践:扫雷游戏(初阶)

• 使⽤控制台实现经典的扫雷游戏• 游戏可以通过菜单实现继续玩或者退出游戏• 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷• 可以排查雷 ◦ 如果位置不是雷,就显⽰周围有⼏个雷 ◦ 如果位置是雷,就炸死游戏结束 ◦ 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束 说到9*9的扫雷,首先浮入脑海的一定是一个9*9规格的棋盘,我们在这个棋盘上每排查一个坐标,如果是雷就结束游戏,不是雷的话就显示此坐标周围有几个雷。如图: 但是你有没有想过,计算机是如何得知周围有几个雷的呢?只靠在我们眼前的棋盘

2023-12-13 21:40:51 2301

原创 数组练习之:二分查找法

巧妙的二分查找法

2023-12-09 20:10:02 768 2

原创 数组练习之:字符跳动显现字符

他可以清除之前显示的内容,让你的屏幕始终只显示一行慢慢变换的结果,更能体现出过程的变化性。诚然,只靠上述的代码就足以实现开头的效果图了,但它分明是不够完美的,你会发现,程序显示结果的速度太快了,以至于一次性就在屏幕上显示出了所有的流程,观赏度不行,我们想要每一步的程序显示得慢一些,以体现字符是从两端向中间“跳动”的过程,可以利用。那是因为你只看到了我这篇代码要显示的字符串,为了保证代码的通用性(可以显示不同长度的字符串),我们就不规定数组的大小,毕竟我们不知道你每一次想要显示的字符串有多少个字符嘛。

2023-12-05 17:09:45 926

原创 全面总结c语言中的循环结构

c语言有三种循环语句,分别是while,for和do while。

2023-12-03 11:20:08 562 1

原创 全面总结c语言中的分支结构

1. if语句2. switch语句。

2023-12-03 10:55:40 1043 1

原创 【综合运用分支与循环结构、函数调用以及数组来完成猜数游戏(2)】

嗨嗨,虽然是不同的时间,但是在同一个地点,我码达拉又来了奥。CSDN。

2023-12-02 13:09:55 2764

原创 综合运用分支与循环结构、函数调用以及数组来完成猜数游戏(1)编写前要掌握的知识

1.已经学完标题内容的初学者们,如果你们迫不及待地想要巩固自己学到的这些知识,相信猜数游戏定能满足一二。2.我们先来设想一下,我们玩猜数游戏的时候,电脑会给定一个目标数让我们猜,我们通过键盘输入一个数,如果这个数大于目标数,就提示偏大,小于目标数就提示偏小,由此我们初步写出如下代码。这是我们初步的蓝图,但很显然,这个“游戏”的答案我们是知道的,这样肯定是不行的,所以我们需要设定一个随机数充当目标数字。这个时候就要用到srand和rand函数了。

2023-11-30 22:40:35 559

原创 【关于[C]报错:Run-Time Check Failure #2 - Stack around the variable ‘xxx‘ was corrupted的示例及解决办法】

发生此报错一般有两种情况:第一 -> 数组下标越界。这也是最常见的问题原因,解决办法是检查数组是否有越界情况,如果有的话创建一个更大的数组第二->声明时未规定数组大小。第三->编译器本身的问题。(在前两种情况不适用时考虑编译器问题。

2023-11-28 22:32:50 13699 4

空空如也

空空如也

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

TA关注的人

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