自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【语法】C++的map/set

本文介绍了C++ STL中的关联式容器map和set,以及它们的底层实现——平衡二叉搜索树。map和set通过键值对存储数据,支持高效的查找操作,元素按排序规则组织。set是K模型,map是K/V模型,两者都使用insert添加数据,不允许重复键值。map的节点存储pair类型,支持通过[]操作符访问和修改值。此外,还介绍了multiset和multimap,它们允许键值重复,但不支持[]操作符。文章还详细讲解了insert、find、erase等常用操作的使用方法和注意事项,并通过代码示例展示了如何利用m

2025-05-22 21:05:40 801

原创 【力扣题目分享】二叉树专题(C++)

本文通过10道力扣/牛客题目,详细讲解了二叉树的应用与进阶技巧。首先,介绍了如何根据二叉树创建字符串,通过前序递归遍历节点,并根据左右子树的存在情况决定是否加括号。接着,讲解了二叉树的层序遍历,使用队列实现分层遍历,并展示了如何返回二维数组。随后,探讨了二叉树的最近公共祖先问题,通过递归判断节点位置找到最深祖先。此外,还介绍了二叉搜索树与双向链表的转换,利用中序遍历实现节点链接。文章还详细讲解了如何从前序与中序遍历序列、中序与后序遍历序列构造二叉树,通过递归和区间划分实现树的构建。

2025-05-22 21:05:10 1337

原创 【语法】C++的多态

面向对象的三大特性是封装,继承,多态本篇的主要目标就是多态假如我想实现一个买票系统,普通人就买成人票,学生就买学生票,此时就需要用到多态输出结果:可以发现多态是在继承的基础上有的多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。关于上面代码的知识点,下面一个个讲解那么在继承中要构成多态还有两个条件:1. 必须通过父类的指针/引用调用虚函数。

2025-05-12 15:39:38 1082

原创 【数据结构】map_set前传:二叉搜索树(C++)

二叉搜索树(BST)是一种特殊的二叉树,其左子树所有节点的值小于根节点,右子树所有节点的值大于根节点,且不允许有重复值。BST的常见操作包括插入、查找、删除和中序遍历。插入操作通过比较节点值确定位置,查找操作通过递归或迭代实现,删除操作则需处理多种情况,如删除叶子节点、单子节点或双子节点。中序遍历BST会按升序输出节点值。BST的K模型仅存储键值,适用于查找是否存在;K/V模型存储键值对,适用于字典等场景。BST的局限性在于当数据有序时,树可能退化为链表,导致查找效率降低,此时需使用平衡二叉搜索树来优化。

2025-05-12 15:27:46 1058

原创 【语法】C++的继承

在继承体系中父类和子类不在一个作用域,他们都有独立的作用域public:public:上述代码中,可以看到子类和父类都有个_age成员,那此时如果调用teacher实例化对象的_age会调用哪个呢?答案是teacher中的_age子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。那如果就是要访问父类的同名成员要怎么办?public:public://父类::父类成员如上述代码所示,只需要指定作用域就好了。

2025-04-29 22:01:18 1118 1

原创 【语法】C++继承中遇到的问题及解决方法

这里的~base和~derived构成重定义(隐藏),但他们两个函数名不相同啊?这是因为经过编译器处理后所有的析构函数都会被处理成destructor(为了支持多态),那他们两个析构函数就是重名函数了,父类的析构函数就会被重定义,此时要想让编译器知道你要调用的是父类的析构,就要在前面加上作用域限定符int main()return 0;

2025-04-29 22:00:58 935 1

原创 【语法】C++的stack和queue

stack和queue被叫做容器适配器,而之前学的vector,string,list都是容器,他们两者有什么区别呢?在日常生活中,我们常提到的电源适配器,指的是连接笔记本电脑与电源插座的设备,它的主要功能是将220V的家庭用电电压转换为适合笔记本电脑充电所需的特定电流和电压。没有这个适配器,我们就无法安全地给笔记本电脑充电;如果直接将220V电压接入电脑,肯定会造成损坏。换句话说,电源适配器在这个过程中扮演了一个关键的中介角色,确保电力能够以适当的形式被利用。

2025-04-25 12:28:37 802

原创 【力扣题目分享】栈专题(C++)

学了栈和队列却不知道该怎么用于做题?本篇将分享几道栈和队列相关的经典题目。

2025-04-25 09:04:21 1104

原创 【力扣题目分享】【算法】双指针8道速通(C++)

本文介绍力扣中的8道经典双指针算法题,帮助各位快速入门双指针

2025-04-22 22:47:02 1244

原创 【语法】C++的list

list的大部分用法和vector都很像,例如push_back,构造,析构,赋值重载这些就不再废话了,本篇主要讲的是和vector不同的点构造、拷贝构造:析构:赋值重载:尾插:vector就可以存储多个数据了,为什么还要有一个list呢?相信这是很多初学者的问题之一,下面就给大家说清楚vector缺点:vector优点:支持下标的随机访问,间接的就很好的支持排序、二分查找、堆算法等等通过上面可知,vector因为支持下标的随机访问(即空间是连续的),那么再增删查改就会牺牲效率为了解决这个痛点,就有了lis

2025-04-09 22:39:23 756 1

原创 力扣题目分享:只出现1次的数字I II III(位运算版)

这道题目是要找出只出现一次的数字,其他数字都会出现两次C语言可以直接用的位运算有按位与(&),按位或(|),按位异或(^)这道题用到的是按位异或先讲一下按位异或:对于两个二进制数,相同为0,不同为1,上图中前两位是不同的,所以只有前两位为1,后三位都为1,所以这两个数按位异或的结果就是00011,即3那两个相同的数按位异或的结果就是0而0和任何数异或都会是另一个数我们可以利用这个特性,来把所有的数都异或一遍,最后的结果就是单独的那个数了(相同的都变成0了,0和任何数异或都会是另一个数)

2025-03-25 16:53:49 315

原创 【语法】C++的vector

在C语言中,想要存储非连续的数据,通常会用数组(array),例如int arr[20],arr中就可以存储20个int类型数据,但arr这个数组它的上限就永远是20,不会动态增长。在C++中,STL中的vector容器就很好的弥补了这点,它是一个可以动态增长的顺序表容器,本篇文章会说明vector最常用的十几种接口函数。

2025-03-24 17:05:18 926

原创 我的创作纪念日

现在到了大学,在看鹏哥C语言的视频时,提到说把学习的知识通过博客记录下来可以加强记忆,再加上之前就经常会用到优快云来解决问题,我也想当那个可以帮助别人的人,就开始博客之旅了。到目前为止,我认为我写过的最好的代码就是这道题。

2025-03-18 16:40:33 445 1

原创 【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的。

2025-03-02 22:54:05 307 2

原创 【语法】C++的string

在C语言中,要想存储一串字符,往往用的都是char arr[],也就是字符数组,而在C++中,引入了一个比字符数组更方便,可执行的操作也更丰富的类:string,可以把string归类到STL里面,但实际上string出现的要比STL早。本篇将介绍string类中常用的20几个接口。

2025-02-26 21:03:42 1015

原创 【语法】C++的内存管理 & 模板

new和malloc的区别new会调用构造函数,失败抛异常,malloc失败了返回0malloc是一个函数,new是一个操作符malloc用法:参数传字节数,返回值是void*;new后面跟申请对象的类型,返回值是类型的指针malloc,operator new,new的关系mallocoperator new -> malloc + 失败抛异常new -> operator new + 构造函数。

2025-02-10 22:10:35 631

原创 牛客题目分享:JZ64 求1+2+3+...+n(用static成员和构造函数的方法)(C++)

题目看上去很简单,因为用循环、递归、等差数列就能了了几行解决这个问题,但就如题目所说的, 如果都这些方法都用不了呢?如果只限制题目所说的条件,其实是没有限制递归的,只不过递归所需要的判断条件的if else被禁了而已,我们可以用&&代替,但这并不是出题人的真正意图,本篇将用C++中的构造函数和static成员的特性来解决!

2025-02-01 13:36:54 488

原创 【语法】C++中类的默认成员函数

构造函数与类同名,无返回值构造函数可以被重载(因此有无参和有参两种)通常用全缺省构造函数代替有参和无参两种构造函数当类中没有自己定义时,编译器自动生成的无参默认构造函数,1.针对内置类型的成员变量没有做处理,2. 针对自定义类型的成员变量,调用它的构造函数默认构造函数只能有一个(全缺省构造和无参构造也算默认构造函数)构造函数是在类名前加上~,无参数无返回值析构函数不能重载,所以只能有一个,如果没有显式定义,编译器将会自动生成默认析构函数。

2025-01-30 15:19:26 1382 2

原创 【基础算法】计数排序(C语言)

cnt[0]的值是1,就代表0有1个,就先往原数组中写一个0,1有1个,就再往原数组中写一个1,以此类推,覆盖完成后就是排好序的数组了。再遍历原数组,比如上图数组,第一个数组是4,就往新开辟的数组中的cnt[4]++,接下来是5,就cnt[5]++,直到遍历结束。此时我们可以只开辟到4000的下标,那1000就要存到0的位置,因为1000是数组中的最小值,所以可以由它来充当0。排序分为比较排序和非比较排序,比较排序有希尔排序,快速排序,冒泡排序,插入排序,堆排序等等,而。,这里就讲解一下计数排序。

2025-01-21 13:47:46 245 1

原创 【基础算法】归并排序(C语言)

归并排序是利用分治法进行排序,简单来说是把两个有序数组拼合成一个有序数组(此文默认按升序)我们现在有两个有序数组,要怎么将它合并成一个呢?让begin1和begin2比较,较小的那个移动到创建的新数组中,可以看到现在begin1所指向的值更小,所以将1移到下面数组中,并将现在begin2更小,所以将2移到下面的数组中,并将接下来也一样,直到数据排完为止当其中的一个数组排完后,就可以将另一个数组中剩下的值都移到新数组中现在左边的数组已经排完了,就可以将右边数组的数据都移到新数组中。

2025-01-19 11:36:00 966 1

原创 【基础算法】快速排序(C语言)

快速排序的实现原理与二叉树的前序遍历相似分治递归所以建议读者先学完二叉树的遍历再来学快速排序会简单许多。先来将快速排序的单趟排序,它的核心思想是在数组中找一个基准值(key),比基准值小的就放在左边,比基准值大的就放在右边。基准值的取值一般是第一个或者最后一个(不过这种取值方式有缺陷,后面会介绍优化方法)快速排序的单趟排序有,接下来为大家一一讲解(此文默认为排升序)

2025-01-16 13:59:16 1475 2

原创 【基础算法】希尔排序(C语言)

希尔排序本身是直接插入排序的优化版,所以接下来先简单复习一下直接插入排序。

2025-01-07 11:36:16 949

原创 力扣题目分享:189. 轮转数组(C语言)

第一个想到的应该都是暴力解法,也就是每次都将数组除了最后一个元素都整体往后移一位,然后将刚才的最后一个元素放到第一个位置就拿题目的用例一来举例代码如下然而这个算法的时间复杂度是O(K*N),会导致超时。

2024-12-03 22:49:13 391 1

原创 【基础算法】堆排序与TopK问题(C语言)

堆(Heap)是一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看作一棵完全二叉树的数组对象。堆分大堆和小堆,大堆的每个父亲都比孩子要大,小堆的每个父亲都比孩子要小。建议大家了解二叉树后再来学习堆排序。

2024-11-26 22:30:43 1173 1

原创 【基础算法】二维差分(C语言)

在学习二维差分之前,我们先复习一下一维差分给定一个数组要对这个数组差分,也就是对这个数组的l到r个元素同时操作(加减),比如对这个数组的下标1到3的元素都进行+2操作但这种操作太过于繁琐,于是可以用到一维前缀和先创建一个比原数组大一个的标记数组在当前位置起始位置+2,并在末尾位置的下一个-2再把求出标记数组的前缀和,就变成了此时sumarr+arr的值就是差分后的结果了。

2024-11-20 22:10:07 1218 1

原创 【基础算法】二维前缀和(C语言)

在学习二维前缀和之前,我们先来复习一下一维前缀和:给定一个数组要求这个数组的前缀和,需要再创建一个数组sum[5]={0};当i=0时否则这样arr的前缀和数组sum就求出来了,如果现在想要知道arr[i]到arr[j]的和,就可以用公式。

2024-11-16 08:00:00 1586 3

原创 力扣题目分享:138. 随机链表的复制(C语言)

我们最容易想到的就是暴力解法,也就是先复制一份链表,再将每个节点的random指针指向的节点与自身节点的差值求出来,再一个个指向,如下:这样一直遍历,大概可以估算时间复杂度为O(N^2)

2024-11-12 23:00:25 389 1

原创 力扣题目分享:622.设计循环队列(C语言)

我们可以先定义一个front(头)和rear(尾)(从0开始的下标),每插入一个元素就把rear往后一位(rear指向的是已有元素的下一个位置,也就是下一次插入元素的位置),每删除一个元素就把front往前一位,但如果直接直接定义k个元素的数组,就会出现下面这种情况。这里复用了上面写的判断循环队列是否为满的函数,如果为满则无法插入,返回false,否则插入元素并返回真,首先和上一个函数一样,是一个复用,用来判断是否为空,如果不是空,就返回队尾元素。此时front删掉了最后一个元素,与rear相等,即为空。

2024-11-11 22:08:59 1207 1

原创 力扣题目分享:LCR 022. 环形链表 II(C语言)

想要知道环的入口点,就要知道:一个指针从相遇点开始走,一个指针从链表头开始走,它们会在环的入口点相遇。即追击问题

2024-11-10 21:34:59 462 3

手搓栈和队列的C语言实现项目

该项目是用C语言实现的栈和队列的代码,里面有包括入栈、出栈、入队、出队等等代码,可以让初学数据结构的同学更好的理解栈和队列

2025-01-16

结课项目动态通讯录的c语言实现

内容概要: 用了动态开辟+文件的方式实现了通讯录的增删查改 适合人群:0基础项目经验,熟练C语言是初学者 能学到什么: 项目经验,命名习惯,动态开辟、文件、结构体、枚举的运用

2024-11-21

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

TA关注的人

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