自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动静态库-Linux 学习

动态库,也叫共享库(Shared Library),是一种在程序运行时才被加载到内存中的代码库。它的文件名通常以。

2025-03-04 16:54:46 589

原创 linux 文件系统和软硬链接

我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。每行包含7列:其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息上面的执行结果有几个信息需要解释清楚在Linux文件系统中,inode(索引节点)是文件系统中用于存储文件元数据的数据结构。每个文件或目录在文件系统中都有一个唯一的inode与之对应。inode中包含了文件的元数据,如文件大小、文件权限、所有者信息、创建时间、修改时间、访问时间、文件类型以及指向文件数据块的指针等。

2025-02-24 16:03:01 559

原创 unordered_map和 unordered_set

是 C++ 标准库中的一个容器,它存储唯一的元素,不保存任何顺序。与set不同,内部使用哈希表结构,因此在查询、插入和删除操作时具有更快的平均时间复杂度,通常为 O(1)。

2025-02-22 21:00:21 846

原创 红黑树的学习

/ ekkkkkkkkkk:```c+num 是一个枚举类型,第一个RED是第一kkkkkk'k'k'k+// enum 是一个枚举类型,第一个RED是第一个枚举值,默认是 0、// 第二个BLACK 是第二个枚举值,kkkkkk'k'k'k红黑树节点的定义:```c++🍉 上面的构造函数中,为什么默认节点的颜色要给成 红色呢?保持树的黑色高度不变。因为红黑数的性质4: 对于每个结点,从该结点到其所有后代叶子结点的简单路径上,均包含相同数目的黑色结点。

2025-01-31 13:23:00 1057

原创 缓冲区和c库的简单实现

对于变量。

2025-01-26 13:35:07 1105

原创 重定向与缓冲区

运行的操作:上面,我们写了 4 个向显示器打印的语句。接下来,我们输出重定向到log.txt中;上面的操作做完之后,现在 我们来开始试验,现在,我们在myfile.c中加上一行代码;// <---------------------------------------- 注意fork的位置return 0;加上这一句fork();

2025-01-26 13:32:46 911

原创 AVLTree 树

所以,搜索二叉树的一个潜在问题就是它可能会变得不平衡,导致树的高度增加,从而使得查找、插入和删除操作的时间复杂度从理想的O(log n)退化到O(n)。AVL 树 叫做高度平衡二叉搜索树,它是通过高度来平衡的,它要求左右子树的高度差不超过 1 ,那为什么是相等呢?因为有些数量下我们是做不到左右节点高度差相等的,但是我们可以做到高度差不超过 1。

2025-01-11 14:33:52 725

原创 文件 fd

❓ 当我们在系统中创建一个空文件时,这个文件要不要占据磁盘的空间(注意是空文件哟)答案:当然是要占据磁盘的空间的,文件不仅只包括内容,还有它的属性呀,就是创建时间,用户是谁,修改时间之类的,所以即便这个文件是一个空文件,但它也有属性呀,所以也要占据空间文件 = 内容 + 属性。

2024-11-16 17:18:51 738 1

原创 map和 set

make_pair。

2024-10-05 10:25:47 816

原创 自定义 shell文件系统

🏷️ 材料准备创建一个文件:myshell.c:#include <stdio.h>int main(){ return 0;}创建一个 Makefile 文件,文件内容如下:  1 mybash:myshell.c  2   g++ -o $@ $^ -std=c++11                      &nbs

2024-10-05 10:23:37 822

原创 进程程序替换

printf我们当前的系统识别到了对应的可执行程序,它要创建对应的进程,它会先创建进程的内核数据结构(什么 PCB,地址空间,页表之类的),然后把磁盘中的相应的代码和数据通过类似 exec* 这样的接口加载到物理内存之中。这个时候我们修改一下我们的代码,自定义环境变量。// 在这里声明一下。int main()// 自己定义一个环境变量"MYVAL4=11111111111111111111111111", NULL // 注意不要忘了,以 NULL 结尾。// 创建子进程。

2024-10-02 10:59:36 714

原创 Linux 进程等待与替换

通过的方式,让父进程(一般)对子进程进行资源回收的等待过程如何来理解呢?想象一下,你在一家餐厅里,服务员问你需要什么。如果你选择“阻塞等待”,就像是你坐在餐桌旁,什么都不做,只等着服务员给你上菜。在这期间,你不能做其他任何事情,比如玩手机或者和朋友们聊天,因为你的注意力完全集中在等待上菜上。而“非阻塞等待”则像是你可以告诉服务员,你不需要他们立即上菜。这样,你就可以继续做其他事情,比如和朋友聊天或者玩手机。当你的菜准备好了,服务员会过来告诉你,这时候你再开始吃饭。

2024-09-04 21:35:22 1112

原创 606. 根据二叉树创建字符串

给你二叉树的根节点root,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对"()"表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。: 初步转化后得到 “1(2(4)())(3()())” ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)"。和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

2024-08-03 08:46:31 598 1

原创 Linux 进程控制

forkpid_t。函数返回的时候,如果是它就返回子进程的pid,如果是它就返回0。fork有返回值。进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程(就是创建子进程的 pcb, 地址空间,页表 构建映射关系)将父进程部分数据结构内容拷贝至子进程(就是用父进程对应的一些字段来初始化子进程,所以页表才会指向同一个地址 )添加子进程到系统进程列表当中fork返回,开始调度器调度。

2024-07-30 08:06:32 971

原创 进程地址空间

一个进程能够访问的空间的范围,我们知道是:2的32次方,(32根数据线,一共有2的32种方式)这个进程不能把这个范围全部访问完,但是这个进程可以访问的范围是这么大,所以叫进程地址空间。在操作系统中,地址空间是指一系列地址,这些地址用来表示计算机内存中的每一个字节。地址空间是一个抽象概念,它为操作系统和程序提供了一种机制,以便在不干扰其他程序的情况下管理和使用内存资源。

2024-07-20 11:55:47 614

原创 搜索 2 叉树

二叉搜索树 (BsT,BinarySearchTree) 也称二叉排序树或二叉查找树二叉搜索树:一棵二叉树,可以为空;如果不为空,

2024-07-20 09:07:14 781

原创 多态的一些问题

多态性使得代码更具灵活性和可扩展性,能够通过统一的接口处理不同类型的对象,从而实现代码的复用和模块化。静态多态通过函数重载和模板在编译时实现,而动态多态通过继承和虚函数在运行时实现。重载、重写(覆盖)和重定义(隐藏)是面向对象编程中的三个不同概念,它们各自有不同的用途和特性。重定义(或隐藏)指的是在派生类中重新定义基类中的非虚函数或名称相同但参数不同的函数。重定义会隐藏基类中的同名函数,但不会影响虚函数的行为。

2024-05-31 20:16:15 862

原创 多态的学习

即被virtual修饰的类成员函数称为虚函数public:virtual void BuyTicket() { cout << "买票-全价" << endl;从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此:C++11提供了override和final两个关键字,可以帮助用户检测是否重写。

2024-05-12 20:06:46 1030

原创 test_for_linux

本章图集

2023-12-20 10:47:10 454

原创 linux_环境变量

=

2023-12-10 14:14:03 554

原创 c++_继承

很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。上面的代码例子就是组合。想一想:继承和组合的相同点是什么,不同点是什么?🔎相同点:1. 都可以复用(继承的核心是复用:子类复用父类。

2023-11-25 09:25:03 1009

原创 c++ 继承

我们可以得出下面的一个表格:这里,我们来理解一下protected和private在以前,我们认为它们的区别不是那么明显:都是在类外面不能使用,只能在类里面使用。但是现在,如果我们想定义一个成员变量,这个成员变量可以继承(也就是可以被子类使用)但是只能在子类中使用,不能在类外使用,由于,private成员变量不能被子类使用,所以我们这个时候可以用protected基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私。

2023-11-06 16:57:17 121

原创 c++ 模版的一些注意问题

中 我们不是没有实例化导致没法生成地址吗,那我们就实例化它,我们在。函数不是一个普通函数 而是 一个函数模版。所以这也不是万全之策;这样就行了,我们把它实例化为了。, 但是这样有个弊端,我想用。再来一个用来使用上述函数的。

2023-10-24 17:21:36 122

原创 prority_queue的学习

优先级队列(Priority Queue)是一种抽象数据类型,它类似于普通的队列或堆栈,但每个元素都有一个关联的优先级,这个优先级决定了元素在队列中的位置和被访问的顺序。在优先级队列中,具有最高优先级的元素通常最先被访问,而具有较低优先级的元素会在后面被访问。在C++ STL中,通常使用作为默认的底层容器来存储元素。这意味着``priority_queue使用std::vector来管理元素并维护堆的性质,而不是直接使用二叉树结构。

2023-10-06 11:47:51 279

原创 仿函数的学习

仿函数是什么东西?但是我如果告诉你,less是一个我自定义的一个类的对象呢?这种看起来像函数调用,但其实不是函数调用,这种就是仿函数它的原理可以这样来理解:这个仅仅针对int。

2023-10-05 21:36:07 121

原创 Linux 下如何调试代码

是release模式那你怎么证明他就是release版本?我们知道如果一个程序可以被调试,那么它一定是debug版本,如果它是release版本,它是没法被调试的,所以说我们可以来调试一下在Linux下,我们要遇到的调试工具是gdb使用gdb --v命令来查看我们是否安装了gdb这个工具如何调试程序?比如,我们生成了一个可执行程序叫mycodegdb mycode就会进入这样一个调试窗口:如果是release 是无法被调试的:quit退出gdb。

2023-10-03 18:00:44 602

原创 git使用,一点点

如果没有安装请执行来安装。

2023-10-02 09:34:28 313

原创 c++ 容器适配器

上面代码就是一个容器适配器,这上面的代码可以被认为是一个容器适配器,因为它采用了一个已有的容器(通过模板参数Container)来实现栈的功能。容器适配器是一种在标准容器之上提供额外接口或修改现有接口的抽象层。Container:通过使用模板参数Container,这个栈类允许用户选择不同的容器类型来存储数据。用户可以传入任何符合栈要求的容器,例如std::deque、或者其他符合要求的容器类型。:该栈类封装了底层容器的操作,如push_backpop_backback。

2023-10-01 23:38:33 184

原创 vim 工具的使用

注:以下操作都在普通模式下进行。

2023-09-29 11:18:04 544

原创 6-1 汉诺塔

其中参数n是圆盘数 、from是原来叠放圆盘的塔座 、to是最终叠放圆盘的塔座 、by是可借助的塔座。

2023-09-20 13:10:27 944

原创 linux 下实现一个进度条

printf 打印的内容是被放在输出缓冲区的刷新 输出缓冲区;\n也是一种刷新的策略我们称之为行刷新理解一下回车换行首先:回车是回车 换行是换行回车是回到这一行的开头换行是换到下一行所以我们平时使用的 Enter 键 其实是执行了两个操作的\r表示的是只回车的意思下面是一个倒计时代码。

2023-09-14 21:11:32 283

原创 linux Makefile

当Makefile 检查到你写的源代码没有改变的时候,为了避免对源代码重复编译造成时间浪费 所以它只让你执行一次。默认情况下执行生成一个目标文件,当目标文件生成之后就不会执行之后的代码了。是的 touch 命令不仅可以创建文件还可以更新文件的时间。: 将已经存在的这个 code.c 的所有时间全部更新。可以查看 code.c 这个文件的 属性信息;: 更改文件的 Modify 时间。: 更改文件的 access 时间。如何更新文件的时间?

2023-09-14 12:27:46 148

原创 学习list

【代码】学习list。

2023-09-13 14:53:21 57

原创 vector 的学习

【代码】vector 的学习。

2023-09-11 23:16:44 41

原创 string的学习

【代码】string的学习。

2023-09-10 16:29:46 170

原创 Linux vim

xrW。

2023-09-06 17:26:54 455

原创 二叉树中的堆

堆在逻辑上是二叉树来存储的,就是在我们的想象中他是按二叉树来存储的,但是在实际上,它是以数组的形式来存储的,就是在内存中的的存储方式是数组;树中的任何一个父亲都大于等于孩子。树中的任何一个父亲都小于等于孩子。

2023-08-30 17:47:46 89

原创 类 中下的一些碎片知识点

答:能同时存在,因为构成函数重载(注意函数的返回值不同是不能构成函数重载的)。答:不能,因为权限被放大了,(权限只能平移或缩小)判断下面两个函数是否能同时存在。答:可以,因为权限是可以缩小的。答:可以,权限缩小了。的位置是不影响的,在。

2023-08-30 17:47:10 83

原创 c++ string

操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。vector,是数组实现的,也就是说,只要知道数组的首地址,就能访问到后面的元素。所以,我们可以通过访问vector的迭代器来遍历vector容器元素。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。(就是你定义的那个迭代器的那个变量)赋值给。的自动遍历它是指的什么呢,它是指的将。

2023-08-28 13:59:53 64

原创 类模版的实例化

注意:这么写是错的因为Vector只是类名,这里我们要用类型,所以要把模版参数加上:要写成Vector的形式。但是这么写还有一个问题:只能在类里面使用,但是这里的析构函数的定义是在类外进行的,所以T用不了。所以我们还要在声明一下 T。

2023-08-23 16:19:45 285

空空如也

空空如也

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

TA关注的人

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