- 博客(47)
- 收藏
- 关注
原创 【Linux】环境变量
环境变量(Environment Variables)是操作系统在进程启动时传递的一组动态键值对(key=value)例如:PATH=/usr/bin:/bin (key是PATH,值:/usr/bin:/bin ),用于配置进程的运行环境。这些字符串形式的变量被 shell、应用程序和系统服务广泛使用,主要功能包括控制程序行为、指定路径以及标识用户身份等。PATH:指定 shell 查找可执行命令的目录路径HOME:标识当前用户的主目录位置USER:记录当前登录的用户名信息。
2026-01-14 22:22:51
546
23
原创 【linux】进程调度:优先级、时间片与O(1)算法
进程为什么要把优先级设置为80+NI呢,我们更改进程后,直接放在当前的queue不太合适,调度器的效率会降低,与其它进程的公平性会失衡,所以设置一个NI,将进程所在的queue状态变为expired时,在改进程的优先级,将其链入相应的队列。
2026-01-11 23:55:26
1018
21
原创 【QT】信号与槽基础:手动连接的原理与实践
在QT5之前,自定义槽函数需要声明在类的public slots/protected slots/private slots区域中,并且必须配合SLOT宏使用。而QT5版本之后,自定义槽函数与普通成员函数已完全等同。接下来我们来自己定义槽函数;可以通过图形化的方式也可以纯代码。
2026-01-10 22:49:42
1038
20
原创 【滑动窗口】水果成篮
随后暴力解法会从起点1(第二个3)和起点2(第三个3)重新开始遍历。但这两个起点的初始水果都是3,与起点0的核心组合(3和1)完全一致,因此其遍历结果必然比起点0更短,属于可跳过的无效计算。以起点0(第一个3)为例:遍历到位置4(水果2)时,篮子里已包含3、1、2三种水果,此时停止遍历,有效长度为4(对应子数组[3,3,3,1])。优化无效起点的处理(避免重复遍历第二个/第三个3) 从起点0遍历至right=4(水果2)时发现非法情况,最后合法位置为fruits[3]=1。时间复杂度为:O(N)
2026-01-06 11:20:54
656
2
原创 【QT】Qt对象树揭秘:为什么new了不用delete?从图形化到内存管理的完整指南
理解Qt的对象树机制,可以通过界面控件的层级结构来直观展示:界面层级解析(左侧图示)界面顶层是一个QWidget显示文本的QLabel可点击的包含列表项的其中又内嵌了3个QListItem,形成清晰的父子控件层级。对象树结构(右侧图示)QWidget作为顶层对象QLabel包含的3个QListItem核心内存管理机制当父对象销毁时(如关闭界面导致QWidget递归销毁所有子对象释放关联内存资源无需手动delete子对象(如创建的QLabel有效防止内存泄漏简化界面对象生命周期管理。
2026-01-05 15:49:10
1013
23
原创 【linux】深入Linux进程调度:运行、睡眠、僵尸与不可杀死的D状态
Linux 的进程状态设置与前文讨论有所不同,各操作系统在这方面各有特色,但都具备进程状态的基本共性。下面我们一起来看看Linux内核中是怎样规定进程状态的。
2026-01-03 23:21:07
1127
4
原创 【Linux】内核编织术:task_struct的动态网络
在上一篇文章中,我们讨论了fork()函数的返回值、写时复制机制以及进程创建过程,了解到内核通过task_struct(PCB)这个'档案袋'来管理进程的所有信息。但这仅仅相当于看到了档案袋的封面。今天,我们将打开这个档案袋,深入探究:内核如何组织进程信息,调度器如何管理这个'生命体',进程状态如何转换,以及它如何与系统进行交互。:内核如何通过精巧的链表设计来管理海量task_struct结构?(引出进程链表管理):内核如何基于优先级等调度参数,实现快速进程切换?(引出调度算法设计)
2025-12-28 22:56:39
889
17
原创 【linux】进程概念(2)Linux进程的生命密码:从fork到完全独立
fork()与写时复制机制的配合,以高效性、透明性与灵活性的精妙平衡,让Linux在保障进程安全隔离的同时实现高效的进程创建与管理,支撑起复杂的多任务环境。
2025-12-23 22:37:39
718
12
原创 【linux】进程概念(1)PCB、系统调用与 proc 目录全解析
平时我们经常会听到进程,但是如果说要具体描述它,我们却又难以组织语言。这个进程到底是个什么东西呢?要了解进程,首先我们要知道,一个进程是从什么时候开始诞生的。程序是静态的,没有被访问时被储存在磁盘中。我们要执行这个程序就要把它从磁盘中拿出来放到CPU中,当操作系统为我们要做的这件事(执行一个磁盘中的程序)分配内存时,一个进程便诞生了。在一个进程诞生时,为了方便管理,每一个进程都会有一个“名字”------进程pid。
2025-12-20 13:09:49
1265
17
原创 【linux】从 0 到 1 理解程序启动:冯诺依曼体系、操作系统与系统调用的协同密码
你是否曾好奇,当你点击一个程序的图标,到它在屏幕上显示出结果,这背后究竟发生了什么?今天,我们将从计算机的底层硬件开始,一步步揭开操作系统和进程的神秘面纱。
2025-12-13 22:34:55
1381
4
原创 【linux】基础开发工具(3)gcc/g++,动静态库
动态链接运行时需要链接动态库,速度稍慢,但是无需将代码加载到可执行文件中,所以生成的文件较小,有较高的灵活性,可使用模块化实现,库更新时替换库文件就行,无需重新编译。链接器根据符号的实际地址修改这些引用,填上正确的地址。:可执行文件中包含一个动态段(如.dynamic),其中列出了所依赖的动态库名称,以及一个符号表(如.dynsym),记录了需要从动态库中解析的符号。动态链接,链接器不会将代码复制到可执行文件中,而是记录要用到的动态库中的方法,在运行时调用动态库中的方法,所以称之为运行时链接。
2025-11-05 23:01:54
999
19
原创 【linux】基础开发工具(2)vim
vim是linux中的一款命令行编辑器,功能强大,几乎所有的linux发行版都会预装。类似于c++和c语言,vim是vi的升级版,兼容vi的所有命令,同时拥有自己的新特性。
2025-10-29 23:12:46
1313
29
原创 【linux】基础开发工具(1)
开发者会把具体的项目的码源传到linux社区中或者github上,我们可以直接下载源代码,然后编译,最后手动解决软件的依赖问题,软件就可以使用了。RPM(RPM Package Manager,原名 Red Hat Package Manager)是 Linux 系统上的一种软件打包格式,文件扩展名为.rpm。我们可以通过rpm包安装软件但是软件要运行光有一个软件是不行的,还需要解决相关的依赖问题 ,要把软件依赖的文件分别安装到需要的目录中,才能正常的运行软件。
2025-07-01 22:59:22
1301
32
原创 【linux】权限深入解析
权限=角色+属性。一切权限都是关于角色和权限类型的,核心角色一共分为三类——所有者(User):文件的创造者,所属组(Group):一组用户共享相同的权限,其他用户(Other):除上述两者的其他用户。权限类型,读(r),写(w),执行(x)。ls -l命令用于查看文件和目录的详细信息。权限位三位为一组,第一位都只能是r或-,第二位是w或-,第三位是x或-,分别意味着,拥有者,所属组,其他的权限。权限都是确定的,只能有或没有。
2025-06-29 23:06:02
2178
29
原创 【Linux】基础指令(2)
H : ⼩时(00..23)%M : 分钟(00..59)%S : 秒(00..61)%X : 相当于 %H:%M:%S%m : ⽉份 (01..12)%Y : 完整年份 (0000..9999)%F : 相当于 %Y-%m-%d。
2025-05-02 15:36:26
1901
30
原创 【c++】AVL树模拟实现
AVL树是最先被发明出来的自平衡二叉查找树,在1962由前苏联科学家G. M. Adelson-Velsky和E. M. Landis在论文中发表。AVL树中引入了平衡因子,每一个节点都有一个平衡因子(一般是右子树高度 - 左子树高度);AVL树要求左右子树高度相差不能超过1,即平衡因子只能是0,1或-1。AVL树的高度始终是log(n),n为节点数量。
2025-04-27 23:05:28
839
19
原创 map和set的使用
set的模板参数template <class T,//键值类型class Compare = std::less<T>,/仿函数用来控制顺序class set;1.T就是键值的类型。2.在默认情况下,set支持的是小于比较,可以自己写仿函数。3.set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。4.一般后面两个参数我们是用不到的。5.set的底层是红黑树,增删查的效率是O(logN)(键值不能修改)。
2025-04-21 21:16:51
1098
25
原创 【数据结构】二叉搜索树
当我们用有序数组储存数据时,查找某个数据可以用折半查找,时间复杂度为LogN;但是当我们要插入或删除数据时需要一步一步挪动数据,消耗非常大。为此引入了二叉搜索树这个数据结构。
2025-04-19 23:33:52
1257
20
原创 【双指针】移动零
观察输入输出:输出中一共分为两个区域,0区和非零区。但是在处理未完成之前,必然存在着一个零和非零数共存的区域,所以在处理的过程当中一共有三个区域,0区,非0区和未处理区。要将整段数据划分成三个区域,那么我们需要几个标志位呢。取两个标志位就可以将代码分成三部分。我们可以取标志位A和B,A之前的为非零区,AB之间是未处理区,B之后是零区。设A为dest,设B为cur。进入操作之前,初始状态A左边为非零区,右边为零区,所以初始化A为-1。
2025-03-16 23:20:07
362
3
原创 【c++】继承
我们看到的Artiodactyla称为基类,也叫父类。Pig和Hippopotamus称为派生类,也称子类。继承方式分为三种:public,private,protected。这和三个访问限定符一样,但是功能却不相同。在访问限定符中, private和protected几乎没有差别,都不能由类外直接访问。而在继承方式这里,private与protected就有所区别了。
2025-03-16 15:37:11
1273
23
原创 【c++】vector的使用
前面我们学习了c++管理字符串的string类,较c语言管理字符串方便了不少。但是在处理其他数据(非字符串)时显得力不从心。这时,c++为我们提供了一个强大的容器——vector。vector底层是一个动态开辟的数组,它为我们提供了许多的接口来管理数据。
2025-01-24 16:13:11
2020
30
原创 【c++】string类 (二) 模拟实现
string依然是一个线性的结构,所以说在实现的时候和以前实现的线性结构差不了多少,总体还是我们的老三样——_str,_size和_capacity。本次实现string的时候,我们把一些简单的小函数在.h中直接定义,所以我们要注意链接错误,.h文件中的函数,如果定义在类里面,默认是内敛的,不会放到符号表,不用担心链接错误,但是如果是在类外面定义的函数,.h文件在test.cpp和string.cpp中都包含了一份,就会有两个这个函数,导致链接错误。
2024-12-08 00:15:04
624
27
原创 【数据结构】二叉树(一)遍历
前面以及有了堆的基础,现在来学习二叉树。二叉树的学习和前面的数据结构很不一样,前面我们主要学习用数据结构储存数据,以及实际手搓数据结构的增删查改;而学习二叉树主要是为我们以后学搜索二叉树以及后面的AVL树等数据结构做准备,我们主要学习遍历二叉树,学一下二叉树的结构。
2024-10-15 22:55:13
1122
40
原创 【c++】string类 (一)
'\0''\0''\0'c风格类型的字符串我们都已经很熟悉,\0的存在让我们在处理在处理字符串的时候需要时刻小心,在手动拼接或复制字符串时经常会因为\0处理不妥而出错。c++为我们提供了一个全新的string来处理字符串的长度、内存分配和释放,因此开发者可以专注于字符串的内容,而不必担心细节。在一切开始之前,我们先介绍一个网站。是一个广受欢迎的C++编程语言资源网站,成立于2000年代初期。开始由一个c++爱好者建立,后来各路大佬汇聚,网站内容也非常成熟,可供我们学习和参考。
2024-10-06 23:28:54
1473
38
原创 【Linux】基础指令 1
LInux中各个指令是相互联系的,所以一开始学习Linux时,对指令很陌生是正常的,不用花费大量的时间去刻意的记忆,在我们一次次的使用当中,这些指令自然会烂熟于心。
2024-10-03 23:12:02
1359
22
原创 【c++】 模板初阶
写一个交换函数,在学习模板之前,为了匹配不同的参数类型,我们可以利用函数重载来实现。虽然这样似乎解决了问题,但是这样的设计写着太过麻烦,只要出现新类型就需要写新的函数,代码的复用率很低。有没有什么可以让我们一劳永逸呢?模板就可以实现这一功能。这种通过抽象和模板化来编写可重用和灵活的代码以此提升代码的可读性和维护性,同时避免代码重复的方式称为泛型编程。
2024-10-02 22:29:31
815
21
原创 【c++】类和对象(下)
const类型成员必须在定义的时候就初始化,定义了之后不能改变注意这是错误演示 ,const 类型成员要在初始化列表中初始化。//注意这是错误演示class Datepublic:,_month(5),_day(10)_n = 1;//const类型成员必须在定义的时候就初始化,定义了之后不能改变private:int _year;int _month;int _day;Date d1(i);d1.Print();
2024-09-05 20:30:07
841
34
原创 【c++】类和对象 (中) (类的默认成员函数)
在C++中,如果你定义了一个类但没有显式地提供特定的成员函数(比如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等),编译器会为这些函数生成默认的实现。这些默认生成的成员函数称为类的默认成员函数。那么既然编译器会默认生成,那么我们学习什么呢?第一:我们要能判断默认生成的函数能否则满足我们的需求第二:如果默认生成的函数不能满足我们的需求,那么我们该如何实现这些函数实际上是八个,后面的后续补充。接下来我们依次来学习这些函数。
2024-08-12 21:39:33
1318
38
原创 【c++】类和对象(上)
class为定义类的关键字,Date为类的名字,{}内的是类的内容简称为成员:类中的变量称为成员变量(属性),类中的函数称为成员函数(方法)。类末尾的分号不能省略。定义在类里面的成员函数默认为inline。C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐用class定义类。
2024-08-06 17:12:19
938
12
原创 【数据结构】 -- 堆 (堆排序)(TOP-K问题)
要学习堆,首先要先简单的了解一下二叉树,二叉树是一种常见的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的应用非常广泛,在后面我会详细介绍。满二叉树:除了叶子结点外,每个结点都有两个子结点一个深度为k的满二叉树有2的k次方减一个节点。完全二叉树:除了最底层可能不是满的外,其它每一层从左到右都是满的。满二叉树是完全二叉树的子集,满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。堆就是一种完全二叉树。
2024-06-09 22:30:22
2040
14
原创 【数据结构】 -- 队列
队列是一种线性表,队列遵循先进先出的特性。先放入队列的数据,一定先出队列。倘若数据以ABCD的顺序入队,出队的顺序一定也是ABCD。
2024-05-30 21:55:32
560
12
原创 【数据结构】-- 栈
引入:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈压栈入栈,。出栈:栈的删除操作叫做出栈。。注意:入栈顺序是DCBA,出栈顺序不一定是ABCD,可以边入边出所以,入栈顺序是DCBA ,出栈顺序有很多种。栈的实现:数组,单向链表,双向链表都能够实现栈:数组:单链表:用单链表实现栈有一个问题,单链表不能回头,如图这么设计,在压栈之后,不方便出栈。所以我们可以以开头作为栈顶,然后对链表头插来实现栈,出栈的时候使用头删。
2024-05-28 23:35:08
1376
9
原创 【数据结构】-- 相交链表-环形链表
如果链表的两条链的长度一样,链表两端对齐,解决这个问题将会变得非常简单,直接分别遍历两个链表,想等时的节点即为所求。我们想办法让链表对齐--分别从a和b遍历链表,分别求出以a开始和以b开始时的链表长度,求出a,b之差的绝对值k。然后再让较长一端先走k步,这样就对齐了。然后再同时遍历链表,两端相等时,这个节点即为所求。其实,这就是一个快慢指针的解法,快慢指针每次都只走一步,只不过快指针先走使链表对齐。
2024-05-13 23:29:38
1116
13
原创 【算法】-- 二分查找详注
二分查找,也称为折半查找;首先,二分查找是一种基于有序数组中查找特定元素的算法,所以它会因为数组的一些特性而受限。它的工作原理是不断将要查找的区间分成两部分,然后确定目标值可能存在的区间,直到找到目标值或者确定目标值不存在为止。这个算法的时间复杂度为O(log n),其中n是数组的大小。二分查找通常比线性查找(暴力查找)快,尤其是在大型数组中查找元素时。
2024-05-08 17:23:55
905
14
原创 【数据结构】-- 单链表的实现
仔细观察,凡是不需要遍历链表的操作,我们就不许要传二级指针做形参。例如删除指定位置之后的数据和在指定位置后插入数据就不需要传二级指针。在对某一个节点进行操作时,要考虑两个方面,一要对指定的节点进行操作,二要调整相邻节点的指针,使得链表的结构得以维护。t=N7T8。
2024-04-21 16:46:39
2184
20
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅