自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux 信号

设定闹钟是再OS内部,OS内可能有很多进程使用闹钟,所以OS要管理所有的闹钟,先描述,再组织,所以内核中一定要有描述闹钟属性的结构体,并用特定的数据结构组织起来,这里可以使用小根堆来对闹钟进行管理。),并保存在指定寄存器中,当中断发生时,CPU会暂停当前正在执行的程序,并保存当前进程的上下文数据,然后查找中断向量表,找到与中断号对应的处理函数的地址,回调方法。同时CPU有很多针脚,和外设物理连接,每个针脚有自己的编号,键盘按下按键会给特定的针脚发送高电平,触发硬件中断,CPU会识别到针脚的编号(

2024-04-27 17:18:35 859

原创 Linux 基础IO(2)磁盘文件

1.Boot Block(启动块):它的大小是确定的,即1KB,用来存储磁盘分区信息和启动信息。,就无法修改当前目录下的文件,因为无法增加或删除或更改存储在目录数据块中的文件名和inode的映射关系。,就无法读取目录下的文件,本质就是无法访问目录数据块的内容,如果没有。在Window下,静态库的后缀是 .lib,动态库的后缀是 .dll。动态库:程序在运行时动态链接动态库的代码,多个库共享使用库的代码。在Linux下,静态库的后缀是 .a,动态库的后缀是 .so。

2024-04-24 21:26:48 617

原创 【C++11】

function包装器 也叫作适配器。C++11扩大了列表初始化的使用范围,使其可以用于所有的自定义类型和内置类型,使用初始化列表时,可添加等号(=),也可不添加,但是建议添加等号,这样可读性更高。在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()。右值在被右值引用之后,右值的属性是左值,因为要实现移动构造和移动赋值的资源转移,所以右值在被右值引用之后,右值的属性是左值。

2024-04-21 20:56:16 830

原创 【C++ 哈希应用】

使用统一的字符串hash函数,分别将两个文件的所有字符串转换为对应的hash值,对于其中一个文件,创建N 个小文件,假设N = 1000,用字符串hash值 % N,最终将字符串写入对应的文件中,另一个文件也是同样的操作,这样相同的IP一定会进入到相同编号的文件中,最后将相同编号的文件读入内存中,用map进行记数求出出现次数最多的IP地址。位图的位置表示编号,内容表示是否存在这个值。一个值在给定的集合中有两种状态,在或不在,要表示这种状态,最少可以用一个比特位,比特位为1表示在,比特位为0表示不在。

2024-04-19 21:30:55 1148

原创 【C++ 哈希】

哈希本质是一种映射,通过这种映射关系,可以把一个值放在属于它的位置,同时查找时只需到这个位置上查找即可,这样查找时间复杂度平均为O(1),哈希方法中使用的转换函数称为哈希函数,构造出来的结构称为哈希表。开散列法又叫链地址法,首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。删除:通过哈希函数转换出地址,从这个位置往后遍历直到为空,如果找到就将这个位置的状态设置为”删除“

2024-03-19 20:14:23 242

原创 【C++ RB树】

_col(RED),_kv(kv){}插入新节点的颜色一定是红色,因为如果新节点的颜色是黑色,那么每条路径上的黑色节点的数量就不相同了,处理起来就比较麻烦,所以宁愿出现连续的红色节点,也不能让某一条路径上多出一个黑色节点。红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(log2Nlog_2 Nlog2​N。

2024-03-15 21:00:04 1022

原创 Linux 基础IO(1)内存文件

所以文件描述符就是从0开始的整数,文件描述符的分配规则:找到从0开始的最小的没有被使用的整数作为新的文件描述符。当我们打开文件时,操作系统要创建出对应的内核数据结构管理文件,于是就有了file结构体,表示一个被打开文件。进程执行open系统调用,就必须让进程和文件关联起来,每个进程都有一个指针files,指向一张表files_struct,每个元素都指向一个被打开文件,下标就是被打开文件的文件描述符。缓冲区本质是一块内存区域,我们说的缓冲区和内核中的缓冲区没有关系,是语言层面的缓冲区,C语言自带缓冲区。

2024-03-03 21:40:58 415

原创 【C++ AVL树】

int _bf;//balance factor 平衡因子,_kv(kv),_bf(0){}注意:实现AVL树平衡因子不是必须的,只不过有了平衡因子帮助我们更便捷地控制整棵树。AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询时高效的时间复杂度,即log2Nlog_2 (N)log2​N。但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多。

2024-03-02 21:21:07 659

原创 【C++ map和set】

在set中插入元素x,实际插入的是构成的键值对,如果插入成功,返回,如果插入失败,说明x在set中已经存在,返回multiset/multimap与set/set的区别是,multiset/multimap中的元素可以重复,set/map是中value是唯一的。在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。使用set的迭代器遍历set中的元素,可以得到有序序列。

2024-03-01 21:22:22 804

原创 【C++搜索二叉树】

情况c:如果该节点右左,右孩子节点,在它的右子树中寻找中序下的第一个结点(,用它的值填补到被删除节点中,再来处理该结点的删除问题–替换法删除。情况a:如果该节点只有左孩子节点,删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点–直接删除。情况b:如果该节点只有右孩子节点,删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点–直接删除。b. 树不空,按二叉搜索树性质查找插入位置,插入新节点。a. 树为空,则直接新增节点,赋值给root指针。b、如果走到到空,还没找到,这个值不存在。

2024-02-05 19:59:01 392

原创 【C++多态】

多态条件:1.虚函数重写2.父类的指针或引用调用虚函数虚函数重写的条件: virtual + 三同(函数名+参数+返回类型)不构成重写,就是隐藏特例1:子类的虚函数可以不写virtual,依旧构成重写(实际最好写上),因为重写是重写实现,继承父类的接口,就相当于也是virtual特例2:重写协变。返回值可以不同,但必须是父子关系的指针或引用,且父对应父,子对应子。特例3:在特殊情况下,为了使得析构函数的调用正常,特殊处理了析构函数(destructor),这样就构成了多态。

2024-02-01 16:01:15 274

原创 【C++继承】

继承是面向对象程序设计使代码可以复用的最重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承是类设计层次的复用。Base是父类,也叫基类,Derive是子类,也叫派生类。

2024-02-01 15:23:31 721

原创 【C++模板】

优点:模板复用了代码,增强了代码的灵活性缺陷:模板会导致代码膨胀问题,且编译出现错误时,信息非常凌乱。

2024-02-01 14:30:53 691

原创 stack queue模拟实现

总结一下,适配器本质是对代码复用的一种方法。

2024-01-24 20:36:35 431

原创 list模拟实现

list底层是一个个的节点相互连接的,物理空间不连续,不能像vector一样使用原生指针,所以必须封装底层的节点指针,再重载对应的操作符达到我们想要的效果。stl容器中的list底层是双向循环带头链表,所以插入删除效率很高,但不支持随机访问,而vector支持随机访问,但除了尾插尾删的其他插入删除效率低。

2024-01-24 09:39:44 383

原创 vector模拟实现

stl容器中的vector底层本质是可以动态增长的顺序表,所以vector在随机访问,尾插尾删方面效率最好,头插头删,中间插入删除的效率低。vector的迭代器失效其实就是因为扩容或缩容导致的野指针问题,为了解决这个问题,insert/erase等接口的返回值就是迭代器。stl中的所有容器都支持用迭代器遍历,它提供了一种统一的方式,封装底层实现细节,vector的迭代器就是原生指针。

2024-01-22 14:27:15 389

原创 linux进程概念

每一个进程都存在一个进程地址空间,操作系统要对进程地址空间做管理->先描述,再组织,所以进程地址空间就是数据结构,具体到进程中,就是特定数据结构对象,其中必有各种区域的划分。我们的进程地址空间,补具备对代码和数据的保存能力,需要再物理内中存放,所以需要将进程地址空间上的地址转化到物理内存中,系统给我们进程提供了一张引射表—页表。进程已经退出,但是当前进程的状态需要自己维持住,供上层读取,当子进程退出时,代码和数据可以释放,但进程PCB必须等待父进程读取退出状态信息。

2024-01-01 14:27:13 844

原创 string模拟实现

在C++中,std::string是标准库提供的字符串类,他提供了一种更易用和安全的方式来处理字符串,相较于C字符串更为方便。string底层本质是一个可以动态增容的顺序表,所以他的属性和顺序表的属性差不多。构造/析构/拷贝/赋值。

2023-12-03 19:08:02 325

原创 Linux基本工具

动态库:运行时动态加载库函数,将库函数地址解析到可执行程序中,这样比较节省资源,不会出现太多的重复代码,但对库的依赖性较强,一旦丢失,所有使用这个库的程序都无法运行,Linux下动态库的后缀为.so。插入模式(Insert mode):只有在Insert mode下,才可以做文字输入,按i进入该模式,按「ESC」键回到命令行模式。静态库:将库函数代码直接拷到可执行程序中,因此可执行程序体积比较大,比较浪费资源,但不依赖库,Linux下静态库的后缀为.a,查看软件包 yum list | grep xxx。

2023-11-13 18:52:42 32

原创 【C++内存管理】

对于自定义类型,除了申请空间,还需要调用构造函数初始化,但构造函数无法显式调用,所以就有了new,new是为了解决自定义类型申请空间后的初始化问题。6.对于自定义类型,malloc和free只会申请和释放空间,new在堆上申请空间并调用构造函数初始化,delete会调用析构函数清理资源并释放空间。3.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间类型即可,如果是多个对象,[]中指定对象个数即可。如果开了空间,想要调用构造函数的话,可以使用定位new。new(指针)自定义类型。

2023-11-10 11:43:09 35 1

原创 【C++】类和对象

C语言是面向过程的语言,他关注的是过程;C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象的交互完成。在C++中struct兼容C语言的用法,同时升级成了类。1.类名就是类型,可以用类名直接定义对象2.类中可以定义函数struct既可以定义结构体,也可以定义类,但我们一般使用class来定义类。

2023-11-03 10:19:37 28

原创 Linux入门指令和权限

操作系统是一款对下经行软硬件管理,对上提供良好的稳定的运行服务的软件。

2023-10-25 13:24:51 39 1

原创 【C++入门】

a = *b;*b = tmp;//......定义命名空间要使用namespace关键字,后面接命名空间的名字,然后接一对{},括号中即为命名空间的成员。如果在命名空间中还可能有命名冲突,那可以在命名空间中嵌套命名空间。同一个工程下允许多个名字相同的命名空间,编译器最后会合成同一个命名空间中。一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

2023-10-18 15:16:17 38 1

原创 【数据结构】排序

排序就是按照某种比较方式对一堆数据进行处理,处理之后的数据变得有序。

2023-09-27 10:00:19 43 2

原创 二叉树和堆

树是一种非线性的数据结构。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。由根节点,分支节点向外扩伸,最后到叶子节点。树是递归定义的。树的子树之间不能由交际,否则就不是树形结构了。

2023-09-18 19:46:15 23

原创 C栈和队列

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。这里我用数组的方式来实现栈,数组的尾插尾删效率很高,而且缓存利用率也很好。实现队列,一般用链表,因为链表的头插头删效率高,而数组要挪动数据,效率不高。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。

2023-08-11 18:57:26 17 1

原创 【C语言】程序环境和预处理

FILE//进行编译的源文件LINE//文件当前的行号DATE//文件被编译的日期TIME//文件被编译的时间STDC//如果编译器遵循ANSI C,其值为1,否则未定义这些预定义符号都是C语言内置的。return 0;

2023-07-17 17:38:55 29 1

原创 【C语言】文件操作

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信,这些信息保存在系统声明的结构体FILE中。文件是指在电脑中存储的一组相关信息的集合,这些信息以二进制形式存储在磁盘上,以程序、数据、文本、图形、歌曲、电影等形式在电脑中。在程序设计中,我们一般谈的文件有两种:程序文件和数据文件。如果文件打开成功,fopen函数返回一个指向文件的FILE*的指针,否则返回NULL。1. 程序文件:包括源文件(.c),目标文件(.obj),可执行程序(.exe)。每个文件都有一个唯一的文件标识。

2023-07-16 10:56:07 53 1

原创 【C语言】动态内存管理

malloc函数向内存中申请一块连续的空间,如果开辟成功,返回一个指向开辟好空间的指针,如果开辟失败,返回NULL指针,所以使用malloc时,要对返回值进行检查。ptr时要调整的内存地址,size时调整之后的大小,返回值为调整之后的内存的起始位置。2.原空间之后没有足够大的空间:在堆上另找一块合适的内存空间,把原空间的数据拷贝到新空间,free原空间,返回新空间的地址。1.原空间之后有足够大的空间:要扩展内存就直接在原有空间之后追加,原来空间的数据不发生变化。2.对动态开辟空间的越界访问。

2023-07-14 14:17:51 128 1

原创 【C语言】结构体,枚举,联合

char s;double y;} s1;声明类型的同时定义全局变量s1 struct S s2;定义全局变量s2 int main() {定义局部变量s3 , 同时按顺序初始化初始化 struct S s4 = {定义局部变量s4 , 不按顺序的初始化 return 0;

2023-07-12 15:38:27 141 1

原创 【C语言】字符函数和字符串函数

strlen在求字符串长度时,以’\0’作为结束标志,返回字符串中’\0’之前出现的字符个数。所以目的字符串的空间必须足够大,源字符串必须以‘\0’停止。strncpy从源字符串拷贝n个字符到目标字符串,如果源字符串的长度小于n,则拷贝完源字符串之后,在目标的后面追加0,直到n个。isspace :空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’strcat在目标字符串后追加一个字符串,目的字符串的空间必须足够大,源字符串必须以‘\0’停止。

2023-07-11 16:49:49 32 1

原创 【C语言-指针】

指针的一些总结。

2023-07-08 17:01:17 21 1

原创 【C语言】操作符

【C语言】函数【C语言】选择语句和循环语句【C语言数据类型,变量和常量】【C语言】整形和浮点型在内存中的存储【C语言】数组 ‘+’,‘-’,'*'和日常使用的逻辑一致,操作数可以是整形和浮点型; C语言中的除法分为整数除法和浮点数除法; 要注意的是,‘%’操作符的两个操作数必须是整形,返回的是余数; 左移和右移操作符操作的是二进制位; 右移有两种方式: 由此可以确定,在我的编译器下,右移执行的是算数右移; &:如果两个操作数对应二进制位都为1才为1,否则就是0 |:如果两个操作数对应

2023-06-18 15:22:35 36 4

原创 【C语言】数组

(注:在C语言中,const 修饰的变量又被叫做常变量,他本质上是一个变量,所以不能放在[]中)C99中,加入了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。在C99之前, [ ] 中要给一个常量才可以,不能使用变量。C语言规定,每个数组中的元素都以一个下标,下标从0开始.sizeof(数组名),计算的是整个数组的大小,单位是字节。随着数组下标的增长,元素的地址,也在有规律的递增。&数组名,取出的是整个数组的地址,+1则跳过一个数组。通过下标访问数组,和通过指针访问数组本质上是一样的。

2023-06-11 14:27:08 30 2

原创 【C语言】整形和浮点型在内存中的存储

前面我们学习了C语言的内置数据类型,今天让我们从内存的方面深度学习一下整形和浮点型在内存中的存储。对于有2个字节及其以上字节的变量,在内存中存储是有许多种存储方式,但有两种存储方式最常见。大端存储:数据的低位字节序的内容保存在内存的高地址中,而数据的高位字节序的内容保存在内存的低地址中。小端存储:数据的低位字节序的内容保存在内存的低地址中,而数据的高位字节序的内容保存在内存的高地址中。

2023-06-01 14:02:58 83 7

原创 【C语言】函数

在之前,我简单讲解了C语言中的选择语句和循环语句,那么今天,我们一起来看看函数这一部分的内容。在维基百科中,函数被叫做子程序,是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。C语言程序由一个main函数和若干个其它函数组成,C语言中的每个项目,都由一个个函数组成,可以说,函数是C程序的基本单位。C语言中函数分为库函数和自定义函数。C语言规定了一些日常可能会使用到的函数,提供了一系列类似的库函数,方便使用。

2023-05-28 17:41:52 63 5

原创 【C语言】选择语句和循环语句

对于初学c语言的萌新,他们可能会对选择语句和循环语句有着一些困惑。c语言中有哪些选择语句和循环语句呢,他们怎么使用,有什么要注意的地方吗?因此,本文来梳理讲解一下c语言中的选择语句和循环语句,希望对你有所帮助.循环是程序设计语言中反复执行某些代码的一种计算机处理过程,常见的有按照次数循环和按照条件循环。要使用循环语句时,必须要确定循环体及条件两个重要因素,亦即首要考虑的是:要重复执行哪些语句,要重复到什么时候为止。

2023-05-27 13:59:25 354 1

原创 【C语言数据类型,变量和常量】

在写程序和做题是,我们总是会用到常量和变量,各种数据类型,那一些细节的东西你注意到了吗演示环境:win11,64位系统,vs2022尽量不要使用long这种不同编译器下可能发生变化的数据类型,注意在局部变量创建时初始化,注意全局变量和静态变量的初始值。

2023-05-16 14:41:10 40 1

原创 【c系列编程学习(0)】

开始学习前的一点对未来的期望和对现在自己的激励

2023-04-20 17:07:20 45 1

空空如也

空空如也

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

TA关注的人

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