自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】异常

本文系统介绍了C++异常处理机制,包括异常概念、抛出捕获流程、栈展开、匹配规则等核心内容。异常通过抛出对象实现问题检测与处理的解耦,相比C语言错误码更灵活。文中详细阐述了异常匹配的三种特例(权限缩小、数组/函数指针转换、派生类向基类转换),并展示了大型项目中基于继承的异常体系设计。同时探讨了异常安全、重新抛出、异常规范(noexcept)等进阶话题,指出析构函数中异常处理的注意事项。最后介绍了标准库异常体系,建议主函数捕获基类exception。通过多个代码示例(如SQL异常处理、消息重发机制等)生动展示了

2025-11-21 16:03:44 550

原创 【C++】智能指针

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存,一般是忘记释放或者发生异常释放程序未能执行导致的。内存泄漏并不是指内存在物理上的消失,而是应用程序分 配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:普通程序运行一会就结束了出现内存泄漏问题也不大,进程正常结束,页表的映射 关系解除,物理内存也可以释放。

2025-11-21 15:39:05 651

原创 【C++】10.用哈希表封装myunordered_map和myunordered_set

文章摘要:本文分析了SGI-STL30版本中非标准容器hash_map和hash_set的实现框架,其核心是基于哈希表的泛型设计。通过模板参数调整和仿函数机制,实现了unordered_map和unordered_set的模拟,重点包括:1)复用哈希表框架(处理键值类型差异);2)迭代器实现(支持++/--操作符重载);3)map的[]操作符支持(修改insert返回值);4)完整代码展示(包含红黑树底层实现和迭代器核心逻辑)。特别说明了STL30与C++11标准容器的区别,并详细阐述了红黑树迭代器中序遍历

2025-11-15 19:42:11 961

原创 【C++】9.哈希表实现

哈希是一种通过哈希函数将关键字映射到存储位置的数据组织方式。主要方法包括直接定址法(适用于关键字集中的情况)和哈希函数法(如除留余数法)。哈希冲突不可避免,解决方法分为开放定址法(线性探测、二次探测)和链地址法(拉链法)。负载因子(存储数据个数/哈希表大小)影响冲突概率和空间利用率。开放定址法需要状态标识处理删除问题,而链地址法通过链表解决冲突。实践中常采用除留余数法作为哈希函数,并需处理不同类型的关键字(如字符串转换为整数)。哈希表的扩容策略通常控制在负载因子0.7-1之间,链地址法可容忍更高负载因子。

2025-11-09 14:47:18 771

原创 【C++】unordered_map和unordered_set的使用

摘要:本文对比分析了C++中unordered_set与set、unordered_map与map的差异。首先介绍了unordered_set的模板参数,指出其底层采用哈希表实现,平均时间复杂度为O(1)。主要差异体现在:1) key要求不同,set需要支持比较,unordered_set需要支持转为整型和相等比较;2) 迭代器方面,set是双向迭代器且有序,unordered_set是单向迭代器且无序;3) 性能上unordered_set的增删查改通常更快。通过代码测试验证了unordered_set在

2025-11-08 17:45:38 800

原创 【C++】封装红黑树实现mymap和myset

本文分析了SGI-STL中map和set的实现框架,重点探讨了其基于红黑树的核心机制。通过源码分析发现,map和set通过泛型设计复用同一棵红黑树,其中set存储的是单个key值,而map存储的是pair<key,value>。文章详细解释了迭代器实现原理,包括中序遍历的++/--操作逻辑,并指出了源码中命名不一致的问题。同时提供了map和set的模拟实现方案:通过KeyOfT仿函数解决比较问题,修改模板参数限制key不可修改,实现迭代器支持中序遍历,并为map添加[]操作符支持。最后给出了完整

2025-11-06 10:33:24 673

原创 【C++】红黑树

红黑树是一种近似平衡的二叉搜索树,通过颜色约束规则确保最长路径不超过最短路径的2倍。其核心规则包括:根节点为黑色、红色节点的子节点必须为黑色、所有路径黑色节点数相同。插入操作分为三种情况处理:变色(当叔节点为红)、单旋+变色、双旋+变色。与AVL树相比,红黑树旋转次数更少,效率同为O(logN)。实现时需维护节点颜色和父子指针,通过规则检查确保树结构的正确性。验证时需检查四条规则是否满足,而非简单比较路径长度。

2025-10-18 10:35:53 854

原创 【C++】AVL树实现

AVL树是一种自平衡二叉搜索树,通过平衡因子(右子树高度-左子树高度)控制树的高度差不超过1。其核心操作包括插入时的平衡因子更新和四种旋转(左单旋、右单旋、左右双旋、右左双旋)来维持平衡。插入时需沿路径更新平衡因子,若出现不平衡(|BF|=2)则进行相应旋转,旋转后子树高度恢复且不影响上层结构。AVL树通过严格平衡保证O(logN)的查找效率,优于普通二叉搜索树。文中详细介绍了AVL树的结构定义、插入逻辑、旋转实现及平衡验证方法,展示了其维护平衡的具体机制。

2025-10-16 16:07:04 943 1

原创 【C++】map和set的使用

本文主要介绍了C++ STL中的关联式容器set和map,重点分析了它们的使用方法和特性。set是一种基于红黑树实现的有序集合,具有自动去重和排序功能,支持高效查找、插入和删除操作(O(logN))。map是键值对容器,同样基于红黑树实现,通过key快速查找value,支持[]运算符进行高效访问和修改。

2025-10-05 22:22:13 1197

原创 【C++】二叉搜索树

树的结构中(结点)除了需要存储key还要存储对应的value,增/删/查还是以key为关键字走二叉搜索树的规则进行比较,可以快速查找到key对应的value。key/value的搜索场景实现的二叉树搜索树支持修改,但是不支持修改key,修改key破坏搜索树性质了,可以修改value。那么这样的效率显然是无法满足我们需求的,我们后续课程需要继续讲解二叉搜索树的变形,平衡二叉搜索树AVL树和红黑树,才能适用于我们在内存中存储和搜索数据。如果支持插入相等的值,意味着有多个x存在,一般要求查找中序的第⼀个x。

2025-09-27 22:49:18 1026 1

原创 【C++】多态

文章摘要:多态是面向对象编程的重要特性,分为编译时多态(函数重载、模板)和运行时多态(虚函数重写)。实现运行时多态需要满足两个条件:基类指针/引用调用虚函数,且派生类完成虚函数重写(函数名、参数、返回值相同)。虚函数通过virtual声明,重写时建议显式添加virtual。协变、析构函数重写(防止内存泄漏)以及C++11的override/final关键字是多态的重要补充。多态使不同对象调用相同函数产生不同行为,提升了代码灵活性。

2025-09-27 10:30:07 993

原创 【C++】继承

本文系统介绍了面向对象编程中的继承机制。主要内容包括:1.继承的基本概念,通过Person、Student、Teacher类示例说明代码复用优势;2.继承访问权限控制,分析不同继承方式下成员访问规则;3.派生类默认成员函数的生成规则;4.多继承与菱形继承问题及虚继承解决方案;5.继承与组合的对比,强调优先使用组合的原则。文章详细阐述了继承体系中的关键概念如作用域隐藏、类型转换、静态成员处理等,并指出多继承可能导致的复杂性,为理解面向对象继承机制提供了全面指导。

2025-09-21 15:51:43 915

原创 【C++】stack和queue

本文介绍了STL中的三种容器适配器:stack、queue和priority_queue。首先详细说明了stack和queue的基本操作(如push、pop、top等)以及它们的模拟实现方式(stack基于vector/queue基于list)。然后重点讲解了priority_queue的特性,包括默认大堆结构、自定义类型比较重载要求以及其底层使用堆算法实现的原理。文章还深入探讨了容器适配器的概念,解释了deque作为stack和queue默认底层容器的原因,并分析了deque的优缺点。最后给出了stack

2025-09-17 16:41:22 659

原创 【C++】模板进阶

本文主要探讨C++模板编程中的两个关键概念:非类型模板参数和模板特化。非类型模板参数允许使用常量作为模板参数,但仅限于编译期可确定的整型常量。模板特化分为函数模板特化和类模板特化,用于处理特定类型的特殊情况。函数模板特化需要保持基础参数类型一致,而类模板特化包括全特化和偏特化两种形式。文章还分析了模板分离编译的问题及解决方案,指出将声明和定义放在同一文件中是最佳实践。最后总结了模板的优势(代码复用、灵活性)和缺陷(代码膨胀、编译错误不易定位)。

2025-09-17 11:59:41 766

原创 【C++】STL·List

本文介绍了C++ STL中list容器的使用与模拟实现。主要内容包括:1)list的基本用法,如构造、迭代器操作、容量查询、元素访问及修改操作;2)重点分析了list迭代器失效问题,指出删除操作会导致被删节点的迭代器失效;3)详细展示了list的模拟实现过程,包括节点结构、迭代器封装及核心接口实现;4)对比了vector和list的底层结构及特性差异,指出vector适合随机访问场景,而list更适合频繁插入删除的操作。文章通过代码示例深入解析了list的内部实现机制和使用注意事项。

2025-09-13 20:53:11 921

原创 【C++】vectore

v1.begin();//获取第一个数据位置的iterator/const_iterator,v1.end();// 获取最后一个数据的下一个位置的iterator / const_iterator//获取最后一个数据位置的reverse_iteratorv2.rend();//获取第一个数据前一个位置的reverse_iterator。

2025-09-05 23:27:58 940

原创 【C++】string

本文主要介绍了C++中的string类及其相关应用。首先对比了C语言字符串操作的局限性,指出string类更符合OOP思想且更安全。详细讲解了string类的常用接口,包括构造、容量操作、访问遍历、修改操作等。重点介绍了C++11引入的auto关键字和范围for循环的特性与使用场景。文章还深入探讨了string类的实现原理,比较了浅拷贝和深拷贝的区别,并给出了一个自定义string类的完整实现代码。最后简要介绍了C++中不同类型与string之间的转换方法。全文涵盖了string类的核心知识点,既有理论讲解

2025-08-30 17:28:55 927

原创 【C++】模板

泛型编程通过模板技术实现代码复用,解决函数重载的冗余问题。函数模板允许定义与类型无关的通用函数,编译器根据实参类型推导生成特定版本,支持隐式和显式实例化。类模板同理,可创建通用数据结构,如栈类支持多种数据类型。模板优先匹配专用函数,但可通过显式实例化强制使用模板。需要注意的是,模板声明和定义应在同一文件中以避免链接错误,且模板不支持自动类型转换。泛型编程提高了代码复用性和可维护性,是C++的重要特性。

2025-08-14 15:17:11 516

原创 【C++】内存管理

本文首先介绍了C/C++内存分布,包括栈、堆、内存映射段、数据段和代码段的特点。接着对比了C语言(malloc/calloc/realloc/free)和C++(new/delete)的动态内存管理方式,重点分析了new/delete在自定义类型中会调用构造/析构函数的特性。然后深入探讨了operator new/delete的实现原理,说明它们底层通过malloc/free工作但增加了异常处理机制。最后总结了malloc/free与new/delete的六点主要区别,包括初始化能力、类型安全、失败处理等方

2025-08-14 11:28:57 570

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

本文介绍了C++中类的几种特殊用法:1. 初始化列表的使用规则和要求,包括引用成员、const成员等必须使用初始化列表的情况;2. 类型转换机制,包括内置类型到类类型的隐式转换及explicit关键字的作用;3. static成员的定义和使用方式;4. 友元函数和友元类的概念及使用方法;5. 内部类的定义及特性;6. 匿名对象的创建和使用场景。这些特性扩展了类的功能,但部分特性如友元会降低封装性,需谨慎使用。

2025-08-13 22:43:05 783

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

默认成员函数就是用户没有显式实现,编译器会自动生的成员函数称为默认成员函数。赋值运算符重载是⼀个默认成员函数,用于完成两个已经存在的对象直接的拷贝赋值,这里要注意跟 拷贝构造区分,拷贝构造用于⼀个对象拷贝初始化给另一个要创建的对象。构造函数的本质是要替代以前Stack和Date类中写的Init函数的功能,构造函数自动调用的 特点就完美的替代的了Init。如果⼀个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。

2025-08-06 14:00:19 625

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

本文介绍了C++中类的定义与实例化的核心概念。类通过class关键字定义,包含成员变量(属性)和成员函数(方法),支持访问限定符(public/private/protected)控制访问权限。类定义了一个新的作用域,成员函数默认内联。实例化是类在内存中创建对象的过程,对象仅存储成员变量,成员函数存储在代码段。重点讲解了this指针的隐式传递机制,以及C++与C实现Stack的对比,展示了C++通过封装实现更安全的访问控制。文章还涉及结构体内存对齐规则和空类占位特性,为理解面向对象编程奠定了基础。

2025-08-01 17:12:49 861

原创 【C++】1·入门基础

本文介绍了C++编程基础中的关键概念,包括:1. 第一个C++程序与命名空间的作用,通过namespace解决命名冲突问题;2. 输入输出流对象cout/cin的使用方法;3. 缺省参数的分类和调用规则;4. 函数重载的实现条件及注意事项;5. 引用的概念、特性以及与指针的区别;6. 内联函数inline的作用和适用场景;7. nullptr对NULL指针的改进。文章通过代码示例演示了这些特性的实际应用,帮助理解C++作为C语言升级版的改进特性,包括类型安全、代码复用和效率优化等方面。

2025-07-31 16:40:35 672

原创 【数据结构】八大排序

本文系统介绍了常见排序算法及其实现。主要内容包括:1.排序概念与分类:将数据按关键字有序排列,分为比较排序和非比较排序两大类。2.比较排序算法:详细讲解了插入排序(直接插入、希尔)、选择排序(直接选择、堆排序)、交换排序(冒泡、快速排序)和归并排序的实现原理、代码实现及时间复杂度分析。3.非比较排序:重点介绍计数排序的原理与应用。4.性能比较:通过10万随机数据测试各算法耗时,快速排序和堆排序表现最优。5.稳定性分析:讨论各排序算法的稳定性特征。文章提供了完整的代码实现和复杂度分析,可作为排序算法的学习参考

2025-07-25 16:42:05 1112

原创 【数据结构】堆(下)+ 二叉树

本文主要讲解数据结构中树的相关应用与实现。第一部分介绍堆的应用,包括堆排序算法(向上/向下调整)和TOP-K问题的解决方案(通过小/大堆结构高效查找前K个元素)。第二部分详细讲解二叉树的操作实现,包括三种遍历方式(前序/中序/后序)、计算节点数/叶子节点数/K层节点数、求深度、查找节点、销毁树等递归实现方法。特别介绍了利用队列实现层序遍历和判断完全二叉树的算法。文章通过代码示例和递归分析,深入浅出地讲解了二叉树的各种操作实现原理。

2025-07-18 16:40:07 1048

原创 【数据结构】树(堆)·上

本文系统介绍了树形数据结构,重点阐述了二叉树及其应用。主要内容包括:1.树的基本概念与术语(根节点、子树、度、层次等),以及文件的树形存储结构;2.二叉树的定义、特点、特殊类型(满二叉树、完全二叉树)及其性质;3.二叉树的两种存储方式(顺序结构适合完全二叉树,链式结构分二叉链和三叉链);4.堆的概念与实现(小堆/大堆),包含插入、出堆、取堆顶等操作,以及基于堆的排序算法原理。文章通过层次分明的讲解,展现了树形结构在计算机科学中的基础地位和实际应用价值。

2025-07-14 15:57:35 1007

原创 【数据结构】队列

队列是一种遵循先进先出(FIFO)原则的线性数据结构,允许在队尾插入元素,在队头删除元素。队列的实现可以通过数组或链表,其中链表实现可以通过结构体嵌套优化入队操作至O(1)时间复杂度。队列的基本操作包括初始化、入队、出队、判空、取队头/队尾数据、销毁队列以及获取队列元素个数。在链表实现中,通过维护头尾指针,可以高效地执行这些操作。例如,入队时直接在队尾添加节点,出队时删除队头节点,并注意处理只有一个节点时的特殊情况。此外,队列的销毁需要逐个释放节点,并重置头尾指针。获取队列元素个数可以通过遍历链表或维护一个

2025-05-20 14:34:15 1034

原创 【数据结构】栈

栈的结构既可以用数组定义,也可以用链表定义。这里我采用的是数组,会更方便些。与顺序表不同的是,把size改成了top,因为栈的操作大多数在栈顶,所以记录top就行(其实与size效果一样)。

2025-05-13 10:31:18 481

原创 【数据结构】双链表

带头双向循环链表是一种特殊的链表结构,其特点是每个节点都有指向前一个节点和后一个节点的指针(prev和next),且链表头尾相连形成循环。链表的“头结点”实际上是一个哨兵位,不存储有效数据,仅用于简化操作。与单链表相比,双链表在插入和删除操作上更为高效,时间复杂度为O(1)。双链表的实现包括分配空间、初始化、尾插、头插、尾删、头删、查找和销毁等操作。初始化时推荐在函数内部直接创建新空间并返回指针。销毁链表时需注意接口一致性,并手动释放内存。

2025-05-12 18:40:24 515

原创 【数据结构】单链表

链表头部的插入删除O(1)链表尾部的插入删除O(n)链表无需扩容链表不存在空间浪费。

2025-05-07 15:38:14 507

原创 【数据结构】顺序表

注意:要使用传址调用。

2025-05-02 17:40:42 562

原创 【数据结构】 复杂度

通过上面我们会发现,有些算法的时间复杂度存在最好、平均和最坏情况。最坏情况:任意输入规模的最大运行次数(上界)平均情况:任意输入规模的期望运行次数最好情况:任意输入规模的最小运行次数(下界)大O的渐进表示法在实际中一般情况关注的是算法的上界,也就是最坏运行情况。

2025-05-01 09:53:54 802

原创 【C语言】动态内存管理

我们已经掌握的内存开辟方式有://在栈空间上开辟四个字节//在核空间上开辟10个字节的连续空间但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。C语言引入了动态内存开辟,让程序员自己可以申请和释放空间,就比较灵活了。

2025-03-16 10:56:02 579

原创 【C语言】内存函数

【代码】【C语言】内存函数。

2025-03-01 17:18:53 446

原创 【C语言】字符函数与字符串函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。

2025-03-01 16:15:56 595

原创 【零基础学习C语言】深入指针(3)

一 数组名的理解二 使用指针访问数组三 一维数组传参的本质四 冒泡排序五 二级指针六 指针数组七 指针数组模拟二维数组。

2025-01-27 09:31:48 779

原创 【零基础学习C语言】深入指针(2)

目录:1.const修饰指针2.野指针3.assert断言4.指针的使用和传址调用。

2025-01-24 09:40:19 654

原创 【零基础学习C语言】深入指针(1)

一 内存和地址二 指针变量和地址三 指针变量类型的意义四 指针运算。

2025-01-22 09:33:19 940

原创 【零基础学C语言】(3) C语言数据类型和变量

​一数据类型内置类型1.整型类型(整数):(1、2、3、4.......)2.浮点型类型(小数):(0.2、1.2、1.0.....)floatweight=30.1;//默认double类型floatweight=30.1f;//加f变为float类型3.字符型:('a'、'A')4.布尔类型:(变量的取值:true(1)或false(0))5.数据类型长度(1字节=8bit)可用printf("%zd",sizeo(数据类型));计

2025-01-17 17:02:44 1793

原创 【C语言】· 扫雷小游戏

扫雷》是微软开发并发行的一款,于1992年发行。《扫雷》中玩家的目标是在最短时间内识别出所有非雷区的格子,同时避免触碰到地雷。游戏区域由多个隐藏格子组成,每个格子可能隐藏着地雷或数字,数字表示周围八个格子中地雷的数量。玩家通过点击格子揭示内容,使用逻辑推理逐步排除雷区。游戏考验玩家的观察力和推理能力,任何一次误点地雷都会导致游戏失败。原版扫雷需要很多知识,目前能力只能用代替网格,代替鼠标的方式仿作一款。

2025-01-15 14:21:29 894

空空如也

空空如也

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

TA关注的人

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