- 博客(58)
- 收藏
- 关注
原创 右值和右值引用【C++】
左值是一个表示数据的表达式它最主要的特点就是:①可以取地址②生命周期比较长,最短都是局部变量的生命周期③可以出现在=左边,即可以被修改然后把地址给引用或者指针,就可以通过引用或者指针改变这个左值左值引用就是给左值取别名左值可以出现在=的左右两边。
2025-03-29 16:11:09
741
21
原创 进程地址空间(上)【Linux】
子进程又会继承父进程的mm_struct和页表,而且不修改的时候,里面的值是完全一样的,虚拟地址和物理地址也是一样的。而且一次时间片使用完之后,这个进程等待时,还要把使用完的加载到内存的这一部分在释放掉,节约内存。但是因为页表的映射,在虚拟内存中所有的代码和数据是在一起的,进程使用的时候也十分方便。所以子进程能通过自己的页表,找到父进程全局变量对应的物理地址,也就能看见里面的值了。如果只有r权限,那它就只能读,不能被修改。进程因为操作系统给它画的大饼(进程地址空间)它就认为我想干嘛是一定有内存的,
2025-03-20 11:08:18
1099
26
原创 进程(下)【Linux操作系统】
就像考进一个学校,再拿到录取通知书之前你的信息就已经被学校记录在学生管理系统里面了,所以在你人进入学校之前,就有了你对应的数据对象了。CPU调用进程的时候从左往右进行调用,如果一个桶中有进程,就直接拿着桶里的第一个元素调度(插入进程也是头插)进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。如果一个用户把自己的一个进程的优先级调的特别高,那么其他用户的进程就有可能一直无法调度。一般修改的是它的nice(NI)值,通过这个间接修改进程的优先级。
2025-03-12 14:59:45
1471
28
原创 进程(上)【Linux操作系统】
pid:唯一标识一个进程记录该进程是由磁盘中的那个可执行文件生成的,记录了它的绝对路径例:进程A是被test生成的,那么exe存储的就是test的绝对路径(/home/xyc/dir/test)cwd:当前进程在那条路径下运行一般是继承父进程的cwd进程在哪条路径下启动,那么它的cwd最开始就是那条路径例我在路径/home/xyc这条路径下启动了进程test那么test最开始的cwd就是/hone/xyc。
2025-03-09 11:39:02
964
30
原创 冯诺依曼体系结构的理解和操作系统的极简介绍【Linux操作系统】
操作系统本质是一个进行软硬件资源管理的软件用户只需要发出命令,操作系统接收到命令之后就会自动地把命令执行完毕。
2025-03-06 15:33:06
1187
25
原创 Linux的用户和权限【Linux操作系统】
但是这个时候因为目录是共享的,所有人都对共享目录具有rwx权限,就意味着所有人都可以删除共享目录下的所有文件。并把文件设置成只有所属组拥有rwx的权限,这样就只有b能修改和看这个文件了。③再按字母i,进入插入模式,把root改成要添加到白名单的用户的用户名。即把u(拥有者)和g(所属组)对test的三个权限全部都改为没有权限。把o(other)的x权限改为可执行,r和w为不可执行。普通用户更改文件的所属组和拥有者时,是不能直接修改的。即可让g(所属组)对文件test.c的r和x的权限。
2024-12-04 21:23:23
2252
54
原创 Linux基本指令【Linux系统】
显示指定[指定方式 :]路径中的文件使用语法: ls的常用选项Linux中,文件名以开头的文件是隐藏文件显示用户当前所处的路径语法: 切换到指定路径下语法: 任何一个目录[包括根目录/]中都有两个默认的目录,即 和 ,这两个默认目录类似于指针, .指向目录自己, …指向目录的上一级目录注意:,因为根目录没有上级目录了我们可以使用切换到上级路径Linux系统中,磁盘上的⽂件和⽬录被组成⼀棵,每个节点都是⽬录或⽂件理解路径存在的意义:树状组织⽅式,都是为了保证快速定位查找到指定的⽂件,⽽定位⽂
2024-11-24 11:28:03
1188
44
原创 平衡二叉搜索树之 红黑 树的模拟实现【C++】
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,只能是Red或Black。通过对任何一条从根到空节点的路径上各个结点着色方式的限制红黑树确保没有一条路径会比其他路径长出俩倍,即最长路径的长度最多是最短路径长度的两倍,这样的话就能保证红黑树是接近平衡的树红黑树类的成员变量只有一个,就是指向红黑树的根节点的指针为什么红黑树新插入的节点【或者新节点】一定是红色的?其实就是维护成本的问题:1.如果新插入的节点为黑色因为插入之前,这棵树一定是红黑树。
2024-11-16 10:28:13
2142
63
原创 平衡二叉搜索树之 AVL 树的模拟实现【C++】
我上一篇文章提到的普通二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。AVL树就可以解决上述问题,让搜索树的查找效率在任何情况下都能稳定是O(logN)保证每个结点的左右子树高度之差的绝对值不超过1这样就能保证树中的节点分布接近满二叉树,高度非常接近logN【N为树中节点的个数】,进而让一次查找的效率为O(logN)为什么是保证每个结点的左右子树高度之差的绝对值不超过1,而不是保证左右子树高度一样呢?
2024-10-05 14:22:42
1630
68
原创 普通二叉搜索树的模拟实现【C++】
二叉搜索树又称二叉排序树,是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树空树也是二叉搜索树。
2024-09-28 11:22:32
1665
62
原创 多态(下)【C++】
纯虚函数是一种特殊的虚函数,它是没有函数体的虚函数class <类名>public:virtual <类型><函数名>(<参数表>) = 0;纯虚函数的特点:子类继承父类的纯虚函数之后,可以对它进行重写,在子类中被重写的纯虚函数就拥有函数体,并能正常使用了纯虚函数只有声明,没有具体的实现。它为子类提供了一个统一的接口,具体的实现细节则由各个子类根据需要来定义。纯虚函数的声明以必须以= 0结尾,表明该函数没有实现,它只是一个接口。不能直接调用没有被重写的纯虚函数,因为它们没有实现。
2024-09-16 10:50:42
1352
72
原创 多态(上)【C++】
在C++中,虚函数是使用virtual关键字修饰的非静态成员函数。虚函数的主要作用是允许在派生类中重新定义基类的函数,从而实现多态。关于虚函数的一些注意点:虚函数就是为了实现多态而存在的,而且支持虚函数是需要付出一定代价的所以如果不实现多态,就不要定义虚函数静态成员函数不能做虚函数因为①虚表指针存在对象里,但是静态成员的生命周期比对象长,而且静态成员函数里面没有this指针,就找不到对象②因为静态的特性:在以该父类为起始的整个继承体系中只有一份,如果实行多态的话就有多份了,这不符合静态的特性。
2024-09-13 15:27:24
1692
62
原创 继承(下)【C++】
举个例子数据冗余:即D类里面有两份A的成员,而且这两份完全重复,没有必要都存在访问会有二义性:因为D类里面有两份A的成员,那么通过D类的对象访问A类的成员就不知道要访问这两份中的那一份。
2024-08-22 17:48:19
1832
91
原创 继承 (上)【C++】
继承(inheritance)机制是面向对象程序设计使代码复用的最重要的手段它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或者子类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承的目的是为了代码重用扩展基类的行为,并建立一个类型之间的层次结构。
2024-08-17 11:28:52
1437
65
原创 priority_queue模拟实现【C++】
适配器模式是一种设计模式,它允许将不兼容接口的类一起工作。希望使用一个类,但其接口与其他代码不兼容。希望创建一个可重用的类,它能够将接口转换为其他接口。希望使用第三方库或遗留代码,但其接口与其他代码不兼容。目标接口(Target):这是期望使用的接口,客户端代码只能与目标接口交互。源接口(Adaptee):这是需要适配的类,其接口与目标接口不兼容。适配器(Adapter):这是一个类,它实现了目标接口,并将调用转换为对源接口的调用。
2024-08-08 21:40:59
2233
66
原创 模板进阶【C++】
写一个比较函数,如果是直接写成下图的函数模板,我们就只能按照规定好的大小比较方式进行比较。如下图,当传给A类的模板参数,第一个是int时将会调研偏特化的类模板实例化对象。因为函数模板特化的作用基本只有这个,所以其实函数模板的特化是有替代的,那就是。实例化c对象的时候传给类模板的模板参数都是指针类型,所以调用了偏特化的类模板。第一个模板参数不是int的时候,才会调用基本类模板(母板)进行实例化对象。的参数类型是int*,那就会优先调用int*特化的模板函数。的就会调用偏特化的类模板进行对象的实例化。
2024-08-02 22:04:38
1621
59
原创 queue的模拟实现【C++】
适配器模式是一种设计模式,它允许将不兼容接口的类一起工作。希望使用一个类,但其接口与其他代码不兼容。希望创建一个可重用的类,它能够将接口转换为其他接口。希望使用第三方库或遗留代码,但其接口与其他代码不兼容。目标接口(Target):这是期望使用的接口,客户端代码只能与目标接口交互。源接口(Adaptee):这是需要适配的类,其接口与目标接口不兼容。适配器(Adapter):这是一个类,它实现了目标接口,并将调用转换为对源接口的调用。
2024-07-21 21:29:24
1887
73
原创 stack模拟实现【C++】
适配器模式是一种设计模式,它允许将不兼容接口的类一起工作。希望使用一个类,但其接口与其他代码不兼容。希望创建一个可重用的类,它能够将接口转换为其他接口。希望使用第三方库或遗留代码,但其接口与其他代码不兼容。目标接口(Target):这是期望使用的接口,客户端代码只能与目标接口交互。源接口(Adaptee):这是需要适配的类,其接口与目标接口不兼容。适配器(Adapter):这是一个类,它实现了目标接口,并将调用转换为对源接口的调用。
2024-07-19 20:43:43
1319
55
原创 list模拟实现【C++】
在文件mylist.hpp中定义上一个命名空间mylist把list类和它的成员函数放进命名空间封装起来,防止与包含的头文件中的函数/变量重名的冲突问题。
2024-07-11 09:59:02
2531
65
原创 vector模拟实现【C++】
在文件中定义上一个命名空间myvector把vector类和它的成员函数放进命名空间封装起来,防止与包含的头文件中的函数/变量重名的冲突问题。
2024-07-03 21:48:02
3270
56
原创 模拟实现string【C++】
在文件mystring.h和中都定义上一个命名空间mystring把mystring.h中类的声明放进命名空间,把mystring中的函数实现也放进命名空间不同源文件的同名的命名空间经过编译链接之后可以合成在一起。
2024-06-28 10:04:51
2604
49
原创 模板初阶【C++】
不能简单地直接类名+::而是模板类型声明+类中的成员函数的定义[注意此时类名后面还是要加,因为这样才是一个完整的类类型],这样类实例化对象的时候就可以推导出对应的成员函数的类型由于模板类不完整,所以不能直接用它去限定作用域即在类外实现成员函数等用::区限定时,不能直接限定,要先指定类型。
2024-06-23 12:00:25
2060
49
原创 内存管理【C++】
T* p=new T(传给自定义类型的构造函数的参数)T代指类型,p可以是任意合法标识符T* p=new T【n】{{传给第一个自定义类型的构造函数的参数},{传给第二个}T代指类型,p可以是任意合法标识符,n是要申请的连续的类型空间的个数例。
2024-06-01 11:22:31
2195
79
原创 类和对象【三】析构函数和拷贝构造函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如:在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。来自百度百科拷贝构造函数是C++中一种构造函数的重载用已有对象创建一个新对象,并将已存在的同类对象的数据成员拷贝到新对象中。拷贝构造函数的形参是一个对该已有对象的引用,并且通常会被声明为const,以防止通过引用修改原对象。
2024-04-27 16:10:34
1334
79
原创 字符型(char)数据在内存中的存储
最高位(最左端的那一位)为符号位,符号位只表示正负(0为正,1为负)不存储数据。所以有符号char的在内存中取值范围为10000000~01111111。char,int,short int类型的值的加减其实是一个循环。那么怎么判断自己的电脑用的编译器char是有符号还是无符号的呢?所以我的电脑的编译器中只写char时char是有符号的。虽然数据在内存中都是以二进制的方式进行存储的,但是。在内存中存储的11111111其实存储的是-1。所以有符号char(signed char)
2024-04-27 09:43:02
892
28
原创 浮点数在内存中的存储
比如,2^10的E是10, 所以保存成32位浮点数时,E必须保存成10+127=137 即二进制的。即 浮点数的小数的二进制表示是1(或0)*2的-k + 1(或0)2的-(k+1)以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。,因为凑不出二的几次方加二的几次方,正好等于小数点后的那几个数。有效数字M不再加上第一位的1, 而是还原为0.*xxxx的小数。浮点数的小数点后数的二进制表示是以2的-k加出来的。,double的E也是无符号数,所以E的范围为。
2024-04-27 09:34:43
636
19
原创 类和对象【二】this指针,构造函数和成员初始化列表【超详细】
C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),这个指针就是this指针在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成在创建对象时调用的特殊方法。其主要作用是给对象的成员赋值。在C++中,构造函数通常没有返回类型,并且不能被声明为const。在创建类的对象时,构造函数自动被调用此外,构造函数可以重载,即可以有多个名字相同的构造函数,但参数列表必须不同。
2024-04-20 17:30:30
1467
64
原创 类和对象【一】类和对象简介
类体 };记得加分号class是类的关键字ClassName是自定义的类名类体所处的作用域是一个新的作用域,即类域每一个类都有自己的类域例。
2024-04-12 20:18:05
1331
56
原创 函数重载和引用【C++】
函数重载:重载函数是函数的一种特殊情况。为方便使用,C++允许在同一作用域中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指1.参数的个数 2.类型 3.顺序)必须至少有一个不同根据这些同名函数的参数表的不同,达成传入参数类型不同,调用的函数不同的效果引用是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。即使用一个变量的引用就是使用该变量,修改它的引用也是修改变量自己例。
2024-04-05 17:00:39
1893
53
原创 函数参数缺省和内联函数【C++】
直接在函数定义//声明的返回值前+一个关键字inline即可例内联函数的调用方法和普通函数一样因为被包含的头文件会在预处理时展开,所以包含了头文件的文件就内使用该头文件中定义的东西c语言编译和链接例。
2024-04-03 12:24:09
1162
49
原创 链表的极致——带头双向循环链表
双向带头循环链表是链表结构最复杂,但使用最方便的链表。[图中phead表示链表的头节点(哨兵);d1,d2等表示链表存储的数据;d1,d2等左侧的方框存储是指向该节点的上一个节点的指针(prev),右侧方框存储指向该节点的下一个的指针(next)]
2024-03-30 19:44:42
1751
26
原创 命名空间【C++】(超详细)
命名空间关键字(namespace)+命名空间的名字+{ 定义的东西 }int b = 0;void dfs();命名空间中可以定义很多类型的东西如 变量,函数,结构体,类,其他的命名空间等等只要可以定义的东西都可以放到命名空间中定义命名空间只能在全局或者另一个命名空间中定义再没有用作用域指定该变量是哪一个作用域时先在局部域中寻找是否有变量/函数的定义在局部域中找不到定义,再去全局域和展开 的命名空间中寻找【不分相后再使用作用域指定该变量是哪一个作用域时直接去该作用域去寻找该变量的定义。
2024-03-30 19:34:04
3328
38
原创 模拟实现堆的接口函数
为什么要将队列里的数据的数据类型重命名?这是为了以后如果改变了SL结构体中数据存储的类型时,不用到处改函数参数等地方的数据类型,只要改typedef后的int 为对应要改成的数据类型就可以。至于给结构体重命名则仅是为了方便使用。
2024-03-16 17:30:56
1433
30
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人