- 博客(38)
- 收藏
- 关注
原创 Linux 文件系统超详解
磁盘是计算机的主要存储介质,它可以存储大量二进制数据,即使断电后也可以保证数据不会丢失。下面我们将了解磁盘的物理结构、存储结构以及。
2025-04-02 17:23:59
619
原创 C++ undered_map和undered_set的封装
但是,undered_map是pair的键值对,而undered_set是一个数值,当数据传过来的时候怎么分辨呢?在需要数据的时候套一层KeyOfT,判断数据类型。
2024-12-24 13:34:50
334
原创 C++ 哈希
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log_2 N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:·插入元素。
2024-12-17 15:06:09
664
原创 C++ 红黑树
我们这里用K V的模型,为方便后续的旋转操作// 枚举定义节点颜色RED,BLACK// 存储键值对,_kv(kv),_col(RED){}这里我们给插入的节点定义为红色,是为了不违反规则4,规则4相较于规则3无异于更为严格,应为我们如果插入黑色节点一定会破坏规则4,如果插入红色节点只是可能破坏规则3,规则3可以理解为不能有连续的红色节点,因为父节点可能为黑色总的来说就是:· 插入黑色一定破坏规则4,必须调整红黑树· 插入红色可能破坏规则3,可能调整红黑树。
2024-11-22 18:49:47
876
原创 C++ AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:· 它的左右子树都是AVL树。
2024-11-13 16:02:10
623
原创 C++ map 和 set
前面我们介绍过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的,在数据检索时比序列式容器效率更高。
2024-11-12 19:35:22
713
原创 C++ 二叉搜索树
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:·若它的左子树不为空,则左子树上所有节点的值都小于根节点的值·若它的右子树不为空,则右子树上所有节点的值都大于根节点的值·它的左右子树也分别为二叉搜索树。
2024-11-11 12:16:46
556
原创 C++ 多态 (详解)
在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout << "买票,全价" << endl;public:cout << "买票,半价" << endl;p.BT();student st;Fan(ps);Fan(st);return 0;注意:接收对象的指针或引用,传递是父类就调用父类的函数,传递是子类就调用子类的函数。
2024-11-05 15:29:05
1011
原创 C++ 继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或子类),被继承的称基类(或父类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
2024-11-02 20:12:04
920
原创 C++ Stack和Queue
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2024-10-30 18:04:44
849
原创 C++ List的模拟实现
比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2024-07-07 11:42:04
323
原创 C++ Vector的模拟实现
就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
2024-06-22 22:53:51
756
原创 Linux:文件描述符
每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!发现是结果是: fd: 0 或者 fd: 2 可见,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。此时,我们发现,本来应该输出到显示器上的内容,输出到了文件 "bite"当中,其中,fd=1。·Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.
2024-06-20 22:18:55
365
原创 C++ String类的模拟实现
4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。1. string是表示字符串的字符串类。
2024-06-14 21:40:52
377
原创 Liinux:进程程序替换
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。·这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。·exec函数只有出错的返回值而没有成功的返回值。
2024-06-13 10:31:31
430
原创 Linux:进程终止和进程等待
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。·另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。·如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。·如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。·子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
2024-06-12 22:21:32
870
原创 Linux:进程创建fork()函数详解
在linux中fork函数时非常重要的函数,它从进程中创建一个新进程。新进程为子进程,而原进程为父进程。返回值:自进程中返回0,父进程返回子进程id,出错返回-1分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程·添加子进程到系统进程列表当中·fork返回,开始调度器调度当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序。这里看到了三行输出,一行before,两行after。
2024-06-11 22:15:05
300
原创 Linux 僵尸进程和孤儿进程
1.僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用后)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程2.僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。3.所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态同时我们 gcc 编译生成对应的 a.out ,同时调用 ps axj | head -1 && ps axj | grep a.out 查看进程。
2024-06-02 22:04:22
618
原创 C++ 类的默认成员函数
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
2024-05-31 22:09:04
935
原创 C++内联函数
2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。2)如果一个函数为内联函数,它就不会出现在最终的可执行代码里,只是会存在于编译器中,在编译器需要的地方插入。
2024-05-26 21:01:24
237
原创 C++入门
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。(1.)正常的命名空间定义// name1是命名空间的名字,一般开发中是用项目名字做命名空间名。//命名空间中可以定义函数/变量/类型int val;(2.)命名空间可以嵌套调用//text.cppint a;int b;int c;int d;(3.)同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
2024-05-21 11:25:32
352
原创 八大排序算法(C语言实现)
由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。选取左边,中间,右边,既不是最大,也不是最小的那个数做key。
2024-05-19 20:09:32
792
1
原创 yum详解
但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装.以上为 yum 常用选项,更多的选项和参数可通过 man yum 或 yum --help 来查看。·在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序.-C:在执行命令前检查软件包的完整性,可以帮助避免损坏的软件包。-h或--help:显示帮助信息,列出可用的选项和参数。
2024-05-15 22:02:06
232
原创 树和二叉树的讲解
现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。(2)若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子 (3)若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子。子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
2024-05-14 19:25:24
824
2
原创 C语言模拟实现栈和队列
栈的概念及结构:栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In FirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。
2024-05-12 22:12:48
318
原创 C语言模拟实现顺序表
静态顺序表只适用于确定知道需要存多少数据的场景,使用起来有较大的局限性。所以现实中基本都是用动态顺序表,根据需要动态的分配空间大小。顺序表使用一段物理地址连续的存储单元依次存储数据元素,常使用数组实现。顺序表一般可以分为静态顺序表和动态顺序表。
2024-05-11 16:21:29
149
1
原创 C语言模拟实现链表
1.无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。链表是一种逻辑上连续,而物理存储结构上非连续、非顺序的存储结构,链表的各节点通过指针链接起来。2.带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带。
2024-05-11 16:10:03
156
1
原创 Linux常用的基本指令
Linux 是一款基于GNU通用公共许可协议的自由和开放源代码的类 UNIX 操作系统,该操作系统的内核由Linus Torvalds 在1991年首次发布。之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。但是,严格来讲,Linux只是操作系统内核,但通常采用"Linux内核”来表达该意思。而Linux则常用来指基于 Linux 内核的完整操作系统,它包括 GUI 组件和许多其他实用工具。在 Linux的世界里,其核心思想:一切皆为文件。
2024-05-10 17:49:15
974
原创 程序的编译和链接
在ANSIC的任何一种实现中,存在两个不同的环境1.第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令2.第二种是执行环境,它用于实际的执行代码。
2024-03-16 16:12:15
1639
1
原创 C语言——文件操作
磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。文件一般分为两种:程序文件和数据文件程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本章讨论的是数据文件。
2024-01-16 16:17:40
348
1
原创 结构体内存对齐
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整。不是所有的硬件平台都能访问任意地址上的任意数据的;相信大家对结构体都非常熟悉吧,但大家想过结构体的 内存是如何排列的吗?3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。结构体的内存对齐是拿空间来换取时间的做法。
2023-10-16 11:38:03
100
1
原创 常见内存函数的模拟实现
(1)函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置(2)这个函数会在遇到 ‘\0’ 的时候不会停下来(3)如果source和destination有任何重叠,复制结果都是未定义的同strcpy不同,memcpy可以接收任何类型的数据那么这么有趣的函数如何实现呢我在测试的时候用的数据拷贝到自身的情况,正常来说memcpy拷贝重叠数组的效率为60%,但测试环境为vs2022,效率为100%,属于是超额完成任务了。
2023-09-25 11:04:33
112
7
原创 unsigned讲解
值得注意的是 char a 有符号数,只是打印无符号,所以整形提升时在取出的有效数的最高位前补1,直至补齐32位。字如其名,就是无符号的意思。在C语言中和signed相反,signed是有符号的意思。00000000000000000000000011111111---也就是 255。如果 给一个超过(signed)char范围的值呢,咱来看看什么有趣效果。,因为是无符号数在其最高位前补0,直至补齐32位。既然有打印有符号整形那就有打印无符号整形 %u。char 的范围就是-128~127;
2023-09-23 15:31:03
2663
4
原创 尼科彻斯定理 即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如:
同时每一组“数列”首项与 m 的关系为 “首相 = m * m - m + 1",那么规律找到了开始代码实现。输入一个正整数 m(m≤100) ,将 m 的立方写成 m 个连续奇数之和的形式输出。首先我们可以发现每一行都是公差为2的等差数列。如有错误,欢迎大佬指评!
2023-08-20 11:39:52
650
4
原创 初入优快云谈谈以后的目标和理想
我在一个民办的本科就读体育教育,地理位置非常不好,专业也不好找工作,我就想跳槽,但是啊,但是体育竟然不能转专业的!(其实第一想法是想考研去大城市的😅)当然这个想法也没变,我的目标依然是考研去大城市赚钱,赚很多很多的钱💰,(大家别笑我,穷怕了😁😁)毕竟计算机的市场还是非常广阔的,考研同时也是为了提高自己的上限。Hello 大家好,我是汤姆啊,终于是咱csdn的一位成员了啊,来的第一件事就是规划自己以后发展目标及规划。竞争虽激烈,但我依然冲!如果有朋友看到这篇文章那我祝你一天的好运(祝太多了我怕我会倒霉😂)
2023-06-10 15:31:27
126
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人