自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [Linux]一篇文章带你全面理解信号

在操作系统(OS)中,信号(signal)是一种进程间通信(IPC)的机制,特别是在Unix、类Unix以及其他POSIX兼容的操作系统中。信号是一种异步的通知机制,用来提醒进程一个事件已经发生。信号是系统提供的一种让用户(进程)能够给其他进程发送异步信息(可以理解任意时间都可以发送,接受信号的进程无法预料到信号到来的时间)的方式信号的发送,是为了让接受信号的进程做一些自己执行流之外的操作(如:你正在打游戏,家里人喊你吃饭,这就是给你的一个信号)

2024-05-15 12:22:22 829

原创 [C++]哈希应用-海量数据处理

(主要)内存的IO速度远超硬盘的IO速度,所以单次硬盘IO于多次硬盘IO的速度差别是十分大的在硬盘中,各种数据结构的实现较为麻烦(如map、priority_queue…)

2024-05-09 23:41:50 833

原创 [C++]哈希应用-布隆过滤器快速入门

布隆过滤器(Bloom Filter)是一个由布隆在1970年提出的概率型数据结构,它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器的主要特点是高效的插入和查询,可以用于检索一个元素是否在一个集合中。对于一个数据的查找,会先去布隆过滤器中进行多个映射点的查询。

2024-05-08 20:49:16 535

原创 [Linux]一篇文章带你搞定软硬连接

它的应用场景非常广泛,比如当需要在不同的目录中使用相同的文件时,只需要在某个固定目录放上该文件,然后在其他目录下使用软链接链接该文件,这样既节省了磁盘空间,又方便了文件的访问。如果你这个时候去删掉他们之间的任意一个后,再去打开另外一个,发现内容还是没有变(就好像删除的操作白做了一样),这是由于硬链接的特性,会在后面进行叙述(不同的是,如果你删除了被软链接链接文件,则你会发现软链接就没有用了,打不开对应的源文件)硬链接并不会拷贝文件,因为开销太大,相反它利用了引用计数的思想,来实现链接,听我娓娓道来。

2024-04-14 15:26:26 675 1

原创 [C++]从0-1实现红黑树封装map&set

是一种树形数据结构,其是由改良而得的。AVL树的缺陷:对于AVL树,他的发明人真的十分厉害,它通过调整平衡因子使树达到平衡,从而使高度达到最低,大大加快了遍历速度。但是有一种开销却在不知不觉中产生:调整平衡因子过程中的旋转开销。而红黑树通过减少旋转次数来使这种构造开销降低,但是从理论上来讲,红黑树的遍历肯定没有AVL树快,但是他的构造相比AVL树就少了数次的旋转,开销大大降低。由于其根本上还是一个平衡二叉树的属性,所以他的旋转操作与AVL树大差不差,整体思路也大致相同,唯一不同的就是其旋转的条件。

2024-04-13 23:07:38 666

原创 [C++11]右值引用

这就和历史有关,由于C++的代码存量大,许多的代码在当初书写时并没有右值引用的提出,所以C++11为了向前兼容,就会根据情况判断是否隐式调用move。总结:两者的底层都是指针,唯一不同的就是他们所指的位置。当然,我们所写的右值引用版本的拷贝构造当然用的是方法2,而return时move(v)就是为了让这个v的右值版本去return(move不修改v的原本属性)按照我们前面所说,v返回的时候先调用移动拷贝,然后再调用构造来构造ret,但是编译器为了更高的效率,还会在此基础上进一步优化。

2024-03-31 15:56:52 956 1

原创 [C++11]可变参数模板

让我们先见一下可变参数模板//...一个可变参数模板(variadic template)就是一个接受可变数目参数的模板函数或模板类。可变数目的参数称为参数包(parameter packet)。模板参数包(template parameter packet),表示零个或多个模板参数;函数参数包(function parameter packet),表示零个或多个函数参数。让我们带着以下几个问题去学习可变参数模板可变参数模板如何实例化如何书写可变参数模板可变参数模板的运用—emplace系列。

2024-03-31 15:56:39 783

原创 数据结构课设C++_迷宫游戏

该课设内容于初学C++时所做,代码指令仍有很大提升余地!4大建迷宫算法DFS、(Random)Prim、十字分割法、(Random)Kruskal1种寻路算法A*寻路easyx画迷宫(作者现学现做的,如有不足还多包含)

2024-03-13 20:22:31 1050

原创 [C++读书笔记]常量表达式&constexpr

被constexpr修饰的变量本身是不能修改的,但是它指向/引用的非const/非constexpr对象则可以被修改所以如果你不想指向/引用的对象可以被修改,要么给该对象加上const,要么给该对象加上constexpr。

2024-03-13 20:21:43 897

原创 [Linux]如何理解kernel、shell、bash

kernel是指操作系统中的核心部分,用户一般是不能直接使用kernel的。从上图中的grep指令(最后一行)中可以看出,每一次进行查找指令时,都会创建一个进程来执行查找操作,而这个进程的父进程就是bash。是为了预防用户的一些风险操作。其作用是将用户的指令翻译给kernel进行处理,以及将kernel的处理结果翻译返还给用户。每当启动一个命令行时(复制了会话窗口),都会创建一个bash进程(下图可以看出,对于每一个bash进程,他们的父进程的pid相等,说明bash是同一个进程创建的子进程)

2024-03-02 20:34:19 640

原创 [C++]AVL树怎么转

一提到AVL树,脑子里不是旋了,就是悬了。AVL树之所以难,并不是因为结构难以理解,而是因为他的旋转。bf[-1,1]AVL树是二叉搜索树的衍生,其名字来源是根据两位俄罗斯的数学家和E.M.Landis,他们在1962年发明的一种用来解决二叉搜索树在极端情况下时间复杂度变为O(n)的情况。而其解决该情况的方法便是:通过旋转旋转来调整二叉搜索树的平衡。

2024-03-02 20:33:45 1024

原创 [C++]STL的map如何重载[]

解引用后,调用其第二个元素(key-value中的value),对其++,这样就可以使得该元素的计数+1(即map中value值+1)。如果该元素是第一次插入,则这个解引用的值是0(当类型是内置类型时),对其++,也变成了1。是一个迭代器,指向的内容有两种可能:1、如果map中在插入前没有该元素,则指向我将要插入的pair(即刚刚创建的pair)2、如果map中在插入前已经有了该元素,则指向map中的这个元素(这个元素也是一个pair)调用的是步骤2返回的pair的第一个元素,是一个。

2024-02-29 17:23:44 973

原创 [Linux]文件基础-如何管理文件

fopenfwritefreadfclosefseek那么深入到操作系统层面,看看OS是如何接收C语言的指令并完成这一些列函数操作的!

2024-02-24 18:31:30 837

原创 二叉搜索树删除操作的递归与非递归写法

对于二叉搜索树的删除操作,主要分为以下3种情况讨论:1、删除的结点没有左右孩子2、删除的结点只有一个孩子3、删除的结点有左右孩子。

2024-02-12 21:44:51 446

原创 [C++]单/多继承体系中的虚函数表

对于单继承体系中的基类派生类中的虚表关系如下:基类有虚函数,所以基类有一个自己的虚表指针,指向自己的虚表,虚表中存放的就是func1()的地址。派生类继承了基类的虚函数,所以有一个自己的虚表指针,指向自己的虚表,因为派生类重写了基类的虚函数,所以虚表中func1()函数的地址与基类不同。同时派生类又增加了一个虚函数,所以他的虚表里面有两个函数地址。

2024-02-04 21:17:43 930

原创 [c++]多态的原理

OOP的核心思想是多态性。多态性这个词源自希腊语,其含义是“多种形式”。我们把具有继承关系的多个类型称为多态类型,因为我们能使用这些类型的“多种形式”而无须在意它们的差异。引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。在C++语言中,当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定。上述内容表明,C++中多态的原理与动态绑定联系十分密切。

2024-02-04 15:29:11 878

原创 手搓反向迭代器

对于这一对运算符,他们要做的正好和符号相反,++要实现的实际上是正向迭代器的- -,所以实现起来也很简单,反向迭代器的++调用正向迭代器的- -,反向迭代器的–调用正向迭代器的++

2024-01-26 15:39:13 880

原创 迭代器失效

迭代器(iterator)是一种用来访问容器的工具(其底层就是一个指针、或者是一个被封装的指针),对于每种容器,STL都会提供对应的迭代器,而我们对这些容器内容的访问,就转变成对迭代器的遍历,进而实现对于不同容器内元素的访问方式统一。

2024-01-20 11:31:37 378

原创 僵尸与孤儿(Linux下各进程状态的查看)

僵尸与孤儿(Linux进程的状态)

2023-12-10 11:01:25 1066

原创 C++多文件编译时报错解决方案(.h.cpp.cpp)

该情况是因为缺省参数同时用在了定义和声明的参数里面(C++不允许声明和定义同时给缺省参数)在定义里面去掉缺省参数(一般不会在声明的时候去除缺省)​报错如图,这种错误第一次见到都会无从下手其实错误很简单,就是包含头文件的时候,如果头文件里面有全局、静态变量/函数,那么就会导致这个变量/函数会被每个.cpp文件包含一次。这就导致在链接的时候,会发生重定义现象(上图也表明了是在链接的时候出的错)将该变量/函数放入**.cpp**文件中。

2023-12-02 15:19:04 1351

原创 make/Makefile

平时在Linux下写C/C++代码代码是,是否总会遇到一个问题:对于我们写好的一个code.ccode.cpp文件,我们想要运行的时候,必须要通过、**g++**来编译这就导致每次都需要输入以下代码,才能生成对应的可执行文件:对于小工程这样写自然没有问题,但是如果这个工程的文件有呢?那岂不是每次修改了任意一个文件的内容都要重新写一遍​从而对于以上的代码:只需要一个make指令就可以完成编译,又只需要一个make clean指令就可以完成清理。

2023-11-27 21:56:15 908

原创 C++默认成员函数(构造,拷贝构造,析构...)详解

完成初始化任务上图分为重点重点从函数的中可以看出内置类型:int/double/char/指针…(原生定义类型)Tips:在C++11后,编译器支持在函数声明处给缺省值来初始化,这点会在后面的初始化列表提到。

2023-11-10 21:50:44 84 1

原创 C++传引用

是定义一个新的变量,使得其地址处存的值等于a。是对a的一个引用,此时c的地址就是a的地址。对c做改变,就是对a地址处的值做改变。对b做改变,改变的是b地址处存的值。指针可以不初始化,让他指向随机值。指针可以不初始化,让他指向随机值。1、引用必须初始化,应该写做。1、引用必须初始化,应该写做。

2023-10-31 14:47:10 46 1

原创 Linux文件属性

后文围绕着上图解释Linux中的文件属性: 在我们常见的windows下面,我们区分文件是通过他的后缀 而在Linux里面,文件类型的区分不通过后缀,而是通过“前缀” Linux中把访问者分为3类:拥有者,所属组,other 文件权限主要分为3类:r(可读),w(可写),x(可执行)

2023-10-28 11:35:40 42 1

原创 传参时:传值、传址、传引用的汇编指令

1、传值传参:把实参的数据拷贝一份,放进寄存器,然后赋值给对应的形参把x,y的值,分别放入一个寄存器里面(后面用call调用函数)然后调用函数创建栈帧的前两步就把寄存器edx,ecx的值放进对应的a,b的位置了(这里0x000000DAF16FF510和0x000000DAF16FF518就是后面a,b的地址)进行加法操作int c = a + b:分别将a、b的值放入ecx、e

2023-10-28 11:05:22 254 1

原创 C++ 改进 C 内容之——inline(内联函数)

可以把内联函数就理解成一个宏,碰到add就替换掉他因为内联函数是直接替换函数的调用、链接的时候不可能生成地址,所以如果定义在第3个文件中,那么这个函数是没有地址的,链接的目的就是找函数地址,这样就发生了:只有add函数的声明,而没有定义,所以就会报错。

2023-10-19 12:42:27 248 1

原创 八大排序时间复杂度与稳定性

因为每一趟排好一个数据后,会把这个数组一分为二,而被分成的这两个数组总元素少1(可忽略,因为到最后这个总元素不会相差原始元素个数太多,若差10则说明有1024个数据)。用二分法,类比二叉树。n个数据,总共分成了 log n 层,每次都要对上一层的数据全部处理完,才能形成了新的下一层的新数据,再来进行下次的处理。每一趟的这一个待插入数据,都要向前挨个找,找到满足的为止,最多走 n-i-1 次,最少直接插入。每一趟能排好一个数据,一共n个数据,如果前n-1个都排好了,那么最后一个就不用排了。

2023-10-06 23:20:48 7155 1

原创 一篇文章解决二叉树递归问题

由于每棵树的左右孩子节点都可以构成一棵新树,所以我们就递归左右孩子节点(root->left 、root->right)直到左右孩子都满足返回条件时递归停止。可以形象的比作把任务交给孩子去做,然后孩子又交给他的孩子去做,直到最后的孩子没有孩子了,就自己做了(递归开始返回)你会成功free掉他的左孩子,但是当你想找右孩子时,会发现节点已经被free掉了,找不到右孩子。很简单:遍历一遍,把每个节点都遍历到,每次遍历到的节点,我们都把他删掉,就实现了。每个节点都可以当作一个根节点,并和他的孩子节点构成一棵树。

2023-10-05 12:17:58 76

原创 八大排序之一:堆排序(详解)

实际上:{ 1,7,9,2,0,5,10 } 我们认为:{ 1,7,9,2,0,5 }再多次对剩下的数据继续进行建堆,就可以选出第2大/小的,第3大/小的......可惜这样的排序,不会修改原数组,如果需要修改原数组,则还需要进行一遍覆盖。以上就是堆排序的全部内容,如果您有什么问题或者建议,随时欢迎与作者讨论!并不是有序的,这是因为我们还没有进行排序,只是进行了建堆。:继续对剩下的元素 {9,7,5,2,0,1} 进行。建好后的堆是 { 9,7,5,2,0,1 };

2023-09-20 11:05:44 2986 2

原创 树的应用之——前缀码

但是前缀码的规则,因人而异,因专业而异,不同的受众人群会有不同的使用习惯,这就导致了可能。我们可以得出如下几点。以上就是前缀码的知识,希望对您有所帮助,如有遗漏或不足,欢迎和作者讨论!当我们想输入“I am a freshman”时,我们需要用。而我们常见的编码都是有默认规则的(以下是举例,以实际为准)可以从任何二叉树来构造一个前缀码,其中每个内点的。当我们想输入更多数据时,我们需用更多位来保存。(这里我们暂且忽略空格)来保存该数据。当我们想输入“eat”时,我需要用。对于甲来说:010110表示eat。

2023-09-16 15:35:15 1385 4

原创 栈实现队列 & 队列实现栈

当stack2中的元素pop完时,我们就再进行一个翻转,将所有压进stack1的元素再次翻转到stack2中,便又可以进行出栈了。个元素入到空队列中,剩下一个没有移动的元素直接从原队列头删。这样翻转后的结构,便可以轻松用pop出掉最先进来的元素。我们选用两个队列,实现一个”无用数据”的”转移“。所以我们选择用两个栈,来使数据形成一个。而push就是正常的入栈,一个劲往。有了以上信息后,我们就可以实现用。因此,实现该功能的核心内容是判断。变量,来记录栈内的元素个数。”(先进后出)的数据结构。

2023-08-14 22:10:11 69

原创 C语言在编译阶段的那些事

目录编译环境和执行环境集成开发系统编译期间文件后缀转换过程预编译编译汇编链接 简单来说:就是这个玩意给你把东西整合了。一键就可以执行很多操作,如vs2019 集成开发系统=编译器 + 链接器 + 调试器但我们在这样的集成开发环境中,不方便展示各个过程,所以你如果想用vs测试下图,那可是痴人做梦 以下的具体过程均是Linux的gcc编译器下演示 ​ 最后就是交给操作系统,来实现程序的运行咯!

2023-07-23 19:13:42 32 1

原创 C语言:文件操作

目录1.我们学习代码的目的是什么呢?2,打开文件3,读写文件 3.1顺序读写 3.1.1写入文件 3.1.2读取文件 3.2随机读写4.关闭文件无非就是想写出一份自己喜欢的东西,一份属于自己的东西。而要实现这点,我们不仅要会运用内存,也要学会如何利用储存,而文件操作就可以联系两者。 我们先来看一段简单的代码有如下表格: OK,既然我们能够实现打开文件,那么下一步就是往文件里面写东西或者读取文件里面已经

2023-07-21 21:33:49 167 1

原创 动态内存开辟易错点

动态内存开辟的空间属于堆区在堆区开辟一块长为 ‘size’ 字节的空间,返回该空间的首地址在堆区开辟一块空间,一共含num个元素,每个元素占用size字节将原来开辟的动态内存空间进行扩大/缩小操作,ptr是原来开辟的空间首地址,size是要改变的字节数,例:-20-----将空间减小20个字节将开辟的空间还给操作系统,若失败,则返回空指针。

2023-07-16 11:01:00 45 1

原创 string.h文件下的memchr、memset、memmove、memcpy、memcmp,以及自定义实现同功能函数

int i = 0;for (i = 0;i < size;i++)

2023-07-15 11:07:41 222 1

原创 C:浮点型(float,double)在内存中的存储

其输出结果是啥呢?真是离谱他妈给离谱开门----离谱到家了!那么为什么会发生这种情况呢?

2023-06-01 23:04:25 1173 1

原创 C语言——实现扫雷游戏

是款大家十分熟悉的游戏那么今天我们就来创建一个属于自己扫雷游戏(如想拷贝,建议从代码仓库拷贝)我们这里将全部代码分成了三个部分,分别是(存放main函数和game函数(游戏主体框架))(自定义库,包含了对game.c的引用)(game函数的各个部分的具体实现)

2023-05-27 14:28:10 158 1

原创 幼儿版五子棋----三子棋的实现

2.玩家选择项的实现,以及循环结束条件(该代码只要不选择停止,将会一直进行游戏),game()为进入游戏主体代码,后面开始完成该代码。对于编程小白来说,能做一款属于自己的小游戏是一场无与伦比的自豪体验,而三子棋的出现,则满足了编程小白实现了这个梦想。假设我们想要一个正方形棋盘,我们选择用宏定义的方式来设计棋盘大小,然后初始化棋盘元素,这样便于修改棋盘大小。4.电脑移动,此处需要注意一点,如何实现电脑的随机落子,这里我们用rand()函数实现,在正式敲代码前,我们要先理清楚模块,这点对我们后来的。

2023-05-10 13:31:56 66 2

原创 辗转相除法求最大公约数

由此可见,a和b都是d的倍数,所以d是a和b的最大公因数(最大是因为我们在第3步时就停止了分割线段,此时恰好整除,所以是最大)我们以及对求最大公因数有了形象上的了解,那么下面要做的就是将其写成代码。最后知道while(c=a%b)为0时,跳出,此时的b就是最大公因数。我们做了一个交换,然后再次进入while循环,执行b%c,依次类推。因为b是由c段和d段构成的,所以b=c+d,即。由于a是由b段和c段构成的,所以a=b+c,即。出来(即取数b,和余数c出来),} //核心代码。a%b就是c段的长度,

2023-04-15 16:28:55 503 11

原创 scanf的返回值

那么scanf的返回值是什么呢?查了CPP的解释后,返回值就是返回的是scanf读取的数据的个数。这个概念可能比较抽象。先看如下示例:

2023-04-08 10:58:13 5073 10

空空如也

空空如也

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

TA关注的人

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