自定义博客皮肤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++:AVL树的概念和实现__详细讲解__附有解读图片__最后面有完整代码(AVL的概念,AVL树的结构, AVL树的插⼊,平衡因⼦更新,四种旋转,AVL树的查找,AVL树平衡检测)

本文详细介绍了AVL树(自平衡二叉查找树)的实现原理与操作。AVL树通过控制左右子树高度差不超过1来保持平衡,其核心概念包括平衡因子(右子树高度减左子树高度)和四种旋转操作(左单旋、右单旋、左右双旋、右左双旋)。文章具体阐述了AVL树的结构定义、插入过程(包括平衡因子更新规则)、各种旋转操作的触发条件和实现代码,并提供了完整的AVL树类实现,包含插入、查找、平衡检测等功能。通过测试用例验证了实现的正确性,AVL树能有效将增删查改操作的时间复杂度控制在O(logN)。

2025-09-12 19:57:10 1102

原创 C++:set和map__笔试易错题(set和map的概念、set和map的底层结构、set和map的区别、map和multimap的区别、重载运算符[ ] 的相关题目)

本文摘要: map存储键值对,set仅存储key,两者查询时间复杂度均为O(log₂N),但只有map重载了[]运算符(C错误)。 map的key/value类型可相同(B正确),其底层为红黑树,默认升序但可自定义排序,key不可直接修改。 set可去重(B正确),支持存储对象(需自定义比较规则),默认升序基于小于比较,也可存储键值对。 set元素不可直接修改(A正确),map(C++98)与unordered_map(C++11)不同,multimap未重载[]运算符。 (摘要字数:149字)

2025-09-04 12:10:36 729

原创 C++:set和map的OJ题__详细讲解附有参考代码(两个数组的交集、环形链表 II、随机链表的复制、前K个高频单词、单词识别)

本文分享了5道与STL容器相关的算法题目及其解法:1. 两数组交集问题:使用set去重后双指针遍历;2. 环形链表检测:用set存储遍历过的节点;3. 随机链表深拷贝:借助map建立原链表与拷贝链表的映射;4. 前K个高频单词:map统计词频后stable_sort稳定排序;5. 单词识别统计:类似第4题,处理输入后统计词频并排序。这些解法都利用了STL容器的特性,如set的去重、map的键值映射等,结合排序算法高效解决问题。

2025-09-04 11:40:11 844

原创 C++:set和map的介绍和使用方法__详细讲解并附有示例代码(序列式容器和关联式容器,set和map的构造和迭代器、增删查、构造,multiset和set的差异,multimap和map的差异)

STL容器主要分为序列式容器和关联式容器。序列式容器(如vector、list)存储线性序列数据,元素间无紧密关联;关联式容器(如map、set)采用非线性结构,元素间存在关联关系,底层通常用红黑树实现,提供O(logN)的查找效率。set用于纯key搜索场景,map用于key-value映射。set支持插入、删除和查找操作,迭代器遍历按key有序;map额外提供operator[]实现高效查找与修改。multiset和multimap允许键值冗余,操作上与set/map类似但需处理重复元素。map的ope

2025-08-30 10:02:36 598

原创 C++:二叉树进阶算法OJ题__详细讲解附有参考代码(根据二叉树创建字符串、二叉树的最近公共祖先、将二叉搜索树转化为排序的双向链表、从前序与中序遍历序列构造二叉树、二叉树的前序&中序&后序非递归遍历)

本文总结了7道二叉树相关算法题的解题思路和参考答案,涵盖字符串转换、公共祖先查找、双向链表转换、树构建和遍历等常见操作。主要内容包括:1. 根据前序遍历规则将二叉树转换为带括号的字符串;2. 寻找二叉树中两个节点的最近公共祖先的两种解法(子树判断和路径记录);3. 将二叉搜索树转换为排序双向循环链表;4. 根据前序和中序遍历序列重建二叉树;5-7. 分别实现二叉树前序、中序和后序遍历的非递归算法。这些解法都利用了递归或借助栈/队列来模拟递归过程,时间复杂度多为O(n)。

2025-08-28 10:53:05 942

原创 C++:二叉搜索树__详细讲解__附有完整代码(⼆叉搜索树的概念、⼆叉搜索树的性能分析、⼆叉搜索树模拟实现的完整代码、⼆叉搜索树key和key/value使⽤场景)

二叉搜索树是一种有序二叉树,具有左子树值≤根节点≤右子树值的特性。其基本操作包括插入、查找和删除:插入时根据大小关系寻找合适位置;查找沿着树结构比较值;删除需处理四种不同情况(无子节点、单子节点、双子节点)。二叉搜索树的时间复杂度在最优情况下为O(logN),最差为O(N)。此外,文章还介绍了key/value结构的应用场景,如字典翻译和单词统计,并提供了C++实现代码。最后指出二叉搜索树的局限性,引出需要学习更高效的平衡二叉搜索树(如AVL树和红黑树)。

2025-08-26 11:16:19 738

原创 C++:多态__笔试易错题(虚函数的默认参数、虚函数表指针、虚函数的题目、多态概念的题目、区分重载&重写&隐藏的题目、抽象类和纯虚函数的题目、虚函数表和虚函数表指针的题目)

本文摘要: 本文系统讲解了C++虚函数相关的核心知识点,包括虚函数表、多态实现原理、重载/重写/隐藏的区别、抽象类等内容。通过20道典型题目,深入剖析了虚函数默认参数、虚表指针存储、多态调用机制等易错点。重点分析了派生类虚函数参数缺省值问题、私有虚函数调用可行性、构造函数中的多态行为等难点。同时对比了重载、重写和重定义三者的区别,并详细解释了抽象类和纯虚函数的使用场景。文章采用题目+解析的形式,帮助读者掌握虚函数实现多态的核心机制及常见应用场景。

2025-08-24 19:05:25 2055

原创 C++:多态__(多态的定义及实现、虚函数、纯虚函数和抽象类、虚函数表指针、 动态绑定与静态绑定、多态的原理、 override 和 final 关键字、重载/重写/隐藏的对⽐)

本文系统介绍了C++多态的概念与实现原理。主要内容包括:1)多态分为编译时多态(函数重载)和运行时多态(虚函数机制);2)实现运行时多态需要满足两个条件:基类指针/引用调用虚函数,且派生类完成虚函数重写;3)详细讲解了虚函数表机制,说明多态通过运行时查找虚函数表实现动态绑定;4)介绍了协变、析构函数重写、override/final关键字等进阶内容;5)阐述了纯虚函数和抽象类的特性。文章通过大量代码示例,深入浅出地解析了多态的实现原理,包括虚函数表的结构、动态绑定过程等底层机制,并对比了重载、重写和隐藏的异

2025-08-24 11:04:01 1905

原创 C++:继承__易错点__附带详细讲解(隐藏规则中的坑、继承中需要深拷贝时,子类中构造函数的实现方式、实现一个不能被继承的类、多继承中指针偏移问题、继承概念和定义的题目、继承方式的题目、继承权限的题)

摘要:本文系统讲解了C++继承中的关键知识点,包括隐藏规则(父子类同名函数构成隐藏而非重载)、深拷贝实现(子类构造函数需显式调用父类构造)、不可继承类实现(C++98私有构造/C++11 final关键字)、多继承指针偏移问题(切片规则)、继承权限(struct默认public继承)以及构造/析构顺序(先父后子构造,先子后父析构)。通过典型例题解析揭示了继承中的易错点,如默认构造调用条件、同名隐藏机制等,并提供了变式练习强化理解。文中特别强调继承与组合的应用场景区分,以及派生类对象模型的内存布局特点。

2025-08-22 16:59:22 1047

原创 C++:继承__详细讲解并附有实例代码(概念和定义、多继承及其菱形继承问题、继承和组合、基类和派生类间的转换、继承中的作用域、派生类的默认成员函数)

本文系统介绍了C++中的继承机制,包括继承的概念、定义和访问方式变化。重点分析了基类与派生类的转换规则、作用域隐藏问题、派生类默认成员函数生成规则。同时探讨了继承与友元、静态成员的关系,详细讲解了多继承及其菱形继承问题,提出虚继承解决方案。最后对比了继承(is-a)和组合(has-a)的适用场景,建议优先使用组合以降低耦合度。文章全面覆盖了C++继承的关键知识点,包括模板类继承和IO库中的菱形虚拟继承等特殊案例。

2025-08-22 11:20:10 829

原创 C++:仿函数部分的补充、模版进阶(非类型模版参数、模板的特化、模板的分离编译)

本文探讨了C++中的仿函数和模板进阶应用。在仿函数部分,通过日期类示例展示了如何通过自定义仿函数解决指针比较问题,指出标准库仿函数在类类型不支持比较或不符合需求时需自定义实现。模板进阶部分介绍了非类型模板参数的限制(仅支持整型家族)、模板特化(包括函数模板特化和类模板的全/偏特化),以及分离编译的解决方案(推荐声明定义同文件)。最后总结了模板的优点(代码复用、灵活性)和缺陷(代码膨胀、编译错误难定位)。全文通过具体代码示例阐述了这些高级特性的应用场景和注意事项。

2025-08-20 16:06:50 600

原创 C++:堆排序算法的简单讲解,仿函数的介绍和应用,优先级队列priority_queue的常用接口和模拟实现

本文主要介绍了堆排序算法、仿函数和优先级队列的原理与实现。堆排序通过向上/向下调整算法将数组构建为大堆或小堆,时间复杂度为O(n*logn)。仿函数通过重载operator()实现类似函数的行为,用于模板类和模板函数中。优先级队列基于堆结构实现,支持插入元素和获取最大/最小元素操作,默认使用vector作为底层容器,通过仿函数控制排序方式。文中提供了完整的代码实现,包括堆排序的AdjustUp/AdjustDown算法、仿函数模板类以及优先级队列的push/pop等操作。

2025-08-19 11:48:30 859

原创 C++:双端列表deque的介绍和特点、栈stack和队列queue的常用接口用法和模拟实现

本文介绍了双端队列(deque)及其在栈(stack)和队列(queue)中的应用。deque是一种支持两端高效插入删除的动态容器,结合了vector和list的优点:既支持随机访问,又具有不连续存储结构。相比vector,deque头插效率更高;相比list,deque访问速度更快。文章详细对比了三种容器的优缺点,并指出deque适合作为栈和队列的底层容器。最后,作者演示了如何使用deque模拟实现栈和队列,包括常用接口的实现方法。这种实现方式体现了标准库中stack和queue默认使用deque作为底层

2025-08-18 15:36:45 1055

原创 C++:栈和队列OJ题__附带详细思路和注释(最小栈 ,栈的压入、弹出序列 ,二叉树的层序遍历)

本文介绍了三个与栈和队列相关的算法题解:1. 最小栈(LeetCode 155):通过维护两个栈(普通栈和最小栈),实现在O(1)时间内获取栈中最小元素。2. 栈的压入弹出序列(牛客网):通过模拟入栈出栈过程,判断给定弹出序列是否合法。3. 二叉树的层序遍历(LeetCode 102):利用队列实现二叉树的层次遍历,按层存储节点值。每个问题都提供了详细解题思路和C++实现代码,涵盖栈的基本操作、出入栈序列验证以及树的广度优先遍历等典型算法应用场景。

2025-08-17 10:54:15 2248

原创 C++:list容器的模拟实现

摘要:本文实现了一个C++双向链表模板类list,包含节点结构list_node和迭代器list_iterator。主要功能包括:1)基础结构搭建;2)构造函数和析构函数;3)插入删除操作(push_back/front,pop_back/front);4)迭代器实现(普通/const迭代器);5)拷贝构造和赋值重载;6)初始化列表构造;7)辅助函数(大小判断、交换、打印等)。通过模板参数合并普通和const迭代器,使用哨兵节点简化操作,提供了完整的链表操作接口。

2025-08-16 16:02:14 470

原创 C++:list常用接口的使用方法

本文介绍了C++中list容器的常用操作,主要包括:1)四种构造函数(默认构造、填充构造、区间构造和拷贝构造);2)两种遍历方式(迭代器和范围for循环);3)插入删除操作(push/pop和insert/erase);4)分配函数assign的使用;5)拼接函数splice的三种用法;6)移除函数remove按值删除元素;7)合并函数merge将有序列表合并;8)排序函数sort支持默认升序和自定义降序排序。这些操作展示了list作为双向链表容器的主要功能特性。

2025-08-15 11:13:11 1027

原创 C++:vector的OJ题②

本文摘要: 本文包含三个算法题目及参考答案: 删除有序数组中的重复项:使用双指针原地修改数组,返回唯一元素个数,时间复杂度O(n)。 数组中出现次数超过一半的数字:通过排序后取中间值实现,满足O(n)时间复杂度和O(1)空间复杂度要求。 电话号码的字母组合:采用回溯算法递归生成所有可能的字母组合,处理数字2-9的按键映射问题。 每个题目都包含详细描述、输入输出示例和可直接运行的C++实现代码,涵盖了数组处理、排序算法和回溯算法等常见编程面试考点。

2025-08-14 09:47:23 966

原创 C++:vector的OJ题①

本文介绍了三个算法题目及其解决方案:1. 杨辉三角:通过动态规划生成前n行杨辉三角,每行首尾为1,中间数为上一行相邻两数之和;2. 只出现一次的数字II:使用位运算统计每位出现次数,取模3后得到唯一出现一次的数字;3. 只出现一次的数字III:通过异或操作分组,找出两个只出现一次的数字。所有解法均满足线性时间复杂度和常数空间要求。

2025-08-13 18:03:20 866

原创 C++:模拟实现vector的补充和优化(后附完整的模拟实现代码)

还可以将其写成可以打印任何容器的函数。

2025-08-13 11:23:26 343

原创 C++:模拟实现vector

本文实现了一个简化版vector容器类模板,包含核心功能:1.基础框架搭建,使用三个指针管理内存;2.构造函数和析构函数实现;3.提供size()和capacity()接口;4.实现reserve扩容机制,注意迭代器失效问题;5.push_back尾插操作,考虑容量不足时自动扩容;6.迭代器相关功能,包括普通和const版本;7.重载[]运算符实现随机访问;8.pop_back尾删和empty判断;9.insert插入方法,处理扩容时的迭代器失效问题。重点强调了内存管理、迭代器失效等关键实现细节,为自定义容

2025-08-12 16:38:00 320

原创 C++中的vector容器

本文介绍了C++中vector容器的基本操作,包括构造与赋值方法(默认构造、填充构造、范围构造、拷贝构造)、三种遍历方式(下标、迭代器、范围for循环),以及常用成员函数:reserve()用于扩容不影响元素,resize()调整容器大小并初始化新元素,push_back()尾插元素,insert()在指定位置插入元素(支持单元素、填充和范围插入),erase()删除指定位置的元素(支持单元素和范围删除)。这些操作展示了vector的动态数组特性及其灵活的内存管理能力。

2025-08-12 10:24:34 1101

原创 C++:模拟实现string类“拷贝构造和赋值构造”的传统写法和现代写法

本文对比了C++拷贝构造和赋值构造的传统与现代实现方式。传统写法需要手动管理内存分配和拷贝,而现代写法利用中间变量和swap函数简化操作。拷贝构造的传统实现直接分配新内存并复制数据,现代版本则通过创建临时对象进行交换。赋值构造的传统方法同样需要深拷贝处理,现代版本则通过参数传递和swap实现高效交换。现代写法的优势在于代码更简洁、可维护性更强,同时避免了手动内存管理的潜在错误。两种写法都保证了深拷贝的正确性,防止同一内存被多次释放。

2025-08-11 09:42:47 260

原创 C++:string类OJ题③(字符串相乘)

摘要: LeetCode题目"字符串相乘"要求不使用内置大整数库,实现两个字符串形式非负整数的乘法运算。解法采用模拟竖式计算方式:1) 处理乘数为0的情况直接返回"0";2) 初始化结果字符串为m+n位'0';3) 双重循环逐位相乘,处理进位并累加到对应位置;4) 处理进位溢出;5) 去除前导零后返回结果。时间复杂度O(m*n),空间复杂度O(m+n)。关键点在于正确处理每一位的乘积和进位,以及结果字符串的动态维护。

2025-08-10 15:49:09 244

原创 C++:string类OJ题 ②(​反转字符串​、字符串最后一个单词的长度、验证回文串、反转字符串 II、反转字符串中的单词 III)

本文总结了5个字符串处理算法题解:1.反转字符串-双指针原地交换字符;2.字符串最后一个单词长度-从末尾找空格计算;3.验证回文串-过滤非字母数字后双指针比较;4.反转字符串II-每2k字符反转前k个;5.反转单词III-定位空格逐个反转单词。所有解法均满足题目要求的空间复杂度,采用双指针或字符串查找等高效方法实现。

2025-08-09 21:34:35 885

原创 C++中的 string 类 【合集】(构造函数、容量操作、访问及遍历操作、修改操作、模拟实现string类)

String(字符串)是编程中用于表示文本数据的基本数据类型,由一系列字符组成。在大多数编程语言中,字符串是不可变的(immutable),即创建后不能直接修改其内容,任何操作都会生成新的字符串对象。String通常支持索引访问、切片、拼接等操作,广泛用于文本处理、数据存储、用户输入输出等场景。本文将以网站为参考资料对string的使用进行讲解。本文所有的运行结果都是在 Visual Studio 2022 的环境下运行。kw=string。

2025-08-09 08:47:30 1175

原创 C++中的 string 类 Ⅳ(模拟实现string类)

本文详细介绍了自定义string类的实现过程,主要包含以下核心功能:1) 构造函数、拷贝构造和赋值运算符的实现,采用深拷贝避免内存问题;2) 字符串查找(find)和截取(substr)功能的实现;3) 比较运算符(>, >=, <, <=, ==, !=)的重载;4) 流提取(<<)和流插入(>>)运算符的重载。代码通过namespace my封装,实现了字符串的基本操作、容量管理、迭代器支持等特性,并提供了完整的测试用例验证各功能的正确性。该实现展示了C+

2025-08-08 20:42:54 333

原创 C++中的 string 类 Ⅲ (模拟实现string类)

本文实现了一个简易的string类,主要包括:1)构造函数和析构函数管理内存;2)实现c_str()、size()等基础接口;3)重载[]运算符和实现迭代器;4)支持尾插操作的reserve、push_back等方法;5)实现插入insert和删除erase功能。通过分步测试验证了字符串操作的正确性,包括字符修改、迭代器遍历、扩容插入和删除等操作。该实现模仿了标准string类的基本功能,为理解字符串底层实现提供了参考。

2025-08-08 10:54:24 221

原创 C++中的string类 Ⅱ(修改操作)

摘要:本文介绍了C++ string类常用的字符串修改操作方法,包括:1)push_back在字符串末尾添加字符;2)append追加字符串;3)operator+=综合追加功能;4)c_str返回C风格字符串;5)find和rfind查找字符位置;6)substr截取子串。重点讲解了各方法的语法格式和使用场景,并通过实例演示了如何替换字符串中的空格和提取文件后缀名等操作。其中,operator+=、c_str和find+npos是重点内容,需重点掌握。

2025-08-06 10:19:51 785

原创 C++:string类OJ题 ①(寻找第一个唯一字符、字符串相加)

本文解析了两道力扣字符串算法题:1.找出字符串中第一个不重复字符的索引,通过两种解法对比,最优解使用频次统计数组实现O(n)时间复杂度;2.实现大数字符串相加,模拟竖式计算,处理进位并优化代码逻辑。两道题均给出详细思路、代码实现及复杂度分析,重点讲解了从暴力解法到高效解法的优化过程,以及大数相加的进位处理技巧。

2025-07-27 16:51:49 1071

原创 C++中的string类Ⅰ(构造函数、容量操作、访问及遍历操作)

String(字符串)是编程中用于表示文本数据的基本数据类型,由一系列字符组成。在大多数编程语言中,字符串是不可变的(immutable),即创建后不能直接修改其内容,任何操作都会生成新的字符串对象。String通常支持索引访问、切片、拼接等操作,广泛用于文本处理、数据存储、用户输入输出等场景。本文将以网站为参考资料对string的使用进行讲解。本文所有的运行结果都是在 Visual Studio 2022 的环境下运行。kw=string1.string的构造函。

2025-07-27 10:24:19 1052

原创 C++11中auto与范围for的妙用

关键词关键词在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期自动推导而得。用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&,当在同一行声明多个变量时,这些变量必须是相同的类型。

2025-07-26 16:39:23 317

空空如也

空空如也

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

TA关注的人

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