自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 红黑树介绍与模拟实现(insert+颜色调整精美图示超详解哦)

红黑树是平衡二叉树的一种,他在满足二叉搜索树特性的基础上,给每个结点增加了一个颜色属性,包括Red与Black;并要求从根节点到一个叶子结点形成的任意一条路径中,通过对结点颜色的限制规则,没有任何一条路径回比其他的路径长一倍

2024-04-04 19:04:07 1516 18

原创 AVL树的介绍与模拟实现(insert+旋转调平精美图示超详解哦)

AVL树在满足二叉搜索树条件的基础上,给每个结点中增加了一个平衡因子(这个平衡因子的值是该结点左右子树的高度差)。AVL树要求平衡因子的绝对值小于等于1,即任意一个结点左右子树的高度差不超过1。通过降低树的高度,从而达到减少平均搜索时间的效果(在这里做例子的平衡二叉树是按照大小次序依次插入的结果)

2024-02-02 04:12:54 1082 13

原创 反向迭代器的介绍与实现(超详解哦)

迭代器(iterator)提供一种通用的方法,使其能够依序访问某个容器所含的各个元素,而又无需暴露该容器的内部表达方式。有利于算法于容器的泛化。反向迭代器的访问方向与迭代器相反:反向迭代器的`++`操作使其向前前进一个元素。反向迭代器本质上其实是对普通迭代器的封装**:反向迭代器的`++`就是底层迭代器的`--`。

2024-01-24 02:24:13 997 5

原创 binary_search_tree的介绍与实现(二叉搜索树精美图示详解哦)

之前我们了解到的效率很高的搜索算法就是二分查找算法,在二分查找算法下,搜索的时间复杂度可以达到 O(logN)。但是二分查找有一个很大的限制条件,即它必须要求数据有序。但是对于二叉搜索树而言,在建立二叉搜索树结构后,就可以实现查找效率为O(logN)。二叉搜索树即在二叉树的基础上满足:对于任何一个根结点,若左子树不为空,它的左子树的值全部小于根节点若右子树不为空,右子树的值全部大于根节点。这也就意味着,如果我们中序遍历一个二叉搜索树,得到的一定是一个递增序列。

2024-01-22 04:50:23 1032 9

原创 priority_queue的使用与模拟实现(容器适配器+stack与queue的模拟实现源码)

优先级队列与队列类似,我们不能随意访问其中的元素,只能访问队头的首元素。但是在优先级队列中,根据某种优先级(某个标准),任意时刻队列的首元素都会是整个队列中优先级最高的元素(默认情况下队头的元素为最大的元素,可以通过迪三个模板参数来调整)

2024-01-20 02:43:23 1033 8

原创 Linux进程【3】fork函数与进程等待(超详解哦)

`fork`函数在Linux中是一个非常重要的系统调用接口!它用于在当前的已有进程中创建一个新的进程(子进程)。再由父子进程并发地执行不同地代码块,就相当于父子进程给子进程派了一块代码让他去执行。在子进程执行完代码块后,应该给父进程一个发聩,这个时候就需要父进程去等待子进程,然后回收子进程,以免形成内存泄漏等问题。

2024-01-18 00:08:00 1032 8

原创 Linux进程【2】进程地址空间(+页表详解哦)

所谓的程序地址空间的概念是不准确的,准确的说法应该是进程地址空间。这份空间是虚拟地址,对每一个进程都有一份虚拟地址空间。这份虚拟内存对于每一个进程而言都是相同的,都包含内核空间与用户空间以及更里面的分区

2024-01-15 20:04:31 1195 7

原创 C++多态(+多态原理超详解哦)

这种同样的事件对不同种类的对象会产生不同的状态的不同对象执行多种状态的行为,就是多态。在上一篇中详细介绍了继承的行为, 继承中的父类与子类就是天然的两种不同对象,并且有着密切的联系。所以多态就天然的在继承下实现。

2024-01-10 07:36:36 1155 6

原创 C++继承(+继承原理超详解哦)

继承是面向对象编程中一种代码复用的重要手段。继承是在保持原有类(基类或父类)特性的基础上进行拓展,增加属性或方法,从而产生一个新的类(派生类或子类)。继承体现了面向对象编程的层次型结构,是由简单到复杂的过程

2023-12-17 07:14:16 2135 13

原创 Linux进程【1】进程概念(含task_struct源码)

操作系统在管理这些进程时,其实只需要将这些进程的属性数据组织为一个结构体,再对这些结构体进行管理即可。而不需要管理这些进程对应的大量代码。从操作系统的角度来讲,进程也可以被定义为程序属性结构体和对应代码的集合

2023-09-21 00:27:37 832 11

原创 list【2】模拟实现(含迭代器实现超详解哦)

我们模拟实现的 list 底层是一个带头双向循环链表在实现list时,我们首先需要一个结构体以表示链表中结点的结构`list_node`,大致包括数据与指向前后结点的指针:

2023-09-03 21:18:16 2191 30

原创 list【1】介绍与使用(超详解哦)

list适用于需要经常在任意位置插入删除大量数据,且不需要经常访问任意位置元素的数据的存储list是一个类模板,可以支持存储任意类型

2023-08-28 21:35:23 950 21

原创 Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

在本篇文章中将继续来介绍Linux中的工具:调试器gdb与项目自动化构建工具make/Makefile

2023-08-18 02:01:36 1373 23

原创 vector【2】模拟实现(超详解哦)

vector中是通过三个迭代器 _start、_finish、_endOfStorage分别指向数据块的起始位置、有效数据末尾的下一个位置、存储容量末尾的下一个位置来管理数据的。vector中迭代器就是原生指针,本质上就是使用三个指针来管理动态申请的存储数据的空间。

2023-08-16 16:39:31 874 22

原创 vector【1】介绍与使用(超详解哦)

vector是可变大小数组序列容器。vector的底层是一块动态申请连续的空间,与数组类似,vector可以通过下标高效的访问数组中的元素;同时由于是动态申请的空间,可以根据需求扩容,弥补了数组大小固定的缺陷。

2023-08-12 23:14:07 700 15

原创 string【2】模拟实现(超详解哦)

在本篇文章中就要来模拟实现一下string类,以帮助我们更好的理解与使用string在我们模拟实现的string中,要具备库中string所具有的主要接口,例如:默认成员函数、迭代器、容量、元素访问、运算符重载、非成员函数。其中只实现这些函数的常用重载形式。

2023-07-31 01:37:40 571 20

原创 Linux工具【1】(编辑器vim、编译器gcc与g++)

vim(vi improved)编辑器是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转、语法高亮等方便编程的功能特别丰富,在程序员中被广泛使用在vim中编辑代码后,要执行代码就需要编译器,在Linux中使用`gcc`与`g++`编译C与C++代码

2023-07-24 22:43:48 795 18

原创 string【1】介绍与使用(超详解哦)

在C语言部分,我们对于字符串的操作经常借助C标准库提供的一系列操作字符串的库函数(`strlen等`)来实现的。但是,这样去操作字符串,函数与其操作的字符串是分离的,不符合面向对象的思想,使用时较为麻烦;而且需要自己管理底层的空间,容易导致越界访问的问题。在C++标准库中提供了管理字符串的string类,封装了方法与元素使操作字符串时更加方便

2023-07-15 23:24:01 935 19

原创 模板初识与STL简介

泛型编程就可以通过只写一份对所有类型通用的代码,在需要使用的时候由编译器生成相应的代码,是代码复用的一种手段。模板是泛型编程的基础

2023-07-01 23:08:16 381 16

原创 Linux权限管理(超详解哦)

所有者、所属组、其他用户只是单纯的角色,它其实并不能决定某个用户就一定对一个文件有某种权限。用户对文件的权限不仅取决于这个用户对于这个文件的角色,还取决于文件的属性,即文件赋予角色什么权限。结合两者才能得知一个用户对于一个文件的权限

2023-06-20 22:16:26 8571 15

原创 C/C++内存管理(new&delete详解)

对于内置类型,使用malloc与free还可以勉强达到我们的需求,但是对于自定义类型,比如类类型,我们在申请空间的时候,还需要初始化类对象,malloc显然不能满足我们的需求。而new在动态申请空间之后,还会调用默认构造函数;delete在调用析构函数之后才会释放动态申请的空间。

2023-06-19 00:31:32 541 4

原创 Linux常见指令(超详解哦)

Linux与我们熟悉的Window都是操作系统,我们经常在Window操作系统的图形化界面中进行操作。其中基本的比如创建一个文件夹、在文件夹中放置文件、修改文件名、向文件中写数据、移动文件的位置、查看文件的信息、删除文件等,我们也可以打包压缩文件、解压缩文件。只是在Linux的命令行中,我们需要通过指令来实现这些操作。在本篇文章中就来介绍这些基本指令

2023-06-16 01:39:31 973 13

原创 类和对象【5】日期类的实现

在了解了类和对象的基础知识后,我们就可以简单实现一个日期类(前期的知识介绍链接如上,一些基础知识本文就不过多赘述)

2023-06-09 19:54:14 875 16

原创 类和对象【4】static成员、const对象、友元

static成员只是在类中声明,在类外定义,定义时不添加static关键字,不占用该类型对象的空间。static成员函数与一般成员函数不同,它没有隐含的this指针的传参,因此不能访问私有的成员变量。但是它可以正常访问static成员变量;C++提供了用const修饰this指针的方法,即在参数列表后加上const;可以使用friend关键字使一个在外部声明的函数作为类的友元函数。

2023-06-03 21:27:03 645 12

原创 类和对象【3】初始化列表

在构造函数体中对成员变量的初始化其实是属于对它们进行赋值操作而不是定义。那么对于一些只能在定义时给值的变量,它们在定义之后就不能改变(例如const变量与引用变量)或者一些没有默认构造函数的类类型成员变量,构造函数中无法对它们进行定义。用构造函数显然就不能满足我们的需求。那么在类对象实例化时,这些成员变量是在哪里定义的呢?定义时又是怎么对他们进行初始化的呢?

2023-05-25 23:10:58 903 4

原创 类和对象【2】默认成员函数

对于内置类型,有操作符可以实现初始化、赋值、等操作。但是对于自定义类型,要实现初始化、赋值、销毁等操作就需要我们通过函数去实现了。但是每个类都实现并且使用时显式调用这些基础普遍的函数是很麻烦的,所以在一个类类型被创建时,会自动生成6个默认成员函数:**构造函数、析构函数、拷贝构造、赋值重载、取地址与const取地址**,并且在需要用到这些功能的地方自动调用。本篇文章重点介绍前四个默认成员函数:

2023-05-18 23:52:45 766 10

原创 类和对象【1】初识

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。用类将对象的属性与方法结合到一起就是封装,并且通过访问限定隐藏属性以及方法的细节,只向用户提供接口,使用户更方便的使用类:

2023-05-14 17:17:40 316 14

原创 C++入门(命名空间、缺省参数、函数重载、引用、内联函数)

C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。在前面对C语言的学习中,相信大家对用C语言编程已经很了解了,所以就不赘述基础的语法了。在本篇文章中将介绍一些新知识,可以让你初步上手C++!

2023-05-07 18:22:53 405 5

原创 【排序】归并排序(递归+非递归图示详解哦)

归并排序需要一块与数组大小相同的空间,用于临时存储归并后的数据。排序时,先将整个数组平分为两份,再分为4份……以此类推,直到不能再平分后(区间只剩一个元素)。向上归并,即将两个区间归并到临时空间中的对应位置。再将临时数组中对应区间中已经排序好的数据拷回原数组。一直向上归并,直到排序完成。

2023-04-28 23:48:38 1151 5

原创 【排序】冒泡排序与快速排序(三个版本+非递归图示详解哦)

在这篇文章中将介绍冒泡排序与快速排序:它们都属于交换排序,即通过两两比较交换,将一个元素放到其正确的位置上,最终实现排序。

2023-04-23 00:22:10 458 10

原创 【排序】直接插入排序与希尔排序(图示详解哦)

直接插入排序与希尔排序都属于插入排序的一种:这两种排序的思想都是从待排序的部分中依次取出元素,插入到它前面的已排序部分中的合适位置。迭代,使整个数组有序。

2023-04-18 23:18:47 241 8

原创 【排序】选择排序与堆排序(图示详解哦)

在本篇文章中要介绍的是选择排序与堆排序,它们都属于选择排序。这两种排序算法的思想都是从待排序的数据元素中选出最大或最小的元素,放在序列的起始位置或末尾位置,以此来使整个序列有序。

2023-04-17 11:50:47 199 3

原创 二叉树练习题(递归展开图详解哦)

在这篇文章中要介绍二叉树的链式访问,但是由于链表结点是难以随意访问二叉树中的结点的,用链式的二叉树进行增删查改其实是没有多少意义的。在本篇文章中就介绍几道二叉树链式结构的题目:单值二叉树、二叉树的最大深度、翻转二叉树、相同的树。

2023-04-10 00:11:31 406 8

原创 堆及其接口实现(图示超详解哦)

如果有一个数据的集合,把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:根结点的值始小于(或大于)子结点的值。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆:(需要注意的是,堆是一种完全二叉树。所以我们在表示堆时,用顺序表来存储会更方便)

2023-04-03 23:50:33 414 18

原创 树与二叉树(图示超详解哦)

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树由根结点与子节点组成,一个根结点可以有多个子节点;中间的子节点又是子树的根结点;最后的结点没有子节点,为叶子结点:

2023-03-27 23:46:46 623 10

原创 设计循环队列(图示超详解哦)

我们需要实现循环队列的如下接口:MyCircularQueue(k): 构造器,设置队列长度为 k;Front: 从队首获取元素。如果队列为空,返回 -1;Rear: 获取队尾元素。如果队列为空,返回 -1;enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真;deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真;isEmpty(): 检查循环队列是否为空;isFull(): 检查循环队列是否已满。

2023-03-25 20:39:41 955 6

原创 用栈实现队列(图示超详解哦)

通过两个栈实现队列存储数据的特点,即先进先出:我们需要实现基本的队列操作push、pop、top、empty、free:void push(int x) 将元素 x 推到队列的末尾;int pop() 从队列开头移除并返回元素;int peek() 返回队列开头的元素;bool empty() 如果队列为空,返回 true ;否则,返回 false。

2023-03-25 17:12:11 394 1

原创 用队列实现栈(图示超详解哦)

题目描述很简单:通过两个队列实现栈存储数据的特点,即先进后出:我们需要实现push、pop、top、empty、free:void push(int x) 将元素 x 压入栈顶;int pop() 移除并返回栈顶元素;int top() 返回栈顶元素;bool empty() 如果栈是空的,返回 true;否则,返回 false。

2023-03-25 00:44:19 738 4

原创 队列及其接口实现(超详解哦)

队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列具有先进先出的特点FIFO(First In First Out)入队列

2023-03-22 17:26:20 609 7

原创 栈及其接口实现(超详解哦)

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。在栈顶插入元素称为压栈;在栈顶删除元素称为出栈。访问元素时,只能访问栈顶的元素。比如在栈中依次存压入了1、2、3、4这4个数据,当要删除元素时,只能从栈顶依次删除4、3、2、1。

2023-03-20 22:46:58 323 8

空空如也

空空如也

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

TA关注的人

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