- 博客(53)
- 收藏
- 关注
原创 C++11 智能指针的使⽤及其原理
本文深入探讨了C++智能指针的使用与原理。主要内容包括:1)智能指针的应用场景,通过RAII机制解决异常处理中的内存泄漏问题;2)标准库智能指针(auto_ptr/unique_ptr/shared_ptr/weak_ptr)的特性与使用差异,着重分析shared_ptr的引用计数机制;3)循环引用问题及weak_ptr的解决方案;4)shared_ptr的线程安全问题;5)内存泄漏的危害及防范措施。文章通过代码示例详细演示了各类智能指针的实现原理,并比较了不同智能指针的适用场景,为C++开发者提供了全面的
2025-09-04 22:53:14
821
原创 C++ 异常
摘要:本文系统介绍了C++异常处理机制,包括异常概念、抛出捕获原理、栈展开机制及匹配规则。异常通过throw抛出对象,由最匹配的catch子句处理,支持类型转换和继承体系捕获。文章详细讲解了异常安全、重新抛出、规范写法(noexcept)等关键点,并通过数据库、缓存等模块的异常类设计示例,演示了实际项目中如何构建异常体系。同时指出析构函数和资源管理中的异常风险,建议使用RAII或捕获后释放资源再重新抛出。最后介绍了C++标准库异常体系,强调通过exception基类捕获各类异常。
2025-09-02 20:09:05
995
原创 C++11新特性解析与应用
本文详细介绍了C++11标准的重要特性,主要包括: 列表初始化:统一初始化方式,支持自定义类型初始化; 右值引用和移动语义:通过移动构造和移动赋值减少拷贝开销,提高效率; 可变参数模板:支持可变数量参数的函数和类模板; 新类功能:默认移动构造和移动赋值、成员变量声明缺省值等; lambda表达式:简化匿名函数定义,支持捕获外部变量; 包装器function和bind:统一可调用对象类型,灵活调整参数。 这些特性提升了C++的编程效率和性能,使代码更简洁高效。
2025-09-01 20:19:27
572
1
原创 哈希算法完全解析:从原理到实战
哈希表是一种高效的数据组织方式,通过哈希函数将关键字映射到存储位置实现快速查找。摘要要点包括:1. 哈希冲突不可避免,需设计优秀哈希函数(如除留余数法)和冲突解决方案(开放定址法、链地址法);2. 负载因子影响空间利用率与冲突概率,需合理控制;3. 非整型关键字需转换为整数参与计算;4. 实现开放定址法和链地址法两种哈希表结构,支持插入、查找、删除操作;5. 基于哈希表封装unordered_map和unordered_set容器,实现迭代器功能,支持operator[]操作。
2025-08-29 19:30:24
585
原创 unordered_map和unordered_set的使⽤
本文介绍了unordered_set和unordered_map的使用及其与set/map的主要差异。unordered_set底层采用哈希表实现,要求Key支持转换为整型和相等比较,具有O(1)的平均增删查效率,但迭代器遍历无序;而set基于红黑树实现,要求Key支持小于比较,具有O(logN)的时间复杂度,但能保持有序性。同理,unordered_map与map也存在类似差异。性能测试表明,在大多数场景下,unordered系列容器性能更优。此外,unordered_multiset/unordered
2025-08-28 01:01:38
554
原创 封装红⿊树实现mymap和myset
本文分析了SGI-STL30版本中map和set的实现原理,并基于红黑树(RBTree)进行了模拟实现。主要内容包括: 源码分析:map和set底层通过红黑树实现,采用泛型设计,通过模板参数控制数据结构。map存储pair<const K,V>,set存储K,通过KeyOfT仿函数提取键值进行比较。 框架实现:设计RBTree模板类,支持map和set的复用。关键点包括: 节点结构RBTreeNode封装数据和颜色 插入操作处理红黑树平衡 迭代器实现中序遍历(++/--操作) 具体实现: 为ma
2025-08-27 18:46:29
562
原创 揭秘红黑树:平衡与效率的完美结合
红黑树是一种自平衡二叉搜索树,通过颜色约束(红/黑)和旋转操作保持近似平衡。其核心规则包括:根节点为黑色;红色节点的子节点必须为黑色;从任一节点到叶节点的路径包含相同数量黑色节点。这些规则确保最长路径不超过最短路径的两倍,使增删查改操作的时间复杂度保持在O(logN)。红黑树通过变色和旋转(单旋/双旋)处理插入时的冲突,相比AVL树旋转次数更少。验证红黑树需检查4条规则,而非单纯比较路径长度。文中提供了红黑树的C++实现代码,包括插入、旋转、查找和验证等功能。
2025-08-25 17:05:04
1074
原创 AVL树平衡原理与实现详解
AVL树是一种自平衡二叉搜索树,由Adelson-Velsky和Landis于1962年提出。它通过平衡因子(右子树高度减左子树高度)控制在-1到1之间来保持平衡。插入节点时,AVL树会沿着路径更新平衡因子,当出现不平衡(平衡因子为±2)时,通过四种旋转操作(左旋、右旋、左右双旋、右左双旋)重新平衡树。这些操作既保持了二叉搜索树的性质,又降低了子树高度,确保操作时间复杂度为O(logN)。文中还详细介绍了AVL树的结构定义、插入实现、旋转算法以及平衡检测方法,并提供了完整的C++实现代码和测试用例。
2025-08-25 01:05:27
813
原创 二叉树的经典算法与应用
本文摘要: 文章介绍了二叉树相关的7个算法问题及解法:1)二叉树转字符串(LeetCode 606),通过递归处理左右子树;2)二叉树的层序遍历(LeetCode 102)及自底向上遍历(LeetCode 107),利用队列记录每层节点;3)二叉树的最近公共祖先(LeetCode 236),通过节点位置判断或路径追踪;4)二叉搜索树转双向链表(LCR 155),中序遍历时修改指针;5)根据前序/中序(LeetCode 105)或中序/后序(LeetCode 106)序列重建二叉树;6)二叉树前序、中序、后序
2025-08-23 17:27:48
704
原创 map和set的使⽤
本文介绍了STL中的关联式容器set和map系列,重点分析了它们的使用方法和底层实现原理。set是基于红黑树实现的key搜索结构,具有去重和排序功能,支持高效查找操作(O(logN))。map同样采用红黑树实现,存储键值对(key-value),通过key可以快速找到对应的value。文章详细讲解了set/map的构造、插入、删除、查找等操作,并比较了set与multiset、map与multimap的区别。此外,还介绍了map特有的operator[]操作符,以及如何利用这些容器解决实际问题,如统计单词出
2025-08-22 21:11:06
1021
原创 二叉搜索树:高效查找与删除详解
二叉搜索树是一种高效的数据结构,其特点是左子树节点值≤根节点≤右子树节点值。通过插入、查找、删除等操作保持有序性,时间复杂度在最优情况下为O(logN),最差情况下为O(N)。实际应用中分为纯key模型(如车牌识别系统)和key-value模型(如字典翻译)。删除操作需处理四种情况,包括使用替换法删除双子树节点。为提高效率,后续会引入平衡二叉搜索树(AVL树和红黑树)来优化性能。本文还提供了二叉搜索树的代码实现,包括插入、查找、删除等核心功能。
2025-08-22 13:24:02
922
原创 深入理解C++多态:从理论到实践
本文系统讲解了C++多态的核心概念与实现原理。主要内容包括:1. 多态分为编译时多态(函数重载)和运行时多态(虚函数机制);2. 实现运行时多态需要满足:父类指针/引用调用虚函数,且子类完成虚函数重写;3. 虚函数通过虚函数表(vtable)实现动态绑定,运行时根据对象类型调用对应函数;4. 特殊规则:协变返回值、析构函数重写、override/final关键字;5. 纯虚函数和抽象类强制子类实现接口。文章通过代码示例详细展示了多态的应用场景和底层实现机制,包括虚函数表的结构和内存分布。
2025-08-20 15:24:01
883
2
原创 深入解析C++继承机制与实战技巧
本文系统介绍了C++继承机制的核心概念和应用。主要内容包括:1.继承的基本概念与定义,包括继承格式、访问权限变化和类模板继承;2.父子类间的转换规则及作用域隐藏问题;3.子类默认成员函数的生成规则;4.友元与静态成员在继承中的特性;5.多继承的菱形继承问题及虚继承解决方案;6.继承与组合的设计区别。文章通过代码示例详细说明了继承的语法特性,重点分析了多继承带来的复杂性问题,并比较了继承与组合的优缺点,建议优先使用组合以降低耦合度。最后指出虽然继承机制复杂,但仍是实现多态的必要手段。
2025-08-17 19:05:10
807
1
原创 C++ 模版进阶
本文介绍了C++模板的两个重要特性:非类型模板参数和模板特化。非类型模板参数允许使用常量作为模板参数,但必须是编译期可确定的整型常量。模板特化分为函数模板特化和类模板特化,用于处理特殊类型的特殊需求。函数模板特化需要先有基础模板,而类模板特化包括全特化(所有参数确定)和偏特化(部分参数确定或进一步限制)。文章还讨论了模板分离编译带来的问题及解决方法,最后总结了模板的优缺点:提高代码复用和灵活性,但可能导致代码膨胀和编译错误难以定位。文中通过日期类比较等示例代码展示了这些特性的实际应用。
2025-08-16 15:04:02
787
原创 C++ stack and queue
本文系统介绍了C++中的容器适配器及其底层实现。主要内容包括:1.stack和queue的基本概念、使用方法、OJ题目应用及模拟实现;2.容器适配器的设计原理,STL中默认使用deque作为底层容器;3.deque的优缺点分析及其作为适配器底层容器的原因;4.priority_queue的实现原理、仿函数应用及模拟实现。 文章详细分析了各种容器的特性比较,如vector、list与deque的差异,并通过大量代码示例(如最小栈、逆波兰表达式等)展示实际应用。最后通过测试用例验证了自定义实现的正确性.
2025-08-14 00:01:59
818
原创 初识Liunx
Linux是由Linus Torvalds于1991年开发的开源操作系统内核,采用GPL许可证,允许自由修改和分发。其发展经历了从个人项目到全球协作的演进,现已成为服务器(占75%市场份额)、云计算、移动设备(如Android)及嵌入式系统的主流选择。Linux的成功推动了开源软件运动,其发行版本丰富多样,包括Debian系(如Ubuntu)、RedHat系(如CentOS)及Arch等,满足不同场景需求。尽管在桌面领域与Windows仍有差距,但Linux凭借开源优势、技术多样性和社区驱动模式,持续引领企
2025-08-11 14:33:26
938
原创 C++ list类
本文主要介绍了C++标准库中的list容器及其实现原理。list是一个带头双向循环链表,具有高效的插入和删除操作。文章详细讲解了list的构造函数、迭代器使用、容量操作、元素访问和修改方法,并重点分析了list迭代器失效问题(仅在删除时失效)。通过多个测试用例展示了list的常用操作,包括排序、合并、去重等。还对比了list和vector的排序效率,发现vector排序更快。最后模拟实现了list的关键功能,包括节点结构、正向/反向迭代器以及常用成员函数。文章强调list适合频繁插入删除场景,但随机访问效率
2025-08-10 22:35:34
708
2
原创 C++ vector类
本文全面介绍了C++标准模板库中的vector容器,包括其基本使用、实现原理和常见问题。主要内容包括:1. vector的构造方法、迭代器、空间增长机制和增删查改操作,通过示例代码展示不同场景下的使用方法;2. 迭代器失效问题分析,阐述导致失效的操作及解决方案,比较不同编译器下的处理差异;3. vector的模拟实现过程,重点讨论内存拷贝问题;4. 多个典型OJ题目的vector应用实例。文章通过理论讲解与代码示例相结合的方式,深入剖析了vector的核心特性和使用技巧,对理解STL容器和解决实际问题具有重
2025-08-09 13:49:22
1065
3
原创 C++ string类
目录一.STL简介1. 什么是STL2.STL的版本(了解即可)编辑二.String类 1.认识string类2.string类的常用接口说明2.1构造函数2.2 string类对象的容量操作2.3string类对象的访问及遍历操作 2.5. string类非成员函数2.6 vs和g++下string结构的说明2.6.1 vs下string的结构2.6.2 g++下string的结构3.C++11的小语法(auto关键字和范围for)3.1auto关键字(做类型推导)3.2范围for(遍历方便)4.str
2025-08-05 23:12:56
1158
2
原创 关于Sort的补充
本文探讨了快速排序的两种优化方法:三路划分和自省排序。针对大量重复数据导致快排性能下降的问题,三路划分将数组分为小于、等于和大于key的三部分,有效提升排序效率。自省排序则通过监控递归深度,在深度过大时切换为堆排序,避免时间复杂度退化为O(N^2)。此外,文章还介绍了外排序中的文件归并策略,通过将大文件分批排序后归并处理,实现对超内存数据的排序。这些优化方法在力扣912题等实际场景中展现出显著性能提升。
2025-08-02 15:25:01
560
2
原创 关于sort的测试代码
本文介绍了数据结构中常见的排序算法实现,包括插入排序、希尔排序、堆排序、冒泡排序、选择排序、快速排序、归并排序和计数排序。作者提供了完整的C语言实现代码,包含头文件sort.h和源文件sort.c,以及测试用例test.c。文章重点分析了各算法的时间复杂度和空间复杂度,如插入排序最好情况O(N)、最坏O(N^2),希尔排序O(N^1.3)等,并给出了性能测试方法。排序算法实现完整,包含递归和非递归版本,适合教学和实践使用,读者可自行测试比较不同算法的性能差异。
2025-07-31 20:08:57
296
原创 数据结构之排序
本文系统介绍了常见的排序算法及其特性。首先阐述了排序的基本概念,包括排序的稳定性、内部排序和外部排序的区别。然后详细讲解了12种排序算法:冒泡排序(O(N²),稳定)、插入排序(O(N²),稳定)、希尔排序(不稳定)、选择排序(O(N²),不稳定)、堆排序(O(NlogN),不稳定)、快速排序(O(NlogN),不稳定)及其hoare/挖坑法/前后指针三种实现、归并排序(O(NlogN),稳定)及其递归与非递归实现、计数排序(O(N+范围),稳定)。最后通过表格对比了各算法的时间/空间复杂度和稳定性,为算法
2025-07-31 19:33:24
1264
7
原创 数据结构之二叉树
本文系统介绍了树与二叉树的数据结构及相关算法。主要内容包括:1.树的基本概念(根节点、子树、度等)和表示方法;2.二叉树的概念、性质及特殊类型(完全二叉树、满二叉树等);3.二叉树的存储结构(顺序存储和链式存储);4.堆的实现与应用(堆排序、TopK问题);5.二叉树的遍历算法(前序、中序、后序、层序遍历);6.二叉树的基本操作(求节点数、高度、查找等);7.常见二叉树OJ题目解析(单值树判断、对称树判断、子树问题等)。文章通过代码示例详细展示了各种操作的实现方式,并分析了相关算法的时间复杂度。
2025-07-06 16:45:15
752
3
原创 Date类的实现(结合类和对象的知识)
类和对象 (一)类和对象(二)理解完上面两篇文章 我们就可以实现日期(Date)类 。分为三个文件 Date.h Date.cpp test.cpp。Date.cpptest.cpp
2024-08-30 16:24:02
232
2
原创 C++ 类和对象
文章包括类的定义 访问限定符 类域 实例化 默认构造 构造函数 拷贝构造 析构函数 运算符重载 const成员函数 初始化列表 类型转换 static成员 友元函数 内部类
2024-08-26 11:33:26
1067
4
原创 初识 C++
文章内容包括:命名空间(namespace)cin cout 输入输出 缺省参数 函数重载 引用& inline函数 nullptr 等相关知识。
2024-08-24 15:28:49
794
2
原创 寻找具有下列特性的四位正整数,其百位数为0,去掉百位数0可得到一个三位正整数,而该三位正整数乘以9等于原四位正整数。如6075=675 X 9,所以6075是具有上述特性的正整数。请完善程序。
寻找具有下列特性的四位正整数,其百位数为0,去掉百位数0可得到一个三位正整数,而该三位正整数乘以9等于原四位正整数。如6075=675 X 9,所以6075是具有上述特性的正整数完善程序。
2024-05-14 22:55:28
284
3
原创 对于一个较大的整数 N(1<=N<=2,000,000,000)比如 980364535,我们常常需要一位一位数这个数字是几位数,但是如果在这 个数字每三位加一个逗号它会变得更加易于朗读。
对于一个较大的整数 N(1
2024-05-08 09:37:07
323
3
原创 深入理解指针(3)
size_t strlen( const char* str) 统计的是从strlen函数的参数str中这个地址开始向后,\0之前的字符串中字符的个数 strlen 函数会一直向后找\0 字符,直到找到为止。sizeof计算变量所占内存 内存空间的大小,单位是字节,如果操作数是类型的话,不在乎内存中存放什么数据 所以说。sizeof只关注占用内存空间的大小,不在乎内存中存放什么数据。strlen 是C语言库函数,功能是求字符串长度。
2024-04-10 15:39:37
227
1
原创 深入理解指针(2)
文章包括对数组名的理解、使用指针访问数组、一维数组的传参本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组、字符指针变量、数组指针变量、二维数组传参的本质、函数指针变量、函数指针数组、计算器的模拟实现回调函数等内容的认识。
2024-04-06 20:37:57
676
1
原创 深入理解指针(1)
文章包括对指针的认识、对指针变量的大小计算、指针变量类型的意义、void*指针、const修饰指针、指针的运算、野指针、assert断言、指针的使用和传址调用。
2024-04-05 17:06:39
1017
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人