自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机系统概述

通电自检后,BIOS开始读取Boot Sequence(通过CMOS里保存的启动程序,或者通过与用户交互的方式),将控制权交给启动顺序排在第一位的存储设备,然后CPU将该存储设备引导扇区的内容加载到内存中。是伴随着计算机网络的发展而诞生的,能把网络中各个计算机有机的结合起来,实现数据传送等功能,实现网络中各种资源的共享(如文件共享)和各台计算机之间的通信。多道程序环境允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停的,它以不可预知的速度向前推进,这就是进程的异步性。

2024-07-26 17:10:23 1113

原创 【C++】哈希(散列)表

开散列:又称拉链法(链地址法、开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。对于哈希桶,一定要写析构函数,因为开散列会每一个结点可以看作一个链表,默认生成的析构函数只会析构vector自己的空间,这是不够的,还需要删除链表中申请的结点。为了尽量减少哈希冲突,一方面要设计更好的哈希函数,另一方面,由于这样的冲突总是不可避免地,所以还要设计好处理冲突的方法。

2024-07-13 19:30:43 928

原创 【C++】B树及其实现

为了方便学习,我们在这里先将m设为3,这时每个结点能存2个关键字和3个孩子。不过为了方便后续插入,分别额外多开了一个空间。K _keys[M];// 用于存储关键字// 用于存储孩子size_t _n;// 存储当前孩子的数量i < M;++i)_n = 0;B树:有序数组+平衡多叉树;B+树:有序数组链表+平衡多叉树;B*树:一棵更丰满的,空间利用率更高的B+树。

2024-07-06 20:37:42 1874 1

原创 【C++】红黑树及其实现

AVL树和红黑树的插入、删除和查找操作的时间复杂度都是lognlog(n)logn,既然如此,为什么会提出红黑树这一概念呢?AVL树在插入和删除过程中,为了保持平衡性,会非常频繁地调整全树整体的拓扑结构,代价较大,为此在AVL树的平衡标准上进一步放宽条件,引入了红黑树的结构。

2024-06-26 20:08:13 941

原创 【C++】平衡二叉树(AVL树)的实现

_kv(kv),_bf(0){}// 使用三叉链方便后续处理,但要记得维护// 保存键值对int _bf;// 平衡因子parent的平衡因子为2,说明parent的右子树高,设parent的右子树的根为subR当subR的平衡因子为1时,执行左单旋当subR的平衡因子为-1时,执行右左双旋parent的平衡因子为-2,说明parent的左子树高,设parent的左子树的根为subL当subL的平衡因子为-1是,执行右单旋当subL的平衡因子为1时,执行左右双旋。

2024-06-21 17:52:58 902

原创 【C++】二叉排序树的实现及查找效率分析

就维护表的有序性而言,二叉排序树无须移动结点,只需修改指针即可完成插入和删除操作,平均执行时间是O(logn)。二分查找的对象是有序表,若有插入和删除结点的操作,所花的代价是O(n)。但二分查找的判定树唯一,而二叉排序树的查找不唯一,相同的关键字其插入顺序不同可能生成不同的二叉排序树。二叉排序树的删除比较复杂,因为如果删除的结点既有左孩子又有右孩子,为了保持二叉排序树的特性,不能随便找一个子树上的结点来替代删除的结点。连接新结点时,由于不知道新结点是父结点的左孩子还是右孩子,因此还要多加上一句判断。

2024-06-18 15:39:57 1057

原创 【C++】继承

下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。

2024-01-05 23:17:00 961

原创 【Linux】冯诺依曼体系结构、操作系统、进程概念、进程状态、环境变量、进程地址空间

cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

2023-11-19 23:16:41 613 1

原创 【C++】模板进阶

【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误总的来说,模板利大于弊,是C++中很好的一个特性。

2023-06-30 14:48:29 278

原创 【C++】stack、queue和priority_queue的使用及模拟实现(包括deque、仿函数、反向迭代器)

我们通过学习数据结构时知道栈和队列是特殊的线性表,可以通过顺序表或链表来实现,在C++中把这种模式称为适配器模式,用已有的东西封装成你想要的东西。容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的默认底层容器是deque。队列也是一种容器适配器,由于出队列要进行头删,所以队列的底层容器一般是list或者deque,默认是deque。

2023-06-29 00:02:34 299 1

原创 【C++】list的使用和模拟实现

list的底层是一个双向带头循环链表,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素,其遍历只能通过迭代器来实现,范围for的底层也是迭代器。迭代器是所有容器都可以使用的迭代方式。与list类似的还有forward_list,底层是单链表,只能朝前迭代,以让其更简单高效。与vector相比,list在任意位置的插入或删除效率更高,不需要去移动数据。

2023-06-16 06:11:54 1387

原创 【C++】vector的模拟实现

但是当我们实现好这个函数后,可以尝试以下构造一个n=5,val=1的vector,发现会报错,而构造n=5,val='a’的vector却正常,这是因为第一种构造匹配到了前面实现的以迭代器区间作为参数的构造函数,n和val的类型都是int,对于前面的函数模板InputIterator只需要进行一次类型推导,而在现在的构造函数中,int类型需要发生既需要发生类型推导,又要隐式类型转换成size_t,代价很大,所以就匹配到了以迭代器区间作为参数的构造函数。指向最后一个元素下一个位置的_finish,

2023-06-14 18:03:51 1422

原创 【C++】vector的使用

vector就是一个动态顺序表,比起string,它不仅可以存储字符,还可以存储其他的内置类型以及自定义类型。

2023-05-30 17:29:46 954

原创 【C++】string类的模拟实现

我们知道operator+=在容量满了之后需要扩容,如果我们输入的字符串很大,就会频繁的扩容,效率很低,所以我们用buff数组作为缓冲来解决问题:当数据正常时先都装进buff中,如果buff满了,再将buff中的数据一并转入string里。关于流提取,我们知道用cin或者scanf无法拿到空格或者\n,但是我们在循环插入数据时又需要用空格和\n来作为循环结束的标志,所以我们需要用in中的get()函数来读取输入的数据,它能够获取到空格和换行符。我们采用vs的实现方式,底层开辟空间时多开一个空间存放\0。

2023-05-27 22:51:46 403

原创 C++:string类的简单使用

在学习string之前,我们先来了解一下各种编码。

2023-04-18 16:58:24 982 2

原创 模板(一)

class 类模板名// 类内成员定义public :} // 使用析构函数演示:在类中声明,在类外定义。~ Vector();T * _pData;// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表 template < class T > Vector < T > :: ~ Vector() {

2023-02-19 19:58:22 209 2

原创 C++内存管理

/ new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数 A * p1 =(A *) malloc(sizeof(A));free(p1);delete p2;return 0;// 内置类型是几乎一样的 int * p3 =(int *) malloc(sizeof(int));free(p3);delete p4;

2023-02-19 13:06:18 91

原创 C++类和对象(下)

初始化列表:以一个**冒号开始**,接着是一个以**逗号分隔的数据成员列表**,每个“**成员变量**”后面跟一个**放在括号中的初始值或表达式**。

2023-02-17 12:59:00 118

原创 C++类和对象(中)

day = day;} else {cout

2023-02-14 13:12:37 150 2

原创 C++类和对象(上)

/ 类体:由成员函数和成员变量组成 };// 注意分号class为定义类的关键字,className为类的名字{}中为类的主体注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。成员函数名前需要加类名。一般情况下,更期望采用第二种方式。// 我们看看这个函数,是不是很僵硬?

2023-02-12 11:33:09 104 2

原创 在C的基础上进入C++

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。# include # include //定义命名空间 namespace lgr {//别忘了加上lgr::,否则就输出rand()函数的指针了 printf("%d\n" , lgr :: rand);return 0;注意命名空间可以嵌套同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间。

2023-02-06 12:58:40 482 4

原创 Linux环境基础开发工具之调试器——gdb

退出:ctrl + d 或 quit 调试命令。

2023-01-13 12:02:35 97

原创 如何在Linux下使用git

初次在Linux上使用git需要先登录:git config --global user.name “用户名”git config --global user.email “邮箱”

2023-01-12 14:36:00 1263

原创 在Linux上写一个小程序——进度条

因为有缓冲区这个东西,程序运行时,你printf的字符会先存在缓冲区中,等到缓冲区刷新就打印在屏幕上,而\n起到了刷新缓冲区的作用。第二段代码:打印hello world,三秒后hello world消失被覆盖,程序结束。因为\r使光标回到了行首,所以命令提示覆盖了hello world。第一个代码:直接打印hello world!第二个代码:三秒后打印hello world!这样就会先打印hello world,然后三秒后程序结束。第一段代码:什么都不显示,三秒后程序结束。运行上述两个代码,有什么区别?

2023-01-12 14:12:05 369 1

原创 Linux项目自动化构建工具:make/Makefile

上面的文件test的形成依赖于test.c文件,这是一个固定的结构想要执行gcc命令就要给出这样的依赖关系。如果Makefile中由多种依赖关系,那么它只会执行第一种依赖关系,比如此时执行make指令,就不会执行clean。,假设项目内已经写好了一个test.c的文件,我们想使用make指令进行编译它就需要先编写Makefile。然后再使用make,就可以实现自动编译。首先我们要在项目目录内创建一个。

2023-01-08 11:33:04 87 2

原创 Linux环境基础开发工具之编译器:gcc/g++

gcc/g++是一个编译器,可以将程序文件翻译成可执行文件,gcc用来编译c语言程序,g++用来编译c++程序。;注意:-o 选项后面一定要接要生成的文件的名字。

2023-01-07 21:39:32 318 6

原创 Linux环境基础开发工具之编辑器:vim

简介:学习vim编辑器主要是为了在Linux上,比起用nano写入,vim提供了语法加亮,报错等功能。vi和vim都是多模式编辑器,vim是vi的升级版本,vim不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、mac os、windows。

2023-01-05 10:45:37 137 2

原创 Linux环境基础开发工具之软件包管理器:yum

在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。软件包和软件包管理器,就好比“APP”和“应用商店”这样的关系。

2023-01-04 22:34:18 147 4

原创 Linux入门:常见指令和权限

cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容。但这有一个问题,只要用户具有目录的写权限,用户就可以删除目录中的文件,不论这个用户是否有这个文件的权限。,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。

2023-01-03 12:11:36 214 5

原创 内部排序代码实现

【代码】内部排序代码实现。

2023-01-01 20:40:06 134

原创 二叉树(2)-二叉树链式结构的实现

除了前面三种遍历以外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程就是层序遍历。遍历是二叉树上最重要的运算之一,也是二叉树上进行其他运算的基础。注意:上述代码并不是创建二叉树的方式,真正创建二叉树的方式后序讲解。通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树。学习二叉树的结构,最简单的方式就是遍历。

2022-12-22 14:51:06 110 1

原创 二叉树(1)-堆

对于深度为K的,有n个节点的二叉树,当且仅当其每一个节点都与深度为K的满二叉树中编号从1至n的节点一一对应时称之为完全二叉树。下面我们给出一个数组,这个数组逻辑上可以看做一棵完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆,根节点左右子树不是堆,我们怎么调整呢?通常的方法是链表中每个节点由三个域组成,数据域和左右指针域,左右指针域分别用来给出该节点左孩子和右孩子所在的链结点的存储地址。删除堆是删除堆顶的数据,将堆顶的数据跟最后一个数据交换,然后删除数组最后一个数据,再进行向下调整算法。

2022-12-16 16:08:14 143 7

原创 栈和队列的实现

栈和队列实现

2022-12-10 15:01:19 185 1

原创 一篇文章带你学完链表基础(C语言)

本文主要讲述了单链表和双向带头循环链表的实现,其中单链表尤为重要,在笔试和面试中经常会考到,建议各位读完本文多去刷一些有关单链表的题。

2022-11-24 00:38:23 598 7

原创 数据的存储

C语言数据的存储

2022-09-21 21:17:31 128 2

空空如也

空空如也

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

TA关注的人

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