C++ Develop
文章平均质量分 96
zhangcoder
KEEP CODING! 文章的配套资料 http://zhangcoder.ysepan.com/
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CD81.【C++ Dev】判断二叉搜索树是否是红黑树
介绍如何通过前序遍历构建二叉搜索树,并验证其是否为红黑树的方法。首先通过LeetCode 1008题练习构建二叉搜索树,使用单调栈算法处理前序序列中的递增和递减关系。随后针对PAT 1135题,在构建二叉搜索树的基础上,重点实现红黑树的四个性质验证:根节点黑色、无连续红节点、所有路径黑节点数量相同等。文中详细分析了算法思路,包括递归验证黑节点数的实现,并提供了完整的C++代码实现和提交结果。该解决方案适用于处理输入的前序遍历序列,能够高效判断给定的二叉搜索树是否符合红黑树性质。原创 2025-10-15 07:45:00 · 1398 阅读 · 0 评论 -
CD80.【C++ Dev】模拟实现红黑树的插入
本文主要介绍了红黑树的插入操作实现。首先回顾了红黑树的性质,包括根节点和空节点为黑色、无连续红节点、每条路径黑节点数相同等。然后对比了AVL树和红黑树的特性差异,指出红黑树通过牺牲部分平衡性换取更好性能。重点讲解了插入节点的三种情况处理:1)当uncle节点为红色时进行变色处理;2)当uncle节点为黑色或不存在时进行旋转操作;3)详细分析了各种旋转情况下的抽象图例。最后给出了红黑树插入操作的代码实现框架,包括节点结构、插入函数和测试方法。文章强调红黑树通过颜色标记和旋转操作来维持平衡,相比AVL树具有更好原创 2025-10-11 08:00:00 · 680 阅读 · 0 评论 -
CD78.【C++ Dev】以AVL项目的bug讲讲调试技巧
介绍AVL树实现中遇到的空指针访问错误及其调试过程。项目源代码包含AVLTree.h和main.cpp,在插入数据时出现RotateLight函数空指针异常。通过调用堆栈回溯、监视窗口查看变量和设计辅助函数is_balance()等方法定位问题。重点展示了如何使用条件断点、内联汇编和__debugbreak()进行调试,最终发现旋转操作后平衡因子未正确更新的问题。文中还提供了LeetCode平衡二叉树问题的解法,并给出了完整的调试代码和修复方案。原创 2025-09-23 07:45:00 · 1477 阅读 · 0 评论 -
CD77.【C++ Dev】AVL的模拟实现(2) 继续编写插入函数
本文系统讲解了AVL树的旋转操作实现,重点分析了右单旋和双旋的处理方法。主要内容包括:1)右单旋的四种情况分类及代码逐步改进过程;2)引入双旋的原因,详细阐述RL型情况的处理,包括先右旋再左旋的步骤、平衡因子更新的三种情况分类;3)LR型情况的分析及代码实现;4)提供测试代码验证实现正确性。文章采用从简单到复杂的分析方法,通过图示和代码示例,完整呈现了AVL树旋转操作的实现逻辑。原创 2025-09-09 08:15:00 · 604 阅读 · 0 评论 -
CD77.【C++ Dev】AVL的模拟实现(1) 以左单旋为切口,分析旋转规律
深入讲解了AVL树的模拟实现,重点分析了插入操作中的左单旋调整策略。文章首先回顾了AVL树的基本概念,介绍了三叉链节点结构设计,包含父节点指针和平衡因子。然后详细阐述了插入节点的过程,包括平衡因子更新规则和6种变化情况的示意图。核心部分重点剖析了当平衡因子从1变为2时所需的左单旋操作,从简单情况逐步推导出通用规律,并给出RotateLeft函数的具体实现代码,考虑各种边界情况。最后总结了平衡因子更新策略:当新增节点导致平衡因子变为0时停止更新;变为±1时继续向上调整;变为±2时进行旋转调整。文章还推荐了原创 2025-09-07 16:40:59 · 644 阅读 · 0 评论 -
CD76.【C++ Dev】异常
探讨C++异常处理机制及其优缺点。首先对比C语言的错误处理方式,指出其层层返回错误信息的繁琐性,进而介绍C++的异常处理机制,包括throw、catch的使用及异常匹配原则。通过实例演示了异常的抛出、捕获及栈展开过程,并介绍了服务器开发中常用的异常继承体系。还分析了C++标准库的异常体系,包括exception类及其派生类。最后总结了异常的优缺点:优点包括清晰展示错误信息、便于处理构造函数等无返回值情况;缺点涉及执行流跳转、内存泄漏风险、性能开销等,并提出了使用RAII、重新抛出异常原创 2025-09-03 09:17:35 · 765 阅读 · 0 评论 -
CD75.【C++ Dev】map和set练习题2(两个数组的交集、找出两数组的不同、前K个高频单词)
介绍三种解决数组和字符串相关问题的算法:1. 两个数组的交集:使用set去重排序后,通过双指针遍历查找交集元素。2. 两数组的差集:类似交集算法,修改判断条件找出各自独有的元素。3. 前K个高频单词:先用map统计词频,再通过vector排序处理,注意处理相同频率时的字典序要求,提供了stable_sort和修改比较函数两种解决方案。三种方法都充分利用了STL容器的特性,实现了高效的问题求解。原创 2025-09-01 08:50:25 · 1091 阅读 · 0 评论 -
CD72【C++ Dev】二叉树的三种非递归遍历方式
总结了二叉树三种非递归遍历的实现方法:前序、中序和后序遍历。 前序遍历:通过栈保存左路节点,访问后处理右子树。访问顺序为根-左-右,代码使用双重循环实现。 中序遍历:类似前序,但访问节点时机改为从栈弹出时(左子树已处理完)。访问顺序为左-根-右。 后序遍历:需要区分首次/二次访问节点。提出三种方法: 利用内存填充字节标记访问状态(依赖64位架构) 使用prev变量记录前驱节点判断访问状态 使用辅助标记栈记录节点访问状态 三种遍历都通过栈管理节点访问顺序,时间复杂度O(n)。后序实现最复杂,需特殊处理节点原创 2025-08-29 20:46:34 · 726 阅读 · 0 评论 -
CD73.【C++ Dev】map和set
讲解C++中set和map的使用方法。对于set,介绍了其底层红黑树实现导致的深拷贝问题,以及三种删除节点方法的对比,推荐直接使用erase(val)方法。对于map,详细说明了pair的结构和四种插入方法,推荐使用make_pair或C++11的多参构造。重点分析了operator[]的实现原理,它通过insert实现插入和修改功能,可能导致意外插入默认构造值。文章通过代码示例和反汇编验证了这些特性,并指出使用operator[]时可能产生的不必要插入问题。原创 2025-08-26 13:11:21 · 598 阅读 · 0 评论 -
CD71.【C++ Dev】二叉树练习题3 (从前序与中序遍历序列构造二叉树、从中序与后序遍历序列构造二叉树)
介绍如何利用前序/中序和后序/中序遍历序列构造二叉树。通过分析前序确定根节点、中序确定左右子树区间的特点,给出了相应的递归算法实现。对于后序/中序情况,则后序确定根节点、中序确定子树区间,需注意递归顺序应为先右后左。两种方法的时间复杂度均为O(n),空间复杂度为O(n)。代码实现中都使用了索引标记当前处理的元素位置,并通过递归方式构建完整二叉树。原创 2025-08-23 09:12:07 · 1102 阅读 · 0 评论 -
CD70.【C++ Dev】二叉树练习题3 (二叉搜索树与双向链表)
摘要:本文介绍了将二叉搜索树转换为排序双向链表的两种方法。方法1通过新建双向链表,使用中序遍历将节点按序插入,需注意处理哨兵节点。方法2直接在原树上操作,利用中序遍历修改节点指针,使用prev指针记录前驱节点,最终返回链表头节点。两种方法均满足空间复杂度O(1)和时间复杂度O(n)的要求,其中方法2更符合题目要求,无需创建新节点。原创 2025-08-22 08:49:01 · 724 阅读 · 0 评论 -
CD69.【C++ Dev】二叉树练习题2 (二叉树和二叉搜索树的最近公共祖先)
探讨二叉搜索树和普通二叉树中寻找最近公共祖先(LCA)的两种方法。对于二叉搜索树,利用其有序特性,通过路径比较法找到LCA;对于普通二叉树,提出两种解法:1)使用前序遍历存储路径后比较;2)递归判断节点位置关系。两种方法均通过LeetCode测试,其中递归法更简洁高效。关键点在于处理节点分布在不同子树或同一子树的情况,以及正确返回递归结果。代码实现展示了如何将链表相交思想应用于树结构问题求解。原创 2025-08-16 10:46:14 · 1151 阅读 · 0 评论 -
CD68.【C++ Dev】二叉树练习题1 (从离散数学的命题来理解根据二叉树创建字符串题)
探讨如何根据二叉树前序遍历生成带括号的字符串表示。通过分析括号生成逻辑,发现需要处理四种情况:左右子树都存在、仅左子树存在、仅右子树存在、都不存在。初始方案采用四个if判断,但存在冗余。利用离散数学中的命题逻辑,将条件简化为两个关键判断:当左或右子树存在时添加左括号,仅当右子树存在时添加右括号。最终方案代码简洁高效,成功通过测试用例,验证了逻辑推导的正确性。该解法展示了如何将数学思维应用于算法优化,提升代码可读性和执行效率。原创 2025-08-15 11:03:20 · 905 阅读 · 0 评论 -
CD67.【C++ Dev】模拟实现二叉搜索树的递归版本
介绍二叉搜索树(BST)的递归实现方法,包括查找、插入、删除等核心操作。重点讲解了递归实现时如何通过指针引用简化操作,避免显式查找父节点。详细分析了递归删除时的三种情况处理,并指出常见错误。此外还涉及析构函数、拷贝构造函数、赋值运算符重载的实现技巧,以及二叉搜索树在key搜索模型和key-value匹配模型中的应用。文章通过测试代码验证各功能的正确性,为理解和实现递归版二叉搜索树提供了完整指导。原创 2025-08-14 09:09:05 · 847 阅读 · 0 评论 -
CD66.【C++ Dev】模拟实现二叉搜索树的非递归版本
介绍二叉搜索树\的基本操作实现,重点关注查找和删除节点的算法。主要内容包括:1. 查找节点:通过比较节点值沿树遍历;2. 删除节点的三种情况处理:无子树、单子树和双子树;3. 双子树删除时使用左子树最大值替换法;4. 处理各种特殊情况的实现细节;5. 提供了LintCode上的删除节点编程题解。文章通过代码示例和图示详细讲解了BST操作的实现逻辑,特别是删除节点时的边界条件处理,并给出了完整的测试验证过程。原创 2025-08-12 08:48:36 · 1017 阅读 · 0 评论 -
CD65.【C++ Dev】多态(4): 抽象类和多态面试题
讲解C++抽象类和虚函数相关概念。首先介绍抽象类的定义,即包含纯虚函数的类,通过=0语法强制子类重写函数。然后分析抽象类的性质:不能实例化,子类必须重写纯虚函数才能实例化。对比纯虚函数与override关键字的强制重写机制。最后解答了9个常见面试题,涵盖多态实现、虚函数特性(内联/静态/构造/析构)、访问效率、虚函数表存储位置、菱形继承问题等关键技术点,其中特别强调了虚析构函数的必要性以避免内存泄漏。原创 2025-08-11 08:36:08 · 893 阅读 · 0 评论 -
CD64.【C++ Dev】多态(3): 反汇编剖析单继承下的虚函数表
VS调试分析C++虚函数表的实现机制。主要内容包括:1)配置VS项目关闭安全检查和调试优化;2)在Debug+x86模式下编译包含虚函数的继承示例代码;3)通过反汇编详细分析构造函数初始化虚表指针的过程、多态调用的底层实现(通过ecx传递this指针,edx存储虚表指针)以及析构函数的调用顺序;4)总结关键点:编译期间确定虚表地址、构造/析构函数的调用顺序、多态调用的寄存器使用约定。文章结合汇编指令和内存变化,深入解析了C++虚函数机制的底层实现原理。原创 2025-08-10 08:46:48 · 822 阅读 · 0 评论 -
CD63.【C++ Dev】多态(2): 剖析虚函数表的前置知识
探讨C++虚函数表的实现机制,分析了子类虚表在父类虚表基础上的生成过程,验证了子类赋值给父类对象时虚表不会拷贝的特性。通过VS2022、DevC++和Linux环境的对比实验,展示了不同编译器下虚表格式的差异。文章详细介绍了三种定位虚表存储位置的方法(IDA分析、进程映射检查和地址比较),证明虚表通常存储在只读数据段。最后通过手动操作虚函数表调用虚函数的练习,演示了突破语法限制直接调用虚函数的技术。原创 2025-08-09 10:11:59 · 1039 阅读 · 0 评论 -
CD59.【C++ Dev】继承(3) 菱形继承、菱形虚拟继承和虚基表的反汇编分析
探讨了C++中的继承方式,重点分析了菱形继承带来的数据冗余和二义性问题。通过代码示例展示了普通多继承的缺陷,并介绍了虚拟继承的解决方案。详细解析了虚基表(vbtable)的工作原理,包括偏移量存储方式和内存布局。通过反汇编代码分析,验证了虚继承如何通过偏移量访问公共基类成员,既解决了二义性问题又避免了数据冗余。最后比较了虚拟继承与传统继承在内存占用和访问效率上的差异,指出虚继承通过存储偏移量的方式实现了更高效的继承结构。原创 2025-08-02 10:01:14 · 830 阅读 · 0 评论 -
CD61.【C++ Dev】多态(1)
本文深入探讨C++多态的实现原理与应用。主要内容包括:1.通过virtual关键字实现虚函数重写,满足函数名、返回值、参数列表相同的"三同"条件;2.多态调用的核心条件:必须通过基类指针/引用调用虚函数;3.特殊重写场景:协变(返回值可为父子类指针/引用)和析构函数重写(编译器统一处理为destructor);4.new/delete时的多态行为,强调虚析构函数防止内存泄漏的重要性;5.C++11的override和final关键字用法。通过会员购票等实例,解析了多态与普通调用的本质区别原创 2025-08-07 08:47:08 · 683 阅读 · 0 评论 -
CD60.【C++ Dev】继承(4) 继承和组合
本文主要探讨了C++中继承与组合的区别及应用场景。首先通过两道继承练习题,分析了多继承下的内存布局和菱形虚拟继承的构造函数调用顺序。接着对比了继承(is-a)和组合(has-a)两种代码复用方式,指出继承是白箱复用,会破坏封装性且耦合度高;组合是黑箱复用,通过对象接口实现低耦合。最后建议在开发中优先使用组合以降低耦合度,但在必须使用多态等场景下仍需使用继承。文章还提供了相关论文和博客作为拓展资料,帮助读者深入理解面向对象设计中代码复用的最佳实践。原创 2025-08-06 15:02:12 · 1054 阅读 · 0 评论 -
CD58.【C++ Dev】继承(2)
讨论了C++继承中的几个关键问题:1. 作用域问题:子类和父类可以定义同名成员(变量和函数),子类成员会隐藏父类同名成员,但可通过类域访问父类成员;2. 子类默认成员函数的实现规则:构造函数必须调用父类构造函数,拷贝构造和运算符重载需显式调用父类对应函数,析构函数会自动调用父类析构且遵循"先子后父"的顺序;3. 友元和静态成员特性:友元关系不继承,静态成员在继承体系中保持唯一实例。这些知识点对理解C++继承机制至关重要。原创 2025-07-31 09:20:25 · 853 阅读 · 0 评论 -
CD57.【C++ Dev】继承(1)
介绍了C++继承的基本概念与应用,通过学工管理系统的例子展示如何提取公共属性(如姓名、年龄)到父类person,学生和教职工类通过public继承复用这些属性。重点讲解了继承的三种方式(public/protected/private)及其访问权限规则,强调实际开发中常用public继承。此外,解释了父类与子类对象的赋值转换(切片机制),指出父类指针/引用可指向子类对象中继承的部分,并对比了直接赋值与引用的区别。最后通过代码示例验证了继承后成员变量的访问与修改逻辑。原创 2025-07-29 09:31:20 · 632 阅读 · 0 评论 -
CD56.【C++ Dev】模版的分离编译
【模板类声明与定义分离问题总结】 当模板类的声明与定义分离时,会导致链接错误。原因在于模板需要实例化才能生成具体代码,而分离编译时编译器无法看到完整的模板定义。解决方法有两种: 显式实例化:在定义文件中针对特定类型进行实例化,但会引入冗余代码; 合并声明和定义:将实现代码直接放在头文件(.h或.hpp)中,这是STL采用的标准做法。对于非模板类,声明和定义分离则不会产生此问题。原创 2025-07-27 09:26:51 · 677 阅读 · 0 评论 -
CD55.【C++ Dev】非类型的模版参数以及模版的特化
本文介绍了C++模板中的非类型模板参数和模板特化。非类型模板参数在模板中视为常量,C++20前只能使用整型参数。模板特化分为全特化和偏特化:类模板支持两种特化方式,而函数模板仅支持全特化。文章通过Less函数模板和日期类示例,展示了如何通过特化处理指针类型比较。最后通过优先级队列案例,演示了如何为Date*类型特化Less函数模板,实现对日期指针的正确排序。原创 2025-07-23 09:21:42 · 925 阅读 · 0 评论 -
CD54.【C++ Dev】vector和list的反向迭代器的实现
C++反向迭代器的实现原理与应用。首先分析了反向迭代器的功能,通过比较两种实现方法:独立编写反向迭代器类(存在代码冗余)和封装正向迭代器(STL采用的方式),重点讲解了后者。文章详细解析了operator返回--tmp的原因,指出这是一种错位访问策略。然后给出了统一的反向迭代器模板实现,并演示了如何将其应用于自定义vector和list容器。最后通过洛谷B2089数组逆序重存放题目,验证了反向迭代器的实际应用效果,测试代码均通过了在线评测系统。全文通过具体代码示例展示了反向迭代器的对称性特点和实现原创 2025-07-17 08:23:22 · 714 阅读 · 0 评论 -
CD51.【C++ Dev】优先级队列priority_queue(含数组中的第K个最大元素)
总结了四种解决数组中第K个最大元素问题的方法:1)直接排序后取第K个元素;2)建立大顶堆并删除前K-1个元素;3)建立小顶堆并维护前K大元素;4)根据K值大小灵活选择堆类型。其中方法1时间复杂度为O(nlogn),方法2-4均为O(n)。重点分析了堆方法的使用技巧,包括priority_queue的初始化方式、大小堆选择策略,以及时间复杂度计算。文章还强调了STL中priority_queue的注意事项,如缺少迭代器、默认大顶堆等特性。原创 2025-07-14 19:27:25 · 720 阅读 · 0 评论 -
CD49.【C++ Dev】容器适配器模式(含typename的用法)
介绍容器适配器模式及其在STL栈和队列中的应用。主要内容包括:1)容器适配器概念,通过复用其他容器实现功能转换;2)用同一模板类实现数组栈(基于vector)和链式栈(基于list);3)两种方法用vector实现队列,方法1强制适配但效率低,方法2使用deque适配更高效;4)讨论了带容器适配器的迭代器写法,需使用typename声明依赖类型。文章通过LeetCode题目验证了实现方案,对比了不同容器的性能差异。原创 2025-07-13 20:13:18 · 945 阅读 · 0 评论 -
CD48.【C++ Dev】栈和队列练习题(栈的压入弹出序列、二叉树的层序遍历(正序和逆序))
讨论如何判断给定弹出序列是否为某栈压入序列的可能弹出顺序。通过模拟栈操作,使用双指针分别遍历压入序列和弹出序列。当栈顶元素匹配弹出序列时出栈,否则继续压入元素。若最终两个序列都遍历完且栈为空,则返回true;若压入序列已遍历完但栈顶元素不匹配当前弹出元素,则返回false。时间复杂度O(n),空间复杂度O(n)。示例验证了[1,2,3,4,5]与[4,5,3,2,1]匹配,而[4,3,5,1,2]不匹配的情况。原创 2025-07-12 21:48:08 · 899 阅读 · 0 评论 -
CD47.【C++ Dev】list的模拟实现(2)
介绍C++中list容器的模拟实现,主要包含以下内容: 迭代器实现 通过模板参数区分const和非const迭代器 实现++/--/*/->等运算符重载 采用哨兵节点简化边界处理 核心功能实现 插入/删除操作(insert/erase) 头尾操作(push/pop_front/back) 容量操作(size/clear) 特殊成员函数 拷贝构造/赋值运算符的现代写法 析构函数的内存管理 实际应用 在LeetCode链表题中测试实现 验证各成员函数的正确性 实现中注意了深拷贝、迭代器失效等常见原创 2025-07-09 14:36:08 · 1107 阅读 · 0 评论 -
CD46.【C++ Dev】list的模拟实现(1)
介绍C++ STL库中list容器的模拟实现部分过程。首先分析了STL库中list的双向链表结构,包括节点结构体和空链表构造函数的实现。接着展示了自定义list类的框架搭建,重点讲解了哨兵位节点的构造和尾插操作的实现。文章着重探讨了list迭代器的设计,解释了迭代器作为封装类的必要性,详细说明了迭代器的构造函数、++/--运算符重载、解引用操作符以及比较运算符的实现方法。最后讨论了const迭代器的设计考量,指出需要区分迭代器本身的可修改性和迭代内容的可修改性。原创 2025-07-08 11:14:30 · 1185 阅读 · 0 评论 -
CD45.【C++ Dev】STL库的list的使用和迭代器的分类
介绍C++中list容器的使用方法与特性。主要内容包括:1.list底层为双向链表结构,支持高效插入、删除操作;2.不同构造方式(空构造、初始化、拷贝构造)及头插尾插操作;3.迭代器注意事项(不支持随机访问,存在失效问题);4.专用函数(排序、归并、去重、链表转移);5.迭代器分类(正向、双向、随机访问等)。特别指出vector排序效率高于list,并通过代码示例验证。最后简要说明5种迭代器类型及其特点。原创 2025-06-19 18:52:24 · 1114 阅读 · 0 评论 -
CD44.【C++ Dev】vector模拟实现(3)
vector模拟实现中的几个关键问题:1. erase迭代器失效问题及正确实现方法,指出erase后原迭代器可能失效;2. pop_back的实现方式及注意事项;3. resize函数处理内置与自定义类型的差异;4. 解决深拷贝问题,特别是自定义类型元素时的内存管理;5. 补充了fill和range两种构造函数实现;6. 分析了STL源码中构造函数的有趣设计。通过测试用例验证了各功能的正确性,并针对不同类型元素(内置/自定义)的处理提出了解决方案。文章还讨论了如何避免模板匹配冲突,以及使用ex原创 2025-06-14 15:03:44 · 731 阅读 · 0 评论 -
CD43.【C++ Dev】vector模拟实现(2)
vector类实现中的三个关键问题:1. 拷贝构造函数的深拷贝实现,包括两种写法及调试过程中发现的问题与解决方案;2. operator[]运算符重载的实现,特别强调了对const和非const版本的区分;3. insert操作中的迭代器失效问题及其解决方法。文章通过具体代码示例和调试分析,详细说明了扩容时迭代器失效的原因,并给出了STL标准解决方案——返回更新后的迭代器位置。测试代码验证了各功能的正确性,为vector模拟实现提供了重要参考。原创 2025-06-04 15:40:25 · 1001 阅读 · 0 评论 -
CD42.【C++ Dev】vector模拟实现(1)
基于SGISTL的vector模拟实现过程,主要包括框架搭建和核心功能实现。文章首先回顾了vector相关知识,对比了SGISTL中vector的结构设计,重点分析了start、finish、end_of_storage三个关键迭代器成员的作用。接着详细讲解了构造函数、capacity/size计算、迭代器获取、reserve扩容、push_back插入等核心功能的实现方法,特别处理了空vector和扩容两种情况。通过内置类型int和自定义类型string的测试用例验证了实现的正确性原创 2025-05-28 16:01:29 · 776 阅读 · 0 评论 -
CD41.【C++ Dev】补充vector细碎的知识点
补充C++中vector知识点:1. vector初始化方式,包括使用迭代器范围和数组指针;2. 对比vector<char>与string,说明string的专业性;3. sort函数的升序/降序排序方法,演示反向迭代器和greater的用法;4. 强调reserve与resize的区别;5. 介绍data()成员函数访问底层数组;6. 二维vector的两种访问方式,包括operator[]重载和data()指针操作原创 2025-05-26 09:54:35 · 894 阅读 · 0 评论 -
CD40.【C++ Dev】string类的模拟实现(4)(operator=、拷贝构造函数的现代写法、写时拷贝的简单了解)
本文探讨了C++中operator=和拷贝构造函数的现代写法,并分析了错误写法的原因。传统operator=写法涉及深拷贝,现代写法则通过临时对象和swap函数实现更简洁的代码。错误写法会导致死循环调用,引发栈溢出。拷贝构造函数的现代写法通过初始化临时对象并交换成员变量来避免野指针问题。此外,文章还介绍了写时拷贝(Copy-On-Write)技术,该技术通过延迟内存分配来优化内存使用,并在需要修改时才创建副本。测试代码展示了这些写法的实际效果。原创 2025-05-20 08:40:49 · 998 阅读 · 0 评论 -
CD39.【C++ Dev】string类的模拟实现(3)
本文主要讨论了C++中字符串操作的实现,包括resize、operator<<、operator>>以及字符串比较操作符的实现。首先,resize函数用于调整字符串大小,并根据新大小进行填充或截断。其次,operator<<用于输出字符串,必须引用返回以避免拷贝。接着,operator>>用于从输入流中读取字符串,通过缓冲数组优化了性能。最后,详细讨论了字符串比较操作符(如<、>=、==等)的实现,通过memcmp和自定义逻辑确保比较的准确性。文章原创 2025-05-18 09:29:32 · 987 阅读 · 0 评论 -
CD38.【C++ Dev】string类的模拟实现(2)
本文详细介绍了C++中string类的模拟实现,重点讲解了append、operator+=、insert、erase、find和substr等常用成员函数的实现方法。文章通过代码示例和测试代码,展示了如何实现字符串的追加、插入、删除、查找和子串提取等功能。每个函数的实现都考虑了边界条件和内存管理,确保代码的健壮性和效率。例如,append函数在追加字符串前会检查是否需要扩容,insert函数在插入字符时会移动数据以避免覆盖,erase函数则根据参数的不同情况删除指定范围的字符。通过这些实现,读者可以深入理原创 2025-05-14 14:09:03 · 1219 阅读 · 0 评论 -
CD37.【C++ Dev】string类的模拟实现(1)
1.string基本知识的回顾2.简单的模拟实现准备操作代码实现成员变量构造函数C风格构造的函数无参构造函数C风格构造的函数与无参构造函数合二为一析构函数c_str()size()operator[ ]可读可写只可读iterator(指针版)begin()和end()push_back(char c)原创 2025-05-10 08:40:52 · 770 阅读 · 0 评论
分享