自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ List的模拟实现

比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2024-07-07 11:42:04 203

原创 C++ Vector的模拟实现

就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

2024-06-22 22:53:51 692

原创 Linux:文件描述符

每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!发现是结果是: fd: 0 或者 fd: 2 可见,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。此时,我们发现,本来应该输出到显示器上的内容,输出到了文件 "bite"当中,其中,fd=1。·Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.

2024-06-20 22:18:55 265

原创 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 328

原创 Liinux:进程程序替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。·这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。·exec函数只有出错的返回值而没有成功的返回值。

2024-06-13 10:31:31 396

原创 Linux:进程终止和进程等待

WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。·另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。·如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。·如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。·子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。

2024-06-12 22:21:32 791

原创 Linux:进程创建fork()函数详解

在linux中fork函数时非常重要的函数,它从进程中创建一个新进程。新进程为子进程,而原进程为父进程。返回值:自进程中返回0,父进程返回子进程id,出错返回-1分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程·添加子进程到系统进程列表当中·fork返回,开始调度器调度当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序。这里看到了三行输出,一行before,两行after。

2024-06-11 22:15:05 253

原创 C++ 内存分配管理

1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造。

2024-06-08 22:14:47 986

原创 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 567

原创 C++ Static成员和友元

的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加。

2024-06-01 11:33:12 645

原创 C++ 类的默认成员函数

如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

2024-05-31 22:09:04 841

原创 C++内联函数

2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。2)如果一个函数为内联函数,它就不会出现在最终的可执行代码里,只是会存在于编译器中,在编译器需要的地方插入。

2024-05-26 21:01:24 205

原创 C++入门

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。(1.)正常的命名空间定义// name1是命名空间的名字,一般开发中是用项目名字做命名空间名。//命名空间中可以定义函数/变量/类型int val;(2.)命名空间可以嵌套调用//text.cppint a;int b;int c;int d;(3.)同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

2024-05-21 11:25:32 327

原创 八大排序算法(C语言实现)

由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。选取左边,中间,右边,既不是最大,也不是最小的那个数做key。

2024-05-19 20:09:32 722 1

原创 yum详解

但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装.以上为 yum 常用选项,更多的选项和参数可通过 man yum 或 yum --help 来查看。·在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序.-C:在执行命令前检查软件包的完整性,可以帮助避免损坏的软件包。-h或--help:显示帮助信息,列出可用的选项和参数。

2024-05-15 22:02:06 184

原创 树和二叉树的讲解

现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。(2)若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子 (3)若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子。子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

2024-05-14 19:25:24 774 2

原创 C语言模拟实现栈和队列

栈的概念及结构:栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In FirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。

2024-05-12 22:12:48 261

原创 C语言模拟实现双向链表

【代码】C语言模拟实现双向链表。

2024-05-12 08:00:00 199

原创 C语言模拟实现顺序表

静态顺序表只适用于确定知道需要存多少数据的场景,使用起来有较大的局限性。所以现实中基本都是用动态顺序表,根据需要动态的分配空间大小。顺序表使用一段物理地址连续的存储单元依次存储数据元素,常使用数组实现。顺序表一般可以分为静态顺序表和动态顺序表。

2024-05-11 16:21:29 105 1

原创 C语言模拟实现链表

1.无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。链表是一种逻辑上连续,而物理存储结构上非连续、非顺序的存储结构,链表的各节点通过指针链接起来。2.带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带。

2024-05-11 16:10:03 116 1

原创 Linux常用的基本指令

Linux 是一款基于GNU通用公共许可协议的自由和开放源代码的类 UNIX 操作系统,该操作系统的内核由Linus Torvalds 在1991年首次发布。之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。但是,严格来讲,Linux只是操作系统内核,但通常采用"Linux内核”来表达该意思。而Linux则常用来指基于 Linux 内核的完整操作系统,它包括 GUI 组件和许多其他实用工具。在 Linux的世界里,其核心思想:一切皆为文件。

2024-05-10 17:49:15 913

原创 程序的编译和链接

在ANSIC的任何一种实现中,存在两个不同的环境1.第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令2.第二种是执行环境,它用于实际的执行代码。

2024-03-16 16:12:15 1571 1

原创 C语言——文件操作

磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。文件一般分为两种:程序文件和数据文件程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本章讨论的是数据文件。

2024-01-16 16:17:40 327

原创 结构体内存对齐

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整。不是所有的硬件平台都能访问任意地址上的任意数据的;相信大家对结构体都非常熟悉吧,但大家想过结构体的 内存是如何排列的吗?3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。结构体的内存对齐是拿空间来换取时间的做法。

2023-10-16 11:38:03 78 1

原创 常见内存函数的模拟实现

(1)函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置(2)这个函数会在遇到 ‘\0’ 的时候不会停下来(3)如果source和destination有任何重叠,复制结果都是未定义的同strcpy不同,memcpy可以接收任何类型的数据那么这么有趣的函数如何实现呢我在测试的时候用的数据拷贝到自身的情况,正常来说memcpy拷贝重叠数组的效率为60%,但测试环境为vs2022,效率为100%,属于是超额完成任务了。

2023-09-25 11:04:33 77 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 1601 3

原创 尼科彻斯定理 即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如:

同时每一组“数列”首项与 m 的关系为 “首相 = m * m - m + 1",那么规律找到了开始代码实现。输入一个正整数 m(m≤100) ,将 m 的立方写成 m 个连续奇数之和的形式输出。首先我们可以发现每一行都是公差为2的等差数列。如有错误,欢迎大佬指评!

2023-08-20 11:39:52 499 3

原创 初入CSDN谈谈以后的目标和理想

我在一个民办的本科就读体育教育,地理位置非常不好,专业也不好找工作,我就想跳槽,但是啊,但是体育竟然不能转专业的!(其实第一想法是想考研去大城市的😅)当然这个想法也没变,我的目标依然是考研去大城市赚钱,赚很多很多的钱💰,(大家别笑我,穷怕了😁😁)毕竟计算机的市场还是非常广阔的,考研同时也是为了提高自己的上限。Hello 大家好,我是汤姆啊,终于是咱csdn的一位成员了啊,来的第一件事就是规划自己以后发展目标及规划。竞争虽激烈,但我依然冲!如果有朋友看到这篇文章那我祝你一天的好运(祝太多了我怕我会倒霉😂)

2023-06-10 15:31:27 103

空空如也

空空如也

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

TA关注的人

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