- 博客(35)
- 收藏
- 关注
原创 哈希表实现
哈希表是一种通过哈希函数将关键字映射到存储位置的数据结构,用于实现快速查找。主要方法包括直接定址法(适用于关键字集中时)和除留余数法(更通用)。哈希冲突是不可避免的问题,可通过开放定址法(线性探测、二次探测等)或链地址法(拉链法)解决。负载因子(元素数量/表大小)影响冲突概率和空间利用率。哈希表实现需考虑扩容策略(如质数表扩容)、状态管理(存在/空/删除标记)以及键类型转换(如字符串哈希)。链地址法允许负载因子>1,通过链表处理冲突,而开放定址法需保持负载因子<1。
2025-09-23 21:14:22
583
原创 unordered_map和unordered_set的使用
本文介绍了C++中unordered_set和unordered_map系列容器的使用及其与set/map的差异。unordered容器基于哈希表实现,要求key支持转换为整型和相等比较,平均时间复杂度为O(1);而set/map基于红黑树实现,要求key支持小于比较,时间复杂度为O(logN)。主要差异体现在:1)对key的要求不同;2)迭代器类型不同(unordered为单向,set/map为双向);3)遍历顺序不同(unordered无序,set/map有序);4)性能差异(unordered通常更快
2025-09-13 12:03:37
995
原创 基于红黑树的map与set容器实现及迭代器优化
本文分析了SGI-STL30中map和set的实现框架,重点解析了其复用红黑树(rb_tree)的泛型设计。map和set通过不同模板参数实例化rb_tree:set传入Key类型,map传入pair<const Key,T>类型。文章指出rb_tree通过第二个模板参数Value控制节点存储的数据类型,而第一个参数Key用于find/erase等操作的形参类型。随后介绍了如何模拟实现map和set:1)复用红黑树框架并支持insert操作;2)实现迭代器;3)为map实现[]操作符重载。
2025-09-13 09:19:03
662
原创 红黑树实现
红黑树是一种自平衡二叉搜索树,通过颜色约束(红黑规则)确保近似平衡。主要特点包括:每个节点非红即黑;根节点为黑;红色节点的子节点必须为黑;从任一节点到其叶子节点的路径包含相同数量的黑色节点。这些规则保证最长路径不超过最短路径的2倍,使增删查改操作保持O(logN)的时间复杂度。红黑树通过变色和旋转(单旋/双旋)维持平衡,相比AVL树旋转次数更少。文章详细介绍了红黑树的结构定义、插入操作的三种处理情况(变色、单旋+变色、双旋+变色)以及代码实现,并说明了验证规则的方法。删除操作较为复杂,建议参考专业书籍。
2025-09-10 20:21:14
829
原创 手把手实现AVL树:平衡因子维护与旋转操作详解
AVL树是一种自平衡二叉搜索树,由Adelson-Velsky和Landis在1962年提出。核心特性是任意节点的左右子树高度差不超过1,通过平衡因子(右子树高-左子树高)监控平衡状态。实现要点包括:插入时遵循二叉搜索树规则并更新祖先节点的平衡因子;当平衡因子绝对值超过1时,通过四种旋转操作(左/右单旋、左右/右左双旋)恢复平衡。AVL树保证了O(logN)的查找效率,相比普通二叉搜索树性能更稳定。文中详细介绍了节点结构、插入逻辑、旋转操作实现代码及平衡验证方法,是理解自平衡二叉搜索树的重要基础。
2025-09-08 21:32:51
865
原创 一文掌握二叉搜索树:插入/查找/删除与代码实现
1.二叉搜索树的概念;2.二叉搜索树的性能分析;3.二叉搜索树的插入;4.二叉搜索树的查找;5.二叉搜索树的删除;6.二叉搜索树的实现代码;7.二叉搜索树key和key/value使用场景。
2025-08-26 20:39:51
894
原创 C++继承完全指南:八大核心要点
1.继承的概念及定义;2.基类和派生类间的转换;3.继承中的作用域;4.派生类的默认成员函数;5.继承与友元;6.继承与静态成员;7.多继承及其菱形继承问题;8. 继承和组合
2025-08-21 21:58:10
704
原创 模板进阶(非类型模板,模板特化,模板分离编译)
1.非类型模板参数;2.模板的转化;2.1概念;2.2函数模板特化;2.3类模板特化;2.3.1全特化;2.3.2偏特化;2.3.3类模板特化应用示例;3模板分离编译;3.1什么是分离编译;3.2模板的分离编译;3.3解决办法;4.模板总结
2025-08-20 20:16:41
565
原创 list的简单介绍
本文介绍了C++中list容器的基础使用和实现原理。主要内容包括:1.list的构造方式、迭代器使用(正向/反向)、容量查询和元素访问等基本操作;2.list的插入删除操作及迭代器失效问题,重点说明删除操作会导致当前迭代器失效;3.list与vector的对比分析,指出list在任意位置插入删除效率高但不支持随机访问;4.简要提及list的模拟实现方法,包括反向迭代器的封装原理。文章通过代码示例展示了正确的迭代器使用方式,并比较了两种容器在底层结构、性能特点和使用场景上的差异。
2025-08-08 19:00:00
1039
原创 vector
本文主要介绍了C++标准模板库(STL)中vector的使用方法和底层原理。首先阐述了vector的基本概念和常用接口,包括构造函数、迭代器、空间管理(resize/reserve)等。重点分析了vector的扩容机制在不同编译器下的差异(VS按1.5倍,g++按2倍增长),以及迭代器失效问题及其解决方案。文章还通过代码示例展示了vector增删查改操作和动态二维数组的实现,并指出memcpy拷贝可能导致的问题。最后比较了不同环境下迭代器失效处理的差异,强调重新赋值是解决迭代器失效的关键方法。
2025-08-07 19:50:31
733
原创 c++11特性
对于像string/vector这样的深拷贝的类或者包含深拷贝的成员变量的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的第一个参数都是右值引用的类型,它的本质是要“窃取”引用的右值对象的资源,而不是像拷贝构造和拷贝赋值那样去拷贝资源,从而提高效率,下面的Claire::string样例实现了移动构造和移动赋值,我们需要结合场景理解。右值也是一个表达数据的表达式,要么是字面量常量,要么是表达式求值过程中创建的临时对象,右值可以出现在赋值符号的右边,但不能出现在赋值符号的左边,右值不能取地址。
2025-08-05 22:23:37
652
原创 模板(函数模板/类模板)
1.泛型编程2.函数模板2.1函数模板概念2.2函数模板格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则3类模板3.1类模板的定义格式3.2类模板的实例化
2025-08-01 18:30:00
463
原创 C/C++内存管理
1.C/C++内存分布2.C语言中动态内存管理方式:malloc/calloc/realloc/free3.C++内存管理方式3.1 new/delete操作内置类型3.2new和delete操作自定义类型4.operatoe new和operator delete函数(重点)5. new和delete的实现原理5.1 内置类型5.2自定义类型6.定位new表达
2025-07-31 21:13:31
766
原创 类的对象(中)
像Stack这样的类,虽然也都是内置类型,但是_a指向了资源,编译器自动生成的拷贝构造完成的值拷贝/浅拷贝不符合我们的需求,所以需要我们自己实现深拷贝(对指向的资源也进行拷贝)。析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束战栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。7.我们不写,编译器默认生成的构造函数,对内置类型成员变量的初始化没有要求,也就是说是否初始化是不确定的,看编译器。
2025-07-26 12:34:17
542
原创 类的定义(类和对象上)
1 类的定义 1.1 类定义格式 1.2 访问限定符 1.3类域 2 实例化 2.2 对象大小 3 this指针 4. C++和C语言实现Stack对比
2025-06-25 22:06:04
792
原创 set的使用
序列式容器与关联式容器的差异,set类详解:底层机制基于红黑树实现.键特性:自动排序、键值唯一性、迭代器不可修改性;multiset与set差异:通过对比插入、查找、删除行为,,明确多重复值场景下的选择策略.
2025-05-08 15:23:25
1172
原创 二叉搜索树
找N左子树的值最大结点,或者N右子树的值最小结点,因为这两个结点中的任意一个,放到N的位置,都满足二叉搜索树的规则。1.从根开始比较,查找x,x比根的值大则进入右子树查找,x比根的值小则进入左子树查找。a.需要存储再支持下标随机访问的结构中,并且有序。2.把结点N的父亲结点的对应孩子指针指向N的右孩子吗,直接删除结点。3.把结点N的父亲结点的对应孩子指针指向N的右孩子吗,直接删除结点。若它的右子树不为空,右子树上所有结点的值都大于等于根结点的值。1.把结点N的父亲结点的孩子结点指针指向空,直接删除结点N。
2025-04-24 16:00:34
877
原创 C++入门基础—
命名空间需要用到namespace关键字,后面跟一对“{ }”,{ }里包含了命名空间的成员。int val;int i = 0;命名空间里可以包含变量,函数,类型。命名空间不可以定义在局部作用域命名空间可以嵌套同一个工程中允许存在多个相同名称的命名空间,最后编译器会将其合成一个命名空间。但不允许存在相同名称的变量,函数和类型。引用不是定义一个新变量,而且给原有的变量取一个别名。编译器不会为引用变量开辟空间,它与引用的变量共用同一块内存空间。
2025-03-05 20:06:28
612
原创 函数atoi简述,使用及模拟实现
解析整数:从第一个非空白字符开始,函数解析可选的正号('+')或负号('-'),然后尽可能多地解析十进制数字,并将它们解释为数值。atoi 函数不进行错误检查,除了返回 0 以表示空字符串或仅包含空白字符的字符串外,它不会提供关于转换失败或溢出/下溢的反馈。跳过空白字符:函数首先跳过字符串开头的所有空白字符(如空格、制表符等),直到找到第一个非空白字符。忽略额外字符:如果字符串在整数表示之后还包含其他字符,这些字符将被忽略,不会影响函数的返回值。函数atoi,字面意思 arr to int。
2024-11-20 14:36:17
324
原创 内存函数介绍
如果这两块内存区域的所有字节都相等,则函数返回 0;如果不相等,则返回一个非零值,表示哪一块内存的内容在字典序上更大。这里的复制是二进制级别的,意味着它不会检查源数据中是否有空字符(将arr指向的位置的5个元素的内容复制到arr+2指向的内存。的调用结果直接用作其他函数的参数,特别是在链式调用中。的调用结果直接用作其他函数的参数,特别是在链式调用中。函数返回指向被填充内存块的起始位置的指针(即。将arr1中的5个元素复制到arr2中。指向的位置复制(或移动)指向的两块内存区域的前。比较两个字符串的内容。
2024-11-13 21:32:37
863
原创 扫雷游戏(简单版复盘)
笔者环境:VS2022,X64。扫雷游戏使用11*11的棋盘,实际打印9*9的棋盘,用户输入坐标,显示坐标周围雷的个数,或者炸死,如果找出所有非雷的坐标,游戏成功。
2024-10-24 10:45:33
909
原创 随机数rand,srand,time
rand()由算法生成伪随机数。头文件是。rand()的生成由种子决定,默认种子是1。根据默认种子1,每次生成的随机数序列都相同,反而不随机。这时需要给一个随机数种子,让每次的随机数都不一样。获取种子用srand();种子使用time()
2024-10-24 10:45:05
365
原创 选择语句与循环语句学习心得
表达式三) 其中表达式一为变量赋值,表达式二为语句判断的标准,表达式三为语句变量的调整。三个表达式执行顺序是进入for语句时执行表达式一,然后执行表达式二,如果判断为真,则执行语句,语句执行结束先执行表达式三,再执行表达式二。其中if(表达式),表达式为真则执行,表达式为假跳过。if, else if,else三者可结合使用,执行顺序从上往下,上面判断为真则执行上面的语句,上面判断为假,才会进入下面语句,如图所示二者代码执行结果相同。其中先进行语句执行一次,结束后再判断表达式,表达式为真,则执行语句;
2024-10-16 15:21:54
341
原创 新人报道,请多多关照
短期目标:系统学习C语言的基础知识;在线进行系统学习,通过刷题练习C语言题目;浏览编程社区帖子,学习他人经验,尝试解决别人提出的疑问。长期职业发展目标:进入思科工作,并且在掌握C语言的基础上,持续学习新技术和新知识。预习复习时段:再安排2小时对当天所学内容进行预习和复习,巩固记忆,查漏补缺。撰写学习笔记:将所学知识进行整理和输出,撰写学习笔记,促进知识的融会贯通。学习时段:每天安排2小时进行新知识的学习,确保学习进度与质量。C语言学习计划与职业发展目标。
2024-10-08 18:30:55
142
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅