- 博客(67)
- 收藏
- 关注
原创 【C++】--封装红⿊树实现mymap和myset
我们前面学习map和set的使用的时候,知道set是对应我们的key问题,然后map对应的是我们的key和value问题,所以这两者存储的数据是不一样的,然后其二者的底层又是使用的红黑树实现的,那么我们是否需要去对应其存储的数据的特点,然后分别弄一个红黑树呢?可以看到源码中,set和map是用的同一个红黑树。不过set中的红黑树的pair存储的数据是这样的:pair<K,K>。其让两个数据都存储key。然后map中的pair就一个存储key一个存储value。
2025-12-25 17:32:16
419
原创 【C++】--红黑树的概念和实现
在计算机科学的浩瀚领域中,数据结构是构建高效算法的基石,而树结构因其出色的层次性和查找效率,成为处理动态数据集合的核心选择。二叉搜索树作为基础的树结构,虽能实现快速的插入、删除与查找操作,但在极端情况下(如数据有序插入)会退化为线性结构,导致时间复杂度骤升至O(n),难以满足大规模数据处理的性能需求。
2025-12-18 01:55:44
683
原创 【C++】--AVL树的认识和实现
前面我们学习了二叉搜索树,其在一般情况下,对数据的查找的效率为O(logN),但是在极端的情况下,其时间复杂度会达到O(n)。如下:右边的单支或者接近单支的情况就会导致查找的效率变得很低。所以后来又发明了AVL树,AVL树是两个前苏联科学家在1962年发表的。其概念如下:AVL树最先发明自平衡二叉查找树,其是一棵空树,或者具有以下性质的二叉树,它的左右子树也都是AVL树,然后左右子树的高度差不能超过1。AVL树是一棵高度平衡二叉树,其通过控制高度差去控制平衡。
2025-12-14 16:27:39
893
原创 【C++】--map和set
可以看到其有三个模板参数,首先第一个是 要存储的数据T,这个就是我们说的key了。然后第二个是一个仿函数less前面我们学习优先级队列已经讲过了,其是一个比较谁小的函数,那么说明我们存储的数据要可以支持比大小。然后我们要是有别的需求,那么可以按自己实际的需求来写比较逻辑,然后将这个仿函数传入这个模板参数。然后set底层存储数据是从空间配置器申请的,要是需要可以自己进行内存池的实现,传给第三个参数,我们日常使用set一般都是只使用第一个参数,后面两个参数都是使用其自带的多。
2025-12-07 01:55:06
558
原创 【C++】--二叉搜索树
二叉搜索树其又叫二叉查找树,二叉排序树,二叉有序树等。其是指的一棵空树,或者具有下面几个性质的二叉树:1、若它的左子树不为空,那么左子树上的所有节点的值都小于它的根节点的值。2、若它的右子树不为空,那么右子树上的所有节点的值都大于它的根节点的值。3、而且其左右子树也都是二叉搜索树。4、然后二叉搜索树可以支持插入相等的值,也可以不支持插入相等的值,这个我们要看我们的使 用场景来决定。
2025-12-01 00:53:26
925
原创 【C++】--多态
多态的概念就是:就是有多种形态,在C++中多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态就是我们的函数重载和模板了,就比如我们使用cout函数的时候,前面我们将的时候是说其会自动去识别要打印的数据的数据类型,但是实际上其也是一种多态。其实际上是去调用的operator<<,然后其根据数据的类型去匹配调用。可以看到我们使用cout打印两个不同的数据类型,其在编译的时候实际上是使用的不同的函数。
2025-11-28 13:22:56
864
原创 【C++】--继承
C++中允许我们定义一个新类,然后其允许在一个基类的基础上建立的。然后这个新类我们一般称为派生类,然后这个派生类会继承基类的成员变量和成员函数,然后派生类还可以设计自己的成员变量和成员函数。我们继承的主要作用还是做到代码的的复用,还有就是我们一些类之间是有很大的联系的,两个类之间会有很多共同的部分。比如:我们定义一个老师、学生、保安等等的类,那么这几个人群中,其都有名字,身份证号,性别等等的共同的信息,那么我们就可以将其单独拿出来。老师:姓名、年龄、电话、身份证、工号。
2025-11-17 10:38:34
964
原创 【C++】--模板进阶
前面我们在模板初阶的时候,我们在使用模板的时候都是对数据类型进行模板化的操作的。那么啥是非类型模板参数呢?就比如说我们要设计一个栈,那么我们要初始化数组的大小,那么我们可以定义一个宏来初始化数组的大小。我们使用一个N来定义。但是我们会发现我们使用栈的时候,有的时候需要大一点的空间,有时候需要小一点的空间,那么我们要是经常修改这个N,就显得很不方便了。在C++中,模板中有一个非类型模板参数,其可以设计成一个确定的数据类型,然后可以实现我们宏的一些功能。我们在使用的时候就要传两个参数了。
2025-11-11 11:05:36
850
2
原创 【C++】--stack和queue
前面我们在学习初阶数据结构的时候,我们已经对这两个数据结构有了很深刻的认识了。栈的话,其是一种先进后出的结构,其有一个栈底和栈顶,那么其可以是数组的结构来实现的,也可以是链表的结构来实现的。queue的话其是先进先出的数据结构,其有个队尾和队头,其也可以是数组或者链表的结构来实现。下面我们看看在库中是如何实现的:可以看到库中的实现和我们在初阶数据结构的时候的实现是不一样的,其使用的是容器适配器,我们库中的stack和queue就有点像中间商这样,使用别的容器的功能来实现自己的功能。
2025-11-07 15:42:10
658
2
原创 【C++】--list的使用和模拟实现
List和vector一样也是C++标准模板库中的一个容器,其中文名就是我们前面数据结构学习的链表,那么其和我们前面学习的string类和vector类最大的不同就是其物理结构是不连续的,其是一个一个的节点构成的,然后list是一个双向带头循环链表:上面就是list的简单图示了,可以看到其一个结点4主要是三个部分,一个是存储的数据,然后一个是指向后一个节点,一个是指向前一个节点,所以我们也说在逻辑上我们的list是连续的。下面我们来看看其使用。
2025-10-27 21:32:18
1126
4
原创 【C++】--vector类的使用和模拟实现
那么我们有这么多用来存储数据的容器,vector其有什么优势呢?1、其会动态扩容,vector会自动的管理其容量,根据存储的需要进行调整2、其和顺序表是一样的,数据在物理上还有逻辑上都是连续存放的,那么我们就可以使用下标访 问,迭代器访问等。3、vector是模板化设计的,那么其就可以用来存储任何类型的数据,更符合我们泛型编程的要求。
2025-10-22 00:19:05
713
1
原创 【C++】——string类的实现
我们要模拟实现C++库中的string类,然后自己手动的去实现一个string的类,那么我们首先考虑到的是,我们手动实现的string类要是也叫string类,那么就会和库中的string类起冲突了,所以我们可以将其放在一个命名空间中,命名空间可以根据自己的需求来取。然后就是我们的string类中的私有成员变量有三个:_str、_size、_capacity。这三个成员变量分别表示:1、指向字符串数组的指针2、表示字符串数组实际存储的字符个数3、表示这个数组的实际能存储的字符个数。
2025-10-06 00:53:25
604
3
原创 【Linux】--入门、基础命令
Linux是一个开源的类UNIX的操作系统,该操作系统的内核由林纳斯托⽡兹在1991年 首次发布, 其有个特点就是开源,即源代码是公开的,然后是免费被人们使用的,任何人和机构都可以自由的使用Linux的底层代码。那么啥是操作系统呢?我们知道我们的计算机是由软件和硬件组成的,操作系统就类似我们的大脑,有了操作系统更加方便我们去使用计算机。其就类似于我们和计算机的桥梁,让我们使用人和机器的交互。总结一句话就是,操作系统是管理计算机的硬件和软件的一个软件。操作系统的根本目的就是让计算机更加的好用。
2025-09-24 23:54:52
702
5
原创 【C++】——string类的使用(详细讲解)
由于stringkw=string类比STL发明要早,所以string没有被归到STL中,但是从归类上看可以将其和STL中的容器归为一类。string是一个类,虽然平时使用的是叫"string",但是实际上它是被typedef之后的。通过这个模板basic_string指定类型char定义的一个类string,可以认为是一个char类型的顺序表。
2025-09-21 23:35:10
908
2
原创 【C++】--STL简介
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允 许 任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺 陷:可读 性比较低,符号命名比较怪异。由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性 一 般。
2025-09-11 13:22:34
195
3
原创 【C++】--模板(初阶)
1、要是我们有现成的函数那么其就直接使用现成的,然后对于<int>这种显示实例化的方式就相当 于我们指定其去使用模板,所以其就调用模板实例化出来的函数。2、对于非模板函数和同名模板函数,如果其他条件都相同,在调用时会优先调用非模板函数而不会从模板产生一个实例。但是如果模板可以产生一个具有更好匹配的函数,那么其将选择模板。
2025-09-07 21:02:22
610
5
原创 【C++】——内存管理
new和delete和C语言中的动态内存管理的最大的区别就是对于类对象开空间的时候,new和delete除了会开空间,其还会其调用类的构造函数和析构函数。还有就是new和malloc对于空间申请失败的处理方式也是不同的。下面我们先对malloc来实践看看其空间申请失败是如何反馈的:我们不断的申请空间,然后将这个申请的空间的地址打印出来:可以看到malloc空间申请失败的话其是会返回一个空地址的。下面我们看看new空间申请失败的情况:可以看到new的空间申请失败的话其不是打印空地址的,而且报错。
2025-08-24 00:26:58
1083
7
原创 【C++】——类和对象(中)—>赋值运算符重载+日期类的实现+const成员函数+取地址运算符重载
我们在对内置类型进行运算符的操作的时候,编译器是会将其转化为对应的指令,然后其完成运算的,那么对于我们的自定义类型,我们是否可以直接进行使用呢?下面我们通过代码来验证:可以看到对于自定义类型是无法直接使用赋值运算符的,这是因为我们的自定义类型,编译器是不知道如何进行运算的,就比如我们的日期类,我们知道每年有十二个月,但是编译器是不知道的,所以对于自定义类型,我们就需要自己根据实际情况去写。不过我们可以写一个函数来实现这个功能。
2025-07-23 03:29:28
614
2
原创 【C++】——类和对象(中)——默认成员函数
我们使用class和struct等关键字进行定义的类型下面我们就来看看编译器自动生成的构造函数是如何的:我们可以看到我们在定义类的时候我们没有写构造函数的,那么我们在实例化对象的时候,我们的编译器就会自动帮我们默认构造函数,但是其具体是初始化什么内容我们就不知道了,我们上面的代码对成员变量的初始化就没啥有要求了。还有一种情况就是我们的成员变量也是一个类,然后我们的成员变量有构造函数,那么我们这个类就可以不写构造函数了,那么其就会使用成员变量那个类的构造函数。
2025-07-18 19:37:38
1121
5
原创 【C++】——类和对象(上)
类和前面我们在C语言中学习到的结构体有点类似,其最大的区别就是我们的类可以定义函数,类的定义需要使用到关键字class。其定义如下:class是定义类的关键字,text是类的名称,{}中为类的主体,要注意的是最后的那个分号不可以省略。类中的内容称为类的成员,类中的变量称为类的属性或者成员变量,类中的函数被称为方法或者成员函数。C++中其也兼容C语言的大部分语法,所以我们的struct在C++中也升级成了类,其和C语言中的struct的最大区别就是其可以定义函数了。那么我们的类具体有和作用呢?
2025-07-10 21:33:03
967
8
原创 【C++】--入门(下)
引用是给已经存在的变量取一个别的名字,所以编译器是不会给引用再开辟空间的,它和其引用的变量共用一块空间。其语法如下:类型&引用别名=引用对象;那么在上面的引用中,b和c都是a的别名,就像我们生活中,土豆和马铃薯,番茄和西红柿这种情况,其就是名字不一样,但是指的是同一个事物。我们将其地址打印出来看看:可以看到其是使用的同一块空间的。
2025-07-06 01:21:29
946
9
原创 【C++】--入门
定义命名空间需要用到namespace关键字,然后后面跟命名空间的名字,然后接上一对{}即可,{}中即为命名空间中的成员。命名空间中可以定义变量\函数\类型等。namespace本质上是一个域,这个域和全局域是独立的,不同的域可以定义同名变量。C++中域有函数局部域,全局域,命名空间域,类型;域影响的是编译的时候语法查找一个变量\函数\类型出处(声明或定义)的逻辑,所以有了域隔离,那么名字冲突就解决了。局部域和全局域除了会影响编译查处逻辑,还会影响变量的生命周期,命名空间和类域不影响变量生命周期。
2025-07-02 22:06:33
841
5
原创 【数据结构】--排序算法(上)
我们在学习c语言的时候就已经接触过排序了的,我们当时学习数组的时,就学习过冒泡排序,我们的排序算法主要分为下面几种:我们先复习一下我们的冒泡排序:我们看看其时间复杂度,其两个循环嵌套,然后其最坏的情况就是其完全是逆序的,那么每一次都需要进行交换,那么我们的时间复杂度最坏的情况就是O(n*n),那么最好的情况就是其已经是升序的,那么我们的时间复杂度就为O(n),那么其平均情况下时间复杂度就为O(n^2)。
2025-06-26 22:49:06
975
4
原创 【数据结构】——二叉树--链式结构
文章摘要:本文详细介绍了链式结构二叉树的实现方法及其基本操作。主要内容包括:1)使用链表结构实现二叉树,每个节点包含数据域和左右孩子指针;2)三种遍历方式(前序、中序、后序)的递归实现方法;3)二叉树的插入、统计节点数、求叶子节点数、求第K层节点数、计算高度、查找特定值等操作;4)层序遍历的实现需要借助队列结构;5)判断完全二叉树的算法。文章通过代码示例和图解详细说明了各操作的实现原理,强调链式结构适用于各种二叉树形式,相比数组实现能有效减少空间浪费。
2025-05-31 18:04:24
1411
25
原创 【数据结构】——二叉树堆(下)
我们前面学习了树的概念和结构,还要树的一种特殊树--二叉树,然后我们学习了堆,知道了堆分为大堆和小堆,接下来我们就使用堆来进行一个排序。
2025-05-27 22:25:11
6204
15
原创 【数据结构】--二叉树--堆(上)
树是一种非线性的数据结构,他是由n(n>=0)个有限结点组成一个具有层次关系的集合。其叫做树,是因为他倒过来看就和一棵树差不多,其实际上是根在上,树枝在下的。树的特点:1、其有一个特殊的结点,称为根结点,根结点没有前驱结点。2、除根结点,其余的结点被分为M(M>0)个互不相交的集合,其中每个集合其又是一棵结构与树类似的子树,每棵子树的根结点有且只有一个前驱,其可以有0个或者多个后继。所以树是递归定义的。如上图所示,树的结构其倒过来就和我们现实生活中的树长得很像了。
2025-05-26 21:43:05
6642
13
原创 【数据结构】——栈和队列OJ
题目的要求很简单,就是要求我们判断其输入的括号字符串是否是有效的括号,那么我们要如何判断呢?我们可以这样,我们遍历出传入的字符串,然后我们创建一个栈,然后如果这个字符是组左括号,那么我们就让其入栈,然后如果是右括号,那么我们就取栈顶的元素和这个右括号进行对比,如果匹配那么就出栈,不匹配的话那么就说明这个字符串不是有效的括号,然后继续进行比较,直到字符串遍历完,那么我们字符串遍历完后,是否就表示我们的这个括号是有效的呢?
2025-05-13 23:53:36
6692
20
原创 【数据结构】——队列
概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先 出FIFO(First In First Out)。
2025-05-12 22:21:00
6009
14
原创 【数据结构】——栈
栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(Last InFirst Out)的原则。栈的插入操作叫做进栈/压栈/入栈,入栈的位置也是在栈顶。栈的删除操作叫做出栈。出栈也是在栈顶。那么我们的栈是要如何进行实现呢?我们实现栈的话有两种:链表和数组。
2025-05-10 23:12:27
5792
10
原创 【数据结构】——双向链表
我们前面学习了单链表,其是我们链表中的其中一种,我们前面的单链表其实全称是单向无头不循环链表,我们的链表从三个维度进行分类,一共分为八种。1、单向和双向可以看到第一个链表,其只能找到其后一个节点,是没办法找到其前面的节点的,其遍历只能从左往右遍历。而我们的双向链表,其节点中,有三个元素,一比我们单向的多了一个,其就多了一共指向前一共节点的指针,我们的双向链表是可以寻找到前一个节点的,其是可以从左往右遍历,也可以从右往左边进行遍历。2、带头或不带头。
2025-05-09 01:28:58
6416
10
原创 【数据结构】——单链表练习(1)
那么根据题目的要求我们大致明白这道题要做什么,就是将一个链表中,和指定的值相等的元素的节点删除,然后返回删除后的新的链表,然后题目给我们传入的参数是链表的头节点和指定的元素。
2025-05-03 03:25:28
6468
18
原创 【初阶数据结构】——顺序表
在上面我们提到了动态顺序表,其有三个成员,第一个成员是一个指针,用来指向开辟的空间,然后第二个成员就是用来记录当前表中的有效元素的个数,第三个成员就表示当前表的容量。其定义如下:然后我们就使用我们的动态内存管理函数来开辟空间,如果忘记的可以往前复习一下,下面我们简单进行复习一下。malloc函数,其是可以申请一块连续的空间,返回的是这块空间的地址。calloc函数,其和上面的函数是一样的功能,就是其参数不一样,第一个参数是要开辟的元素个数,然后第二个参数是开辟的一个元素的大小。
2025-04-19 02:59:22
6282
3
原创 【初阶数据结构】——算法复杂度
数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如:线性表、树、图、哈希等下面我们就要踏上学习数据结构的旅程了,我们这部分主要是通过C语言来学习初阶数据结构,后续我们学习C++的时候,就会继续高阶数据结构和算法。算法(Algorithm):就是定义良好的计算过程,他取⼀个或⼀组的值为输⼊,并产⽣出⼀个或⼀组值作为 输出。
2025-04-15 23:28:44
6137
4
原创 【C语言】预处理(下)(C语言完结篇)
在编译一个程序的时候,如果我们要将一条语句,编译或者放弃编译,那么我们可以使用条件编译,比如调试性的代码,我们在调试完后,将其删去又会很浪费,但是保留又会很难看,影响我们代码的可读性,那么我们就可以使用条件编译,在编译的时候不编译这些调试性代码。例如我们在开头使用了#define定义一个符号,如果我们没有注释或者删除这个符号,那么我们是可以编译里面的调试性代码的,反之就不可以编译。但是这个是不会影响代码的正常运行的。
2025-04-12 16:37:55
1033
4
原创 【C语言】预处理(预编译)(C语言完结篇)
这个关键字我们在前面的学习也已经遇到过了,下面我们来详细学习。其定义常量的语法如下:那么M就是我们定义的常量的名字,100是我们定义的常量的值。我们可以使用#define来定义各种类型的常量,我们使用其定义常量,对于常量的名字有个约定,就是对名字最好使用全部大写。这个定义常量,其本质上是替换,其在预处理后,会将程序中的M替换成100。所以我们使用#define定义常量的时候,末尾不要加分号,因为其会将这个分号也当成常量替换进我们的程序。如下:可以看到此时的编译器已经报错了。
2025-04-10 23:00:43
1100
5
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅