- 博客(137)
- 收藏
- 关注
原创 Linux 进程等待与替换
通过的方式,让父进程(一般)对子进程进行资源回收的等待过程如何来理解呢?想象一下,你在一家餐厅里,服务员问你需要什么。如果你选择“阻塞等待”,就像是你坐在餐桌旁,什么都不做,只等着服务员给你上菜。在这期间,你不能做其他任何事情,比如玩手机或者和朋友们聊天,因为你的注意力完全集中在等待上菜上。而“非阻塞等待”则像是你可以告诉服务员,你不需要他们立即上菜。这样,你就可以继续做其他事情,比如和朋友聊天或者玩手机。当你的菜准备好了,服务员会过来告诉你,这时候你再开始吃饭。
2024-09-04 21:35:22 1089
原创 606. 根据二叉树创建字符串
给你二叉树的根节点root,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对"()"表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。: 初步转化后得到 “1(2(4)())(3()())” ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)"。和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。
2024-08-03 08:46:31 567 1
原创 Linux 进程控制
forkpid_t。函数返回的时候,如果是它就返回子进程的pid,如果是它就返回0。fork有返回值。进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程(就是创建子进程的 pcb, 地址空间,页表 构建映射关系)将父进程部分数据结构内容拷贝至子进程(就是用父进程对应的一些字段来初始化子进程,所以页表才会指向同一个地址 )添加子进程到系统进程列表当中fork返回,开始调度器调度。
2024-07-30 08:06:32 949
原创 进程地址空间
一个进程能够访问的空间的范围,我们知道是:2的32次方,(32根数据线,一共有2的32种方式)这个进程不能把这个范围全部访问完,但是这个进程可以访问的范围是这么大,所以叫进程地址空间。在操作系统中,地址空间是指一系列地址,这些地址用来表示计算机内存中的每一个字节。地址空间是一个抽象概念,它为操作系统和程序提供了一种机制,以便在不干扰其他程序的情况下管理和使用内存资源。
2024-07-20 11:55:47 593
原创 搜索 2 叉树
二叉搜索树 (BsT,BinarySearchTree) 也称二叉排序树或二叉查找树二叉搜索树:一棵二叉树,可以为空;如果不为空,
2024-07-20 09:07:14 761
原创 多态的一些问题
多态性使得代码更具灵活性和可扩展性,能够通过统一的接口处理不同类型的对象,从而实现代码的复用和模块化。静态多态通过函数重载和模板在编译时实现,而动态多态通过继承和虚函数在运行时实现。重载、重写(覆盖)和重定义(隐藏)是面向对象编程中的三个不同概念,它们各自有不同的用途和特性。重定义(或隐藏)指的是在派生类中重新定义基类中的非虚函数或名称相同但参数不同的函数。重定义会隐藏基类中的同名函数,但不会影响虚函数的行为。
2024-05-31 20:16:15 835
原创 多态的学习
即被virtual修饰的类成员函数称为虚函数public:virtual void BuyTicket() { cout << "买票-全价" << endl;从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此:C++11提供了override和final两个关键字,可以帮助用户检测是否重写。
2024-05-12 20:06:46 1001
原创 c++_继承
很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。上面的代码例子就是组合。想一想:继承和组合的相同点是什么,不同点是什么?🔎相同点:1. 都可以复用(继承的核心是复用:子类复用父类。
2023-11-25 09:25:03 991
原创 c++ 继承
我们可以得出下面的一个表格:这里,我们来理解一下protected和private在以前,我们认为它们的区别不是那么明显:都是在类外面不能使用,只能在类里面使用。但是现在,如果我们想定义一个成员变量,这个成员变量可以继承(也就是可以被子类使用)但是只能在子类中使用,不能在类外使用,由于,private成员变量不能被子类使用,所以我们这个时候可以用protected基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私。
2023-11-06 16:57:17 110
原创 c++ 模版的一些注意问题
中 我们不是没有实例化导致没法生成地址吗,那我们就实例化它,我们在。函数不是一个普通函数 而是 一个函数模版。所以这也不是万全之策;这样就行了,我们把它实例化为了。, 但是这样有个弊端,我想用。再来一个用来使用上述函数的。
2023-10-24 17:21:36 111
原创 prority_queue的学习
优先级队列(Priority Queue)是一种抽象数据类型,它类似于普通的队列或堆栈,但每个元素都有一个关联的优先级,这个优先级决定了元素在队列中的位置和被访问的顺序。在优先级队列中,具有最高优先级的元素通常最先被访问,而具有较低优先级的元素会在后面被访问。在C++ STL中,通常使用作为默认的底层容器来存储元素。这意味着``priority_queue使用std::vector来管理元素并维护堆的性质,而不是直接使用二叉树结构。
2023-10-06 11:47:51 217
原创 仿函数的学习
仿函数是什么东西?但是我如果告诉你,less是一个我自定义的一个类的对象呢?这种看起来像函数调用,但其实不是函数调用,这种就是仿函数它的原理可以这样来理解:这个仅仅针对int。
2023-10-05 21:36:07 108
原创 Linux 下如何调试代码
是release模式那你怎么证明他就是release版本?我们知道如果一个程序可以被调试,那么它一定是debug版本,如果它是release版本,它是没法被调试的,所以说我们可以来调试一下在Linux下,我们要遇到的调试工具是gdb使用gdb --v命令来查看我们是否安装了gdb这个工具如何调试程序?比如,我们生成了一个可执行程序叫mycodegdb mycode就会进入这样一个调试窗口:如果是release 是无法被调试的:quit退出gdb。
2023-10-03 18:00:44 463
原创 c++ 容器适配器
上面代码就是一个容器适配器,这上面的代码可以被认为是一个容器适配器,因为它采用了一个已有的容器(通过模板参数Container)来实现栈的功能。容器适配器是一种在标准容器之上提供额外接口或修改现有接口的抽象层。Container:通过使用模板参数Container,这个栈类允许用户选择不同的容器类型来存储数据。用户可以传入任何符合栈要求的容器,例如std::deque、或者其他符合要求的容器类型。:该栈类封装了底层容器的操作,如push_backpop_backback。
2023-10-01 23:38:33 173
原创 linux 下实现一个进度条
printf 打印的内容是被放在输出缓冲区的刷新 输出缓冲区;\n也是一种刷新的策略我们称之为行刷新理解一下回车换行首先:回车是回车 换行是换行回车是回到这一行的开头换行是换到下一行所以我们平时使用的 Enter 键 其实是执行了两个操作的\r表示的是只回车的意思下面是一个倒计时代码。
2023-09-14 21:11:32 263
原创 linux Makefile
当Makefile 检查到你写的源代码没有改变的时候,为了避免对源代码重复编译造成时间浪费 所以它只让你执行一次。默认情况下执行生成一个目标文件,当目标文件生成之后就不会执行之后的代码了。是的 touch 命令不仅可以创建文件还可以更新文件的时间。: 将已经存在的这个 code.c 的所有时间全部更新。可以查看 code.c 这个文件的 属性信息;: 更改文件的 Modify 时间。: 更改文件的 access 时间。如何更新文件的时间?
2023-09-14 12:27:46 105
原创 二叉树中的堆
堆在逻辑上是二叉树来存储的,就是在我们的想象中他是按二叉树来存储的,但是在实际上,它是以数组的形式来存储的,就是在内存中的的存储方式是数组;树中的任何一个父亲都大于等于孩子。树中的任何一个父亲都小于等于孩子。
2023-08-30 17:47:46 80
原创 类 中下的一些碎片知识点
答:能同时存在,因为构成函数重载(注意函数的返回值不同是不能构成函数重载的)。答:不能,因为权限被放大了,(权限只能平移或缩小)判断下面两个函数是否能同时存在。答:可以,因为权限是可以缩小的。答:可以,权限缩小了。的位置是不影响的,在。
2023-08-30 17:47:10 71
原创 c++ string
操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。vector,是数组实现的,也就是说,只要知道数组的首地址,就能访问到后面的元素。所以,我们可以通过访问vector的迭代器来遍历vector容器元素。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。(就是你定义的那个迭代器的那个变量)赋值给。的自动遍历它是指的什么呢,它是指的将。
2023-08-28 13:59:53 52
原创 类模版的实例化
注意:这么写是错的因为Vector只是类名,这里我们要用类型,所以要把模版参数加上:要写成Vector的形式。但是这么写还有一个问题:只能在类里面使用,但是这里的析构函数的定义是在类外进行的,所以T用不了。所以我们还要在声明一下 T。
2023-08-23 16:19:45 241
原创 C/C++内存管理
c++ 兼容 c 语言 对内置类型的动态申请,用法简化了,功能保持一致单个对象用new多个对象用不用了的话就c语言是free,c++ 是deletec++ 额外支持开空间+初始化的功能可以调用默认构造函数,但是malloc却不行delete可以调用析构函数,但是free不行,所以这就是为什么c++ 要创建 new 和 delete。
2023-08-23 11:09:04 107
原创 c++ 有元
概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加。,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。但又会导致类外没办法访问成员,此时就需要友元来解决。,只是说,B类 要受到 A 类的。
2023-08-13 09:54:14 366
原创 c++ static
static 成员声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。看看下面代码体会一下://其他类class A{public: //默认构造 A() { n++; m++; } //拷贝构造 A(const A& a) { n++; m++; } //析构函数 ~A() { --m; }priva
2023-08-12 17:48:49 195
原创 构造函数——初始化列表
答:声明是不用开空间的,而变量的定义是开空间的。思考下面问题,为什么对象不在整体定义的时候就直接定义呢?为什么c++的祖师爷非要找个初始化列表来定义呢??
2023-08-12 11:59:05 435
原创 c++ 运算符重载
观察下列代码,当我们要比较两个日期类(自定义类型)的大小的时候,我们没法使用编译器自带的小于d1 < d2我们需要自己写一个函数来进行比较,这是很麻烦的。我们想要编译器来帮我们比较,而不需要自己去写一个函数。这个时候就要用到运算符重载。
2023-08-08 15:29:12 118
原创 c++ 拷贝构造
日期类(Date)不需要我们实现拷贝构造,编译器默认生成的就可以直接用了。但是栈这个类需要我们自己来写一个拷贝构造函数来实现深拷贝,因为编译器默认生成的会出现问题//拷贝构造函数 用同类型的对象来初拷贝始化它,所以叫拷贝构造 Date(const Date & d) {我们为什么要加一个const?因为在使用的时候,如果某一天你喝了酒,你把两个变量的位置写反了,这个时候你又没有察觉。那么就会造成一些错误的情况出现。所以这个时候我们可以在前面加一个const限制一下。
2023-08-07 17:49:16 196
原创 类的默认成员函数——析构函数
析构函数的功能和构造函数的功能是相反的,构造函数的功能是完成初始化,析构函数的功能是完成对象中资源清理的工作注意析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作清理的哪些资源?malloc 和 fopen等这些的。
2023-08-06 11:02:06 136
原创 类的6个默认成员函数 构造函数
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
2023-08-05 14:58:04 108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人