自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】进程间通信

进程之间为什么需要通信?数据传输:一个进程需要将它的数据传输给另一进程资源共享:多个进程共享同一资源通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变进程池预先创建一组进程,这些进程在初始化阶段就被创建并处于等待任务的状态。

2024-12-01 23:39:38 1108 1

原创 【Linux】基础IO-文件系统和动静态库

而 A 呢不想暴露源码,担心老师发现,然后两个人一块寄了(老师不会主动去检查源码,只要程序能跑就行),所以就把 .c 文件编译成了 .o 文件发给了 B,这样 B 只需要写一个 main.c 文件,调用这些 .o 文件中的接口最后一起编译就可以了,而且不会暴露源码。当然,整个硬盘的空间是非常大的,而一个块的大小也不过是 4 KB,所以如果想把一整个硬盘管理好,最好将其分为几个区,只要管理好一个分区,那么经验就可以套用到其他分区。啊,我们访问目录的内容,也是需要找到目录的 inode,进而访问目录内容。

2024-12-01 22:56:00 982

原创 【Linux】基础IO-文件描述符

例如,进程中默认打开 0、1、2三个文件,我们又打开自己的文件 log.txt,文件描述符为 fd。如果我们想把写入到标准输出的内容重定向到文件,就可以把文件描述符表中,fd 对应的内容拷贝到 1 号下标中,这样 1 号文件描述符指向的文件就是 log.txt 了,向标准输出写数据就是向 log.txt 写内容。我们使用语言层的文件接口写数据时,默认是向用户级缓冲区写数据,然后达成某些条件时,就会被刷新到内核层的缓冲区,而系统调用的 close 关闭文件时,会将内核缓冲区的数据刷入到硬盘,然后关闭文件。

2024-11-26 12:28:42 932

原创 【C++】C++11

以后插入数据时,推荐使用 emplace 系列函数emplace 的保底效率是等于 push 的,在特定场景下是优于 push 的在 emplace 执行 push 的功能时,尽量传递右值,调用移动构造,如果没有移动构造就会调用拷贝构造。

2024-11-26 00:17:08 386

原创 【C++】哈希

map 和 set 底层使用的结构是树形结构,也就是红黑树,查找数据的效率可以达到O(log n),即树的高度次,这个效率已经很高了,但是当树的节点非常多时,效率就不是很理想了在 C++11 中,STL增添了四个 unordered 系列的关联式容器,它们的底层是哈希结构,采用哈希表来实现。在理想情况下,查询效率可以接近 O(1)这四个容器是:unordered_map、unordered_set、unordered_multimap 和 unordered_multiset,它们的使用和 map/set

2024-11-06 11:53:54 1055

原创 【C++】map 和 set(二叉搜索树、AVL树、红黑树)

在之前的文章中,我们了解并模拟实现了一些序列式容器,例如 vector、list 等。这些容器的底层都是线性数据结构,所以叫做序列式容器,其中存储的都是数据本身,数据与数据之间并没有太强的关联性而关联式容器,不仅可以存储数据本身,还可以用来表示数据与数据之间的关系,体现出它们的关联性,而且在搜索时比序列式容器的效率高很多关联式容器中存储的是 形式的键值对结构,这种结构在 STL 中叫做 pair,定义如下pair 有两个成员变量:first 和 second,其中 first 表

2024-10-24 13:59:55 720

原创 【C++】模板

但是函数的第二个参数是 double,而 T 只有一个且已经实例化为 int,不可以再实例化为 double,所以不会匹配。使用模板我们可以只编写一份多种类型通用的代码,剩下的交给编译器来做,但是对于一些特殊情况可能会得到错误结果,我们需要特殊处理这些特殊情况。用不同类型的参数使用函数模板时,称为函数模板的实例化,实例化分为隐式实例化与显式实例化。我们编写的模板,可以理解为一个半成品,编译器只会检查一些基本的语法,例如检查。这样在编译阶段,既有声明又有定义,还可以直接实例化模板,拿到函数的地址。

2024-10-22 21:43:14 836

原创 【C++】stack 和 queue

stack和queue的底层容器默认都是 deque,那么deque到底是个什么东西呢?deque 被称为双端队列,是一种双开口的“连续”空间的数据结构,支持在空间的头部和尾部进行插入删除操作,且效率很高与 vector 相比,deque的头插不用挪动数据,效率很高与 list 相比,deque 一次申请一大块空间,不需要频繁申请空间,deque的空间利用率高虽说叫优先级队列,但是优先级队列的底层是一个堆,默认是一个大堆在优先级队列中,可以随时插入元素,并且自动调整堆。

2024-10-22 21:26:28 1165

原创 【C++】list

然后修改链接关系即可。那么怎么定位到最后一个节点呢?

2024-10-17 21:38:17 814

原创 【C++】vector

vector是一个表示可变大小数组的序列容器vector的底层存储和数组类似,采用连续的空间存储数据。这就意味着vector支持下标访问元素vector的空间大小是动态可变的,当新元素插入,空间不够时,它可以自动扩容vector会分配一些额外的空间来适应数据的增长,所以vector使用的空间比实际需要的空间要大与其他动态序列容器相比,vector访问元素的效率较高,尾插尾删数据的效率也很不错;但是对于其他位置的修改,效率就很低了。

2024-10-05 21:09:14 906

原创 【C++】string

我们需要。

2024-10-01 22:13:46 2947

原创 【C++】内存管理

在C语言中,使用 malloc 函数创建一个自定义对象有些麻烦,例如链表节点int _val;// 创建新节点exit(-1);而使用new就可以直接创建自定义类型对象,会自动为自定义类型开辟空间,并且调用构造函数public::_val(val){}private:int _val;// 开辟空间+调用构造使用 delete 释放自定义类型时,会先自动调用相应的析构函数,再释放空间。

2024-09-30 11:22:33 805

原创 【C++】类和对象(三)

来的,先初始化 _a2,再初始化 _a1。我们用 _a1 的值初始化 _a2,此时 _a1 还没有初始化,是随机值,所以 _a2 就被初始化成随机值。我们在之前的学习中已经知道,如果类 A 中有一个成员是另一个类 B,那么创建 A 类对象调用 A 构造函数时,就会自动调用 B 的构造函数。单参数构造函数的类型转换还是很好用的,例如 Stack 类中的数据类型是自定义类型,我们入一个数据可能要先构造出相应的对象,再将对象入栈。通过调试进入 d1 对象的构造函数,可以看到,在调用构造函数时,就会走初始化列表。

2024-09-27 22:21:15 789

原创 【C++】类和对象(二)

内置类型是语言提供的类型,如 int/char/long 等,自定义类型是我们使用 class/struct/union 定义的类型。

2024-09-26 21:52:34 699

原创 【Linux】自主shell

学习了进程的相关知识后,我们可以试着实践一下,编写一个简单的 shell。我们的目的并不是完美还原一个 shell,而是通过编写 shell 的过程,更好地理解 shell 的工作方式。

2024-09-13 18:32:03 852

原创 【Linux】进程控制

对于这些退出码,我们可以使用默认的,也可以自定义。例如我们写一个简单的除法函数,设置一个全局变量。

2024-09-09 21:55:00 968

原创 【Linux】地址空间

有一天,小明睡觉的时候不小心越过了三八线,于是他按照规定,将三八线向自己移动了 10 cm,他的课桌区域变为了 40 cm长,小红的课桌区域变为了 60 cm长。此时,私生子都向大富翁申请了一笔金额:A 申请了 2 万,B 申请了 10 万,C 申请了 2k,D 申请了 900。不可以,因为此时的 g_val 是父子共用的,如果修改后父进程又拿 g_val 参与运算,就会影响到父进程的运行,破坏了。如果进程直接与内存进行交互,万一发生越界修改数据了,不仅会对此进程造成影响,还可能会导致其他进程的崩溃。

2024-09-07 13:31:04 1508

原创 【Linux】环境变量

这样虽然可以直接执行我们的程序,但是这种方法有点挫,而且直接将我们自己写的程序丢到 /usr/bin 中,可能会污染系统指令集。所以,当我们使用 export 导出环境变量时,是由 bash 亲自执行,修改 bash 维护的 env 表的。上面我们也提到,如果导出环境变量时不加 export,也是可以导出的。可以看到,确实存在 PATH,当我们对这里的 PATH 进行了修改,那就是永久有效的。的路径,bash可以通过这个定位用户的家目录,这样每次我们登录 Linux 就可以直接进入到对应的家目录。

2024-09-04 23:16:21 910

原创 【Linux】进程的状态和优先级

简单来说,优先级就是操作系统中指定进程获取某种资源的先后顺序。在进程的 task_struct 中,进程的优先级用数字表示,或者一个,或者多个// ...int prio;// 优先级用数字表示在 Linux 中,优先级数字越小,表示优先级越高这时可能会有人觉得优先级与权限的意思有点相像,其实是不一样的权限决定的是能不能获取某资源优先级是在已经能的前提下,获取资源的先后顺序。

2024-09-03 22:27:29 1317

原创 【Linux】进程的概念

我们知道,内存中可以存在多个进程,哪个进程该调度,调度多长时间,下一个进程又是谁,这些问题似乎仅凭上图的模型无法解决,这里我们就要引入一个数据结构——,它的代码与数据来源于磁盘;根据冯诺依曼体系规定,我们要运行程序,必须将其加载到内存中,也就是要将程序对应的代码与数据拷贝到内存中。可以看到,查到了我们想要的进程状态,但是我们并不知道这些数据代表什么,我们可以将。我们要明确一点,进程是运行起来的程序,程序是我们写的,我们代表了用户。这很容易理解,我们每次运行一个程序,都是重新创建一个新的进程,

2024-09-02 19:55:32 1397 1

原创 【Linux】vim

本篇文章将介绍vim编辑器的一些基本用法。

2024-09-02 19:26:39 1356

原创 【C++】多态

多态的实现是建立在继承的基础上的。拥有不同继承关系的类对象,调用同一函数,产生不同的结果。例如,Student继承了PersonStudent半价买票,而Person全价买票重载两个函数在同一作用域函数名相同,参数不同重写(覆盖)一个函数在父类作用域,一个函数在子类作用域函数三同:函数名、参数、返回值相同。协变(返回值不同)、析构函数(函数名不同)例外必须都是虚函数重定义(隐藏)一个函数在父类作用域,一个函数在子类作用域函数名相同父类和子类的同名函数不构成重写就是重定义。

2024-04-26 20:55:38 818 1

原创 【C++】继承

以Person和Student// ...// 子类 继承方式 父类// ...其中,Student为子类,public为继承方式,Person为父类多继承的语法复杂。有了多继承,就有可能写出菱形继承,为了解决菱形继承的问题,又需要用到虚拟继承。而虚拟继承的底层又是很复杂的,使用起来容易出问题多继承算是C++的缺陷之一,以至于后来的语言有继承但没有多继承,例如Java继承和组合我们已经了解了继承,组合是什么?组合与继承类似,例如B类继承Aclass Aprotected:int _a;

2024-04-22 18:04:33 1022

原创 【C++】类和对象(一)

定义类与定义结构体类似,不过定义类使用的关键字是class// 类体// 注意分号不要丢了在类中,类体部分的内容称为类的成员, 类中的变量称为类的属性或成员变量;类中的函数称为类的方法或成员函数class Date// 初始化// 成员变量int year;int month;int day;在上面的类中,成员函数Init()的代码是不是不太好看?无法区分形参与成员变量为了避免以上情况,一般是给成员变量加个前缀或后缀,如下class Date// 初始化// 成员变量。

2024-03-28 21:20:50 631

原创 【C++】C++入门(下)

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器。,因为局部变量除了作用域就会销毁,再用引用访问就是非法的,上面所说的都是引用作返回值的错误示例。引用在语法上是没有开空间的,在底层上是有开空间的,即引用的语法含义与底层实现是背离的。现在我们已经对引用有了初步了解,也可以发现引用和指针是类似的,作用是有重叠的。比如,链表的中的指针,链表可以通过修改指针来修改各个节点的指向关系。因为在底层上,引用是用指针实现的,在底层只有指针,没有引用。

2024-01-29 21:22:37 845

原创 【Linux】gcc

在 Linux 系统下我们可以编写C语言程序并编译运行,我们将在本篇文章中学习如何简单地编译运行C语言程序,并了解程序的翻译链接过程。

2024-01-26 16:27:13 862 1

原创 【C++】C++入门(上)

C++在C语言的基础上扩展而来,兼容C语言,解决了C语言的一些弊端与缺陷,并且容纳了面向对象编程思想,拥有许多强大实用的库,以及编程范式今天我们先来了解学习C++是如何对C语言的一些设计缺陷进行优化的。

2024-01-23 17:14:15 883 1

原创 【Linux】基本指令 | 文件 | 目录 | 路径

语法:ls 选项 目录或文件-a 列出目录下的所有文件,包括以 . 开头的隐含文件。-d 将目录象文件一样显示,而不是显示其下的文件。如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件-l 列出文件的详细信息。-n 用数字的 UID,GID 代替名称。(介绍 UID, GID)-F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表。

2023-11-25 20:29:31 209

原创 【数据结构(C语言)】链表

本篇文章将介绍什么是链表,以及如何用C语言实现基础的单链表链表是一种线性表我们知道,线性表在逻辑上是连续的,但在物理上不一定连续,就是说,表中数据的存放地址不一定连续链表就是这样,在逻辑上连续,在物理上不一定连续先将要存储的数据类型进行定义这里存储的数据是整型,如果要存其他类型的数据,只需修改 int 即可定义结构体}SLNode;这个结构表示链表的一个节点,data 用来存放数据,next 用来指向下一个节点单链表的优点链表增加和删除数据不用对数据进行挪动,更加高效。

2023-11-24 23:26:39 86 1

原创 【数据结构(C语言)】顺序表

本篇文章将介绍数据结构中的顺序表以及如何用C语言将其实现一般我们会将要存储的数据类型重定义为一个新的类型,之后就使用这个新类型进行数据存储,这样当我们想要修改存储的数据类型时,只需要修改一次例如,将 int 定义为,SLDataType,之后就用 SLDataType 来代替 int如果以后想存储 char 类型,只需将 int 修改为 char定义结构体int size;}SeqList;上文已经说明各个变量的作用,这里不再赘述顺序表是一种线性结构,要求物理存储结构连续。

2023-11-01 18:27:24 78 1

原创 【C语言】文件操作

文件就是磁盘中的文件,如果以文件功能来分类,文件可以分为程序文件和数据文件。

2023-10-18 23:50:14 174 1

原创 【C语言】自定义类型:结构体

定义我们可以在声明结构体的同时进行结构体变量定义,也可以先声明,等用的时候再定义结构体变量int x;int y;}p1;//p1为全局变量int main()//p2为局部变量return 0;初始化结构体的初始化要用 {} ,成员之间用逗号隔开int x;int y;int age;}s1 = { "张三", 18 };int main()struct Student s2 = { "李四", 19 };return 0;同时,结构体支持嵌套初始化int x;

2023-10-05 01:28:19 204

原创 【C语言】内存操作函数

内存操作函数,可以通过访问地址的形式来对内存进行修改。本篇文章简单介绍了 memcpy、memmove、memcmp,和 memset 的使用及其模拟实现它们的头文件<string.h>本篇文章用到的网站。

2023-10-01 15:18:08 95

原创 【C语言】 qsort 的使用

qsort是C语言中一个强大的库函数,通过它我们可以实现对整型数组、字符数组等的排序,如果使用得当,还可以排序结构体数据。在此我们学习一下qsort的用法。

2023-09-18 23:28:18 375 1

原创 【C语言】二分查找

如果想要查找一个有序数组中的某个数,二分查找是一个不错的选择。相较于顺序查找,二分查找每次查找都可以去掉一半的范围,在大型数组中,查找效率非常高。

2023-08-13 10:47:48 71 1

原创 【C语言】扫雷(递归展开一片)小游戏

相信大家都玩过扫雷游戏,今天我们就用C语言实现这个小游戏。如果没玩过,可以先去体验体验,掌握游戏规则也会对我们的思路有所帮助。

2023-08-04 12:57:28 93 1

原创 【C语言】三子棋(N子棋)

通过更改game.h中的行列,来自定义棋盘大小,这里演示10*10棋盘在此过程中我们可以体会到,N子棋代码涉及的语法并不复杂,用到的无非就是函数,二维数组及其传参等,难的是思维。本人现在呢也是初学者,若有任何问题,欢迎指出,有不足之处敬请谅解,希望我们能一起不断进步。

2023-07-27 00:55:07 106 1

原创 【C语言】求最大公约数(枚举与辗转相除)

先找出两个数中的较小数,再从“1~较小数”中寻找一个可以将两个数整除的数。

2023-07-21 23:12:01 155 1

原创 【C语言】求质数(常规法与平方根法)

质数的因数只有1和它本身除去2,偶数都不是质数设非质数m,在范围2~sqrt(m) 中必定存在一个数可以将m整除。

2023-07-21 21:48:52 952 1

空空如也

空空如也

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

TA关注的人

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