自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux 进程间通信 —— systemV 信号量】

在并发编程中,多个进程或线程可能同时访问共享资源,如果不加以限制,就会出现竞态条件(Race Condition)。竞态条件指的是多个进程或线程在相同的资源上进行读写操作时,由于执行顺序的不确定性,导致程序的行为出现异常或结果不一致的情况。

2024-05-16 16:37:03 761

原创 【Linux 进程间通信 —— systemV 共享内存】

因为共享内存其自身的特点,没有额外的拷贝过程,所以共享内存是进程最快的方式,所以共享内存并不保证通信的同步,数据在读取之后也不会清空,所以就能看到一直在之前所读到底字符串后面添加继续打印,。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据.此时再运行程序,即可发现关联该共享内存的进程数由0变成了1,而共享内存的权限显示也不再是0,而是我们设置的666权限。来创建了一个共享内存,打印出其key的十六进制数和shmid。

2024-05-16 16:23:03 1042

原创 【Linux进程通信 —— 管道】

在 Linux 中,进程间通信(IPC,Inter-Process Communication)是指不同进程之间交换数据和信息的一种机制。这种通信可以是在同一台计算机上的不同进程之间,也可以是在不同计算机之间的进程之间。管道(Pipe)是一种用于进程间通信的机制,允许一个进程的输出直接成为另一个进程的输入。它主要用于在父进程和子进程之间或者在同时运行的两个进程之间进行通信。管道可以分为匿名管道(Anonymous Pipe)和命名管道(Named Pipe)两种类型。

2024-05-15 21:32:28 701 1

原创 【C++ —— 多态】

必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上= 0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。class Car //包含纯虚函数所以叫抽象类public:virtual void Drive() = 0 //纯虚函数{}

2024-05-02 22:46:12 851 1

原创 【C++ 继承】

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了。

2024-04-28 17:24:25 987

原创 【Linux动态库和静态库】

在链接阶段,编译器会将编译后的目标文件和库文件链接成一个可执行文件。这时候库文件才发挥作用,它们被链接到可执行文件中,使得可执行文件包含了库中的函数和数据。对于静态库,链接器会将库中的目标文件直接复制并链接到可执行文件中;对于动态库,链接器只会在可执行文件中包含对动态库的引用,而不包含实际的库函数和数据。

2024-04-28 11:27:37 740

原创 【Linux —— 再谈软硬链接】

再谈软硬链接

2024-04-22 11:09:12 879 3

原创 【C++模板详解 —— 函数模板与类模板】

C++模板 ——— 函数模板和类模板

2024-04-18 20:30:05 876 4

原创 【STL详解 —— priority_queue的使用与模拟实现】

priority_queue模拟

2024-04-16 21:05:13 1187

原创 【STL详解 —— stack和queue的模拟实现】

stack与queue的模拟

2024-04-16 20:14:52 529

原创 【STL详解 —— stack和queue的介绍及使用】

首先先介绍一下容器适配器。容器适配器是一种设计模式,用于在现有容器的基础上提供新的接口或修改现有接口,以满足特定的需求或者提供特定的功能。在C++中,容器适配器通常是通过组合一个已有的容器来实现的。在C++标准库中,容器适配器是通过模板类来实现的,它们提供了特定的接口,使得用户可以方便地使用已有的容器来实现不同的数据结构或算法。常见的容器适配器包括:stack(栈):提供了后进先出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。

2024-04-14 21:24:03 1018 1

原创 【STL详解 —— list的模拟实现】

如果 ListNode 的 _data 成员是内置类型(如 int, double, char 等),或者是一些简单的、不需要特殊资源管理的自定义类型(例如不涉及动态内存管理的类),那么编译器生成的默认析构函数足以正确清理 ListNode 对象。对于拷贝构造函数,我们先申请一个头结点,并让其前驱指针和后继指针都指向自己,然后将所给容器当中的数据,通过遍历的方式一个个尾插到新构造的容器后面即可。这样的封装提供了清晰的职责分离,并模仿了 STL 的设计哲学,每个类都具有特定的功能和目的。

2024-04-14 16:36:18 917

原创 【STL详解 —— list的介绍及使用】

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2024-04-13 22:43:02 728

原创 【Linux基础IO】

man 2 open。

2024-04-10 15:01:29 706 4

原创 【C++STL详解 —— vector的模拟实现】

start_finish和。这些成员变量共同管理着vector的存储空间和元素。_start:指向数组开始的指针,也就是vector中第一个元素的位置。_finish:指向数组中最后一个有效元素之后的位置,这个位置是新元素插入的地方。:指向分配的内存空间结束的位置之后的那个位置。这个位置标记了vector可以在不重新分配内存的情况下扩展到的最远位置。:从start到end_of_storage的区域是vector当前分配的整个内存空间,它决定了vector能够容纳的最大元素数量(容量)。

2024-04-04 17:57:55 791

原创 【C++STL详解 —— vector的介绍及使用】

在C++中,vector是一个非常重要和常用的容器类型,它是标准模板库(Standard Template Library, STL)的一部分。简单来说,vector是一个能够存储任意类型元素的动态数组,其大小可以在运行时自动扩展或缩减。与普通数组不同,vector可以根据需要动态地增加或减少元素,而不需要程序员手动管理内存。vector是一个模板类,意味着它可以用来存储任意类型的对象。例如,vector用于存储整数,vector用于存储字符串。vector自动管理其存储的元素的内存。

2024-04-04 14:44:48 957

原创 【Linux进程控制】

将进程调度和内存解耦进行管理,让我们对应的进程访问地址时,内存时,以同一的视角访问,另外虚拟内存加页表,对我们的进程对应的内存操作,进行软硬件操控,对不合理的请求直接而截止,页表可以对我们的指定内存区域进行限设定。我们可以观察到,两次After的PID是不一样的,,但是第一个After的return值与第二个After的PID相同,所以我们根据上面的知识可以猜测到:第一个After是父进程,第二个是子进程。每一个数字表示一种失败的原因。在status的低16比特位当中,高8位表示进程的退出状态,即退出码。

2024-03-26 19:17:00 647 2

原创 【Linux 进程概念】

计算机管理硬件描述起来,用struct结构体组织起来,用链表或其他高效的数据结构。

2024-03-20 16:23:57 1073 3

原创 【C++STL详解 —— string类的模拟实现】

【代码】【C++STL详解 —— string类的模拟实现】

2024-03-09 12:11:57 413 1

原创 【C++STL详解 —— string类】

string s();//构造一个空字符串//复制s所指向的字符序列//复制s所指向的字符序列的前n个字符//生成n个c字符的字符串//生成str的复制//复制str中字符位置pos开始并且跨越len个字符的部分。

2024-03-06 20:36:31 1236 10

原创 【C++ 模板初阶】

class 类模板名// 类内成员定义下面来实现一个模板Vector,并且在内里定义的函数如果要在内外定义,需要加模板参数列表。public:,_size(0)//使用析构函数,在类内声明,内外定义~Vector();除此之外,类模板不支持分离编译,即声明在xxx.h文件中,而定义却在xxx.cpp文件中。

2024-02-27 19:17:47 949 1

原创 【C/C++内存管理详解】

new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数delete[]的原理在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。

2024-02-15 17:44:29 1046 3

原创 【C++类与对象(下)】

关键字explicit来修饰构造函数。

2024-02-10 13:03:52 962

原创 【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

在我们每次重新生成可执行程序前,都应该将上一次生成可执行程序时生成的一系列文件进行清理,但是如果我们每次都手动执行一系列指令进行清理工作的话,未免有些麻烦,因为每次清理时执行的都是相同的清理指令,这时我们可以将项目清理的指令也加入到Makefile文件当中。对同一份源代码分别生成其release版本和debug版本的可执行程序,并通过ll指令可以看到,debug版本发布的可执行程序的大小比release版本发布的可执行程序的大小要大一点,其原因就是以debug版本发布的可执行程序当中包含了更多的调试信息。

2024-02-09 13:27:10 3454 2

原创 【Shell的运行原理以及Linux当中的权限问题】

该提示说你没有被超级用户(root)添加到信用列表当中,所以该条指令的权限得不到提升(你想想嘛,怎么可能让一个普通用户随意更改另一个普通用户的密码嘛),只有当你被超级用户添加到信任列表后,你才拥有提升当前指令权限的能力。但实际上你会发现,你所创建出来的文件和目录的权限值往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。

2024-02-04 16:49:42 1000

原创 【Linux常见指令汇总(入门必备)】

特别注意: 上面说到 -f 是强制性删除,-r 是递归式删除,这两个结合在一起就是递归式强制性删除,千万不要执行以下指令,因为在Linux当中没有类似回收站的东西也没有撤销删除的功能,删除指令一旦执行则是不可逆的。4)网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup。2)-a 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。

2024-02-04 00:51:30 960

原创 【C++类与对象(中)】

首先我们先了解一下:在C++中,数据类型可以分为。

2024-01-30 16:06:26 817

原创 【C++类与对象(上)】

首先来观察一下类的结构// 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字className为类的名字{ } 中为类的主体注意:类定义结束时后面的分号;不能省略类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。类声明放在.h文件中成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名.// 我们看看这个函数,是不是会产生歧义。

2024-01-27 17:02:02 902

原创 【C++入门基础】

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行。

2024-01-26 16:36:10 779 6

原创 【数据结构 | 希尔排序法】

所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。但是要实现希尔排序,gap应该怎么设定呢?,此时的直接插入的时间复杂度就比较低。希尔排序法的基本思想是:先选定一个。,完成最后的排序,只不过此时的数组基。,所有记录在统一组内排好序。但是,最后gap的值总归会。,把待排序文件中所有记录。这样就可以保证最后一个的。

2024-01-14 21:30:38 706

原创 【数据结构 | 直接插入排序】

理牌的方法都是不用教的。将3和4移动到5的左侧,再将2移动到最左侧,顺序就算是理好了。这里,我们的理牌方法,就是直接插入排序法。扑克牌是我们几乎每个人都可能玩过的游戏。最基本的扑克玩法都是一边摸牌,边理牌。我们规定,从第一个数字开始,第二个数字与第一个相比,若小,则交换位置。当不小于前面这个数字时,则吧该数字插到。往前遍历,比较大小,若排。

2024-01-14 21:06:25 613 1

原创 【数据结构 | 直接选择排序】

直接插入排序(StraightInsertionSort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。扑克牌是我们几乎每个人都可能玩过的游戏°最基本的扑克玩法都是—边模牌,—两个变量来记录最大和最小值,初始化同时为数组第一个数字。顺序就算是理好了,这里我们的理牌方法,就是。缩短数组范围,再重复以上步骤,即可。然后通过遍历整个数组,更新。按照以上步骤完成代码。我们有如下数组需要排序。

2024-01-14 17:35:35 518

原创 【C语言题解】 | 572. 另一棵树的子树

若与root不相同,则仍需与root的子树进行相比较,直至比较完。该题目需要判断一二叉树是否为另一二叉树的子树。(判断是否二叉树是否相同可参考。相比较,判断二者是否相同。

2024-01-08 17:19:33 572 1

原创 【C语言题解】 | 144. 二叉树的前序遍历

为形参,在函数调用时用于返回改题目所求数组的长度,因为由于C语言的局限,只能返回一个参数,所以采用这种通过传入指针的形参,来改变函数外部实参的方法。因为根据上述代码,求得节点个数为n,则该数组一共有n个空间,控制写入数组的下标需要传入。首先先计算二叉树的节点个数,用于后续的数组空间申请。题目要求给一个二叉树的根节点,返回其。,形参的改变不影响实参的改变。首先先观察一下这个函数原型,函数构建数组,返回数组。为形参,传入根节点,

2024-01-08 16:46:11 482

原创 【C语言题解】 | 101. 对称二叉树

函数,然后再依次通过递归,判读根节点的左右节点的值是否相同,再往下递归。这个题目要求判断该二叉树是否为对称二叉树,此题与上一题,即。这个题有异曲同工之妙,故此题可借鉴上题。我们先传入需要判断二叉树的根节点,通过。

2024-01-08 16:28:23 538

原创 【C语言题解】| 100. 相同的树

通过分析这个题目,可知道传入两颗二叉树的根节点,然后逐个比较这两个二叉树的结构和值是否都一样,不同返回。我们将一颗二叉树分为根节点,左子树,右子树,左子树与右子树均是一颗独立的树,同时比较。若两颗子树的根节点左右子树不同(即结构不一致),则返回。若左右子树的跟节点值不同,则返回false。继续递归节点的左右子树,并且返回。

2024-01-08 16:06:13 533

原创 【C语言题解】 | 965. 单值二叉树

其次判断根节点是否有左子树和右子树,若存在则判断左右子树的值是否于根节点的值相同(不同则返回false,相同则继续)若正确,则继续向下递归,但是由于此题目要求返回。因为是左右子树都必须满足,所以是。,所以,我们需要返回。

2024-01-08 15:56:07 525

原创 【数据结构 | 二叉树入门】

采用分治的思想,从root开始递归,有叶子节点就返回1,这个二叉树一共三个叶子节点,所以有返回3次1,相加得3.在一棵二叉树中,如果所有分支结点都存在左子树和右子树并目所有叶子都在同。> 并且从左到右连续的满二叉树称为完全二叉树。还是采用分治思想,当k=1时,返回一个节点数。如下图,是一个二叉树,二叉树是一种特殊的树。是比较自然的想法,我们称这样的链表叫做。一层上,这样的二叉树称为满二叉树。(5)根结点既有左子树又有右子树。(4)根结点只有右子树。则这棵树的先序遍历为。则这棵树的中序遍历为。

2024-01-04 12:53:29 581 1

原创 【数据结构 | 堆及其堆排序】

堆的删除,规定只能删除堆顶的元素,即将堆顶元素和最后一个元素相互交换,然后再下调。排序的序列构造成-个大顶堆°此时’整个序列的最大值就是堆顶的根结点。(具实就星将具与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的。它的基本思想是’将待。在建堆的时候,我们先从最后一个有孩子的节点开始下调,这样排的效率高。我们在这里写数组堆,里面有一个动态规划的数组,命名为a。:每个结点的值都大于或等于其左右孩子结点的值。:个结点的值都小于或等于其左右孩子结点的值。所以对于堆的插入即在数组的尾部插入数据。

2024-01-02 17:21:15 831

原创 【C语言题解】| 20. 有效的括号

因为要求括号的顺序与数量都得匹配,所有本题会用到栈的数据结构来解决这个问题。则当栈为空时,仍会调用。本题解将从C语言入手。

2023-12-25 16:53:22 520

空空如也

空空如也

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

TA关注的人

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