- 博客(72)
- 收藏
- 关注
原创 【Linux】进程(5):命令行参数和环境变量
目录一 命令行参数和环境变量1 命令行参数2 环境变量(1)概念+实际场景(2)引入Linux环境变量(3)获取,设置环境变量(4)理解环境变量,修改配置文件实验环境变量具有全局属性——本质:环境变量被子进程继承了!和环境变量相关的命令main函数有参数吗?有的 其中:char* argv是指针数组,有效元素是argc个我们通过下面这个程序,来演示一下命令行参数:同一个程序,根据选项的不同,呈现出不同的功能, 这种功能是通过命令行参数完成的通过上面的两个参数我们发现:bash是以空格为分隔符,把每个
2026-02-08 21:59:00
729
5
原创 【Linux】进程(4):进程优先级&&调度队列
因为操作系统不建议修改优先级,可能对程序的平衡性产生影响,所以我们在修改nice值的时候可能会受到系统阻拦,但是超级用户可以修改,所以我们用whoami查看是否为超级用户,可以使用sudo提权。因为在Linux中,真正标识“我”这个人,是通过UID这个数字,但是人看数字不舒服,所以Linux系统会在相关配置文件把用户名和UID的关系建立起起来,打印时默认打印用户名。寄存器是一个硬件,寄存器内部的数据是=称为当前进程的硬件上下文:CPU内部进程相关的所有寄存器的内容(内部的数据)
2026-02-07 21:26:31
785
3
原创 【Linux】进程(3):进程状态
这就保护了正在执行关键I/O的进程,防止被OS误删,避免了类似银行账单丢失的事故。s状态属于操作系统中的阻塞状态(例如前面讲到的最典型的阻塞状态:代码中里有一行scanf输入代码, 不输入时就会卡住),s状态时,可以用crtl+c或者kill-9杀掉,所以把s状态叫做。进程的退出状态必须被维持下去,因为它要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。键盘属于硬件,操作系统管理硬件也要先描述,再组织,硬件再底层也有对应描述的结构体(包含硬件的相关属性,进程PCB的队列)
2026-02-05 22:38:22
869
7
原创 【Linux】进程(2):进程概念与操作理解
进程 = 内核数据结构(task_struct) + 自己的程序代码和数据内核数据结构(struct task_struct):这是进程的 “学籍信息”,包含了进程的 PID、优先级、内存地址、状态等元数据,是操作系统管理进程的核心。程序的代码和数据:这是进程的 “本人”,即被加载到内存中的可执行程序内容。传统教材常说:“运行起来的程序就是进程” 或 “加载到内存的程序叫做进程”。但是这种说法只强调了 “代码和数据加载到内存”,忽略了内核为管理进程而维护的数据结构,显得过于片面,不易理解。
2026-01-31 23:19:36
926
8
原创 【Linux】进程(1):冯诺依曼体系结构+操作系统
如果问题问的是计算机的基本结构,则通常指的是冯・诺依曼体系结构。后面我们用 “银行小窗口” 的故事:用户(程序)不能直接进入银行后台(内核),只能通过柜台窗口(系统调用)办理存款、取款(访问内核资源)等业务,这既保证了安全,也规范了交互流程。为了完成最终的打印,它会封装并触发对应的系统调用,由操作系统内核负责与硬件交互,完成实际的输出操作。计算机的模块化,是指将整个计算机系统拆解为功能独立、接口标准的硬件或软件模块,这些模块可以像积木一样单独设计、制造、升级和替换,最终组合成完整的系统。
2026-01-30 23:12:05
976
1
原创 【Linux】基础开发工具(6):版本控制器git&&调试器gdb/cgdb
到最后,老师也说李四你现在写的还没之前写得好,算了,你把第三版交上来吧,我就算你过,这个时候张三就能交出来第三版的实验报告。如果我们在做项目的时候,每一次都把之前的记录下来,可是实际的项目都很大啊,每一次的都保留下来,那修改了成千上万次有那么多的空间保存吗?:在本地就可以完成版本管理(例如版本的提交,日志的提交,版本的回退),只不过做完需要同步到远端,在网络层面上是中心化的,但是在版本控制上各自管理自己的。对于图片,视频等二进制文件,虽然也能控制,但无法跟踪文件的变化,只能看到内存大小的变化。
2026-01-26 23:23:42
850
2
原创 【Linux】基础开发工具(5):Linux的第一个程序:进度条
printf 确实支持彩色输出,核心是通过 ANSI 转义序列(控制字符组合)告诉终端切换文字颜色、背景色,甚至设置高亮、下划线等样式 —— 这能让我们的进度条更醒目(比如进度条用绿色、百分比用黄色、提示信息用蓝色)但是我们其实可以发现这个程序还是有很多的问题的,比如process的进度不一定和下载进度相匹配,进度计算没有边界校验等等问题,所以这个思路其实不够完善,我们引入第二个思路。但是现在这个程序有两个问题:(1)休眠间隔时间太长,(2)进度条应该是在一行中输出(下一行覆盖前一行),而不能在多行输出。
2026-01-22 17:46:36
897
3
原创 【Linux】基础开发工具(4):自动化构建--make/makefile
・一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。编译器将多个 C 源文件(如add.c、sub.c)转换为目标文件(.o文件,如add.o、sub.o),之后链接器将目标文件与库文件结合,生成可执行程序。makefile 带来的好处就是 ——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
2026-01-15 15:30:59
1195
3
原创 【C++】异常:概念及使用
但是一个声明了noexcept的函数抛出了异常,程序会调用 terminate 终止程序。程序的执行从throw位置跳到与之匹配的catch 模块,catch可能是同⼀函数中的⼀个局部的catch,也可能是调用链中另⼀个函数中的catch,控 制权从throw位置转移到了catch位置。• 如果到main函数,异常仍旧没有被匹配就会终止程序,不是发⽣严重错误的情况下,我们是不期望 程序终止的,所以⼀般main函数中最后都会使永catch(...),它可以捕获任意类型的异常,但是是 不知道异常错误是什么。
2025-11-30 16:36:53
956
13
原创 【Linux】基础开发工具(3):编译器
假如说你是张三,你考上了当地的一中,但是这个一中管理非常的严格,不能带手机,于是你问学长学校附近哪里有上网的地方,学长给你说学校的东门出去向左100米,向右100米,有一家电竞馆,于是你决定在学校里完成任务之后,出去上网,但是随着去电竞馆的人越来越多,电竞馆就被举报了,110就来关闭了电竞馆。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大(大不少,前面展示过了),但在运行时也就不再需要库文件了。当有很多的源文件时,先把源文件编译成.o文件,然后再把.o链接。
2025-11-29 22:02:29
1249
6
原创 【C++】C++11(3):类&&lambda
如果你没有自己实现移动赋值重载函数,且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意⼀个,那么编译器会自动生成⼀个默认移动赋值。默认生成的移动赋值函数,对于内置类型成员会执行逐成员按字节拷贝,定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷用赋值。(默认移动赋值跟上⾯移动构造完全类似)
2025-11-28 21:46:38
999
5
原创 【C++】C++11(2):右值引用补充&&可变参数模板
但是结合我们在5.2章节的讲解,变量表达式都是左值属性,也就意味着一个右值被右值引用绑定后,右值引用变量表达式的属性是左值,也就是说Function函数中t的属性是左值,那么我们把t传递给下一层函数Fun,那么匹配的都是左值引用版本的Fun函数。右值引用的右值引用折叠成右值引用(`T&& && → T&&`),所有其他组合均折叠成左值引用(`T& & → T&`、`T& && → T&`、`T&& & → T&`)。`,这样写会直接报错。但通过模板或 typedef 中的类型操作,可以构成引用的引用。
2025-11-27 21:02:28
887
4
原创 【C++】C++11(1):右值引用和移动语义
需注意:在VS2019的release模式,以及VS2022的debug和release模式下,以下代码会进一步优化——直接构造要返回的临时对象,`str`本质是该临时对象的引用,底层通过指针实现。从运行结果的角度,可观察到`str`的析构在赋值之后,这说明`str`是临时对象的别名。• C++11以后,分别重载左值引用、const左值引用、右值引用作为形参的f函数,那么实参是左值 会匹配f(左值引用),实参是const左值会匹配f(const左值引用),实参是右值会匹配f(右值引用)。
2025-11-25 20:38:09
902
8
原创 【C++】unordered_map和unordered_set的使用
• unordered_set的声明如下,Key就是unordered_set底层关键字的类型• unordered_set默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数• unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。•。
2025-11-23 22:41:41
858
9
原创 【C++】哈希表实现
哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进 ⾏快速查找。
2025-11-23 22:40:51
1684
20
原创 【Linux】基础开发工具(2):vim补充说明&&gcc/g++编译器
vim 是 Linux 中强大的文本编辑器,需通过配置(如.vimrc文件)才能充分发挥其功能。
2025-11-22 22:18:07
1417
8
原创 【Linux】基础开发工具(1):软件包管理器&&vim编辑器
• 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。• 但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。• 软件包和软件包管理器,就好比"App"和"应用商店"这样的关系。• yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器。
2025-11-20 20:05:43
1342
10
原创 【C++】封装红黑树实现mymap和myset
尤其是set,两个模板参数是一样的,这是很多同学这时的一个疑问。• 如果当前结点是父亲的右,根据中序左子树->根结点->右子树,当前当前结点所在的子树访问完了,当前结点所在父亲的子树也访问完了,那么下一个访问的需要继续往根的祖先中去找,直到找到孩子是父亲左的那个祖先就是中序要访问的下一个结点。如下图:当it指向50时,++it时,50是40的右,40是30的右,30是18的右,18到根没有父亲,没有找到孩子是父亲左的那个祖先,这时父亲为空了,那我们就把it中的结点指针置为nullptr,我们。
2025-11-19 21:09:16
1157
6
原创 【C++】红黑树:使用及实现
将c的父亲节点和兄弟节点都变成黑色,爷爷节点(g)变成红色,我们发现上图中红色圈的子树实现了暂时的平衡,但是p节点上面的节点颜色又相悖,所以我们需要继续调整变色,将现在的g姐弟啊设为c节点,它的父节点为p,父节点的兄弟节点为u,父节点的父节点为g。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增结点,u存在且为黑,则c一定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。当我们在节点28的左子树插入时,只能插入红色,这个时候就需要变色。
2025-11-16 22:41:51
1432
17
原创 【C++】AVL树:详细使用及旋转
• 旋转核心步骤,因为10 < b子树的值 < 15,将b变成10的右子树,10变成15的左子树,15变成这棵树新的根,符合搜索树的规则,控制了平衡,同时这棵树的高度恢复到了插入之前的h+2,符合旋转原则。0不是更好的平衡吗?• 场景1:h >= 1时,新增结点插入在e子树,e子树高度从h-1变为h并不断更新12->15->10平衡因子,引发旋转,其中12的平衡因子为-1,旋转后10和12平衡因子为0,15平衡因子为1。,符合搜索树的规则,控制了平衡,同时这棵的高度恢复到了插入之前的h+2,符合旋转原则。
2025-11-15 22:43:52
1563
16
原创 【C++】map和set的使用
set 的声明如下,其中T代表 set 底层存储的关键字类型。set 默认要求类型T支持小于()比较操作。若T不支持该操作,或需要自定义比较规则,可自行实现仿函数,并将其作为第二个模板参数传入。set 底层存储数据的内存,默认通过 STL 提供的空间配置器申请。若有特殊需求,也可自行实现内存池,将其作为第三个模板参数传入。一般情况下,无需手动指定后两个模板参数,使用 set 的默认配置即可满足需求。set 底层基于红黑树实现,其增、删、查操作的时间复杂度均为O(logN)。
2025-11-14 23:00:23
846
15
原创 【C++】二叉搜索树
基于key/value的搜索场景,实现的二叉搜索树支持修改操作,但仅能修改value,不能修改key。修改key会破坏二叉搜索树的性质。- 若单词不存在,说明是首次出现,在树中新增结点,存储key(该单词)和value(次数1)。2删除根节点:如上图是一种特殊情况(1),当使用替换法删除的时候,发现根节点的右子树的左孩子根本不存在,如果不额外列出这种情况,就会报错。如果是最优的情况,那么搜索二叉树的时间复杂度为log(N),但是如果像上述右图一样,那么时间复杂度是O(N),但是时间复杂度一般考虑最差情况。
2025-11-13 22:12:05
974
10
原创 【C++】多态(2):纯虚函数&&多态底层原理
多态分为:静态多态和动态多态。静态多态时编译时确定的多态,是一个同名函数的调用表现出多种形态(例如同一个swap,传不同的参数就调用不同的函数)动态多态是用一个基类的指针,指向不同的对象(基类对象或派生类对象),指向谁就调用谁的虚函数(前提是需要完成虚函数重写),底层是依靠对象让它存在虚函数表中(基类里存的是基类的,派生类里存的是派生类重写的虚函数),运行时指向谁,就到谁的虚函数表里找到对应的虚函数进行调用。
2025-11-12 20:45:48
902
12
原创 【C++】多态(1):多态定义&&实现及虚函数的重写
多态是指在继承关系下,不同的类对象调用同一函数时,产生不同行为的现象。例如,Student 类继承自 Person 类,Person 对象调用 “买票” 函数执行全价逻辑,而 Student 对象调用同名的 “买票” 函数则执行优惠逻辑。
2025-11-09 21:57:05
1927
11
原创 【python】基础案例分析
我们约定每个属性的范围为 [1, 10], 并且总和不能超过 20. 如果玩家输入的初始属性不合理, 就提示输入有误, 重新输入.更多的逻辑, 此处就不再实现了. 大家可以按照类似的方式, 设计更多的事件, 完成 青年, 壮年, 老年 的相关 逻辑.老年阶段体质, 颜值, 智力都会显著退化, 并且随着年龄的上升, 疾病/死亡的风险逐渐升高.针对每一年, 先掷一次 [1, 3] 的色子, 根据不同的随机数值, 来触发不同的事件.再扔一次色子, 生成 [1, 3] 的随机数, 用来表示每一种细分情况.
2025-11-08 22:31:19
980
4
原创 【Linux】权限(2):文件权限的深入理解&&粘滞位
• 可执行权限:如果目录没有可执行权限,则无法cd到目录中.• 可读权限:如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容.• 可写权限:如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件.1)目录的可执行权限是表示你可否在目录下执行命令;(2)如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目,即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件);
2025-11-07 21:46:19
1318
10
原创 【C++】继承(2):继承与友元,静态成员,多继承&&黑/白盒复用
通过继承实现的复用,派生类可以直接访问基类的内部成员(如 protected 成员),相当于 “打开盒子” 看到并使用内部实现。
2025-11-04 22:08:50
1171
20
原创 【C++】继承(1):深入理解和使用
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复⽤。继承的本质是类层次的复用下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以既叫基类/派⽣类,也叫⽗类/⼦类)
2025-11-02 23:02:19
1126
15
原创 【Linux】基础指令(4):基础指令&&热键&&shell运行原理
查看一个文件的更详细内容打包/解包,不打开它,直接看内容2 常用选项• -c :建立⼀个压缩文件的参数指令(create的意思);• -x :解开⼀个压缩文件的参数指令!• -t :查看tarfile里面的文件!• -z :是否同时具有gzip的属性?亦即是否需要用gzip压缩?• -j :是否同时具有bzip2的属性?亦即是否需要用bzip2压缩?• -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!• -f :使用档名,请留意,在f之后要立即接档名喔!
2025-11-02 11:13:00
1173
19
原创 【Linux】基础指令(3):理解linux常见指令和打包压缩
类似于Linux的记事本按行向下翻查(Enter回车向下翻)——不会刷屏。支持向上,向下翻及搜索• less⼯具也是对⽂件或其它输出进⾏分⻚显⽰的⼯具,应该说是linux正统查看⽂件内容的⼯具,功能极其强⼤• less的⽤法⽐起more更加的有弹性,在more的时候,我们并没有办法向前⾯翻,只能往后⾯看• 但若使⽤了less时,就可以使⽤ [pageup] [pagedown] 等按键的功能来往前往后翻看⽂件,更容易⽤来查看⼀个⽂件的内容。
2025-10-31 20:11:57
960
23
原创 【Linux】基础指令(2):理解Linux的指令和核心概念
man命令:查看指定命令的使用手册,在线查看手册的工具比如:man ls, man pwd , man rm等等man man就会查出man的使用手册:man的手册分为九章,我们基本只使用前三个1是普通的命令2是系统调⽤,如open,write之类的(通过这个,⾄少可以很⽅便的查到调⽤这个函数,需要加什么头⽂件)3是库函数(C语言),如printf,fread4是特殊⽂件,也就是/dev下的各种设备⽂件注意:回车键时往下翻,退出是按q。
2025-10-29 18:13:05
941
14
原创 【C++】模板进阶:非类型模板参数&&特化&&分离编译
特化---->针对某些类型进行特殊化处理通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些 错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板比如说比较出两个日期类的指针// 1. 通用函数模板:比较两个同类型对象的大小// 通用逻辑:直接使用<运算符比较// 2. 模板特化:针对Date*类型(日期指针)的特殊处理// 当T为Date*时,调用此特化版本而非通用模板template<> // 特化标志。
2025-10-27 12:15:18
877
23
原创 【C++】stack和queue:使用&&OJ题&&模拟实现
stack的文档介绍队列的头文件下有两个队列,一个是普通队列,一个是优先级队列优先级队列的底层是堆,优先级队列我们到后面再讲,现在先来看普通队列queue的文档介绍1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元 素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供 一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。
2025-10-26 10:46:50
1255
26
原创 【C++】stack和queue:优先级队列的使用及底层原理
priority-queue的文档介绍翻译:1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素 中最大的。2. 此上下文类似于堆,在堆中可以随 时插入元素,并且只能检索最大堆元素(优先队列中位于顶 部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的 顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2025-10-24 23:32:06
782
10
原创 【C++】list的使用及底层逻辑&&实现
在 C++ 中,std::list是标准模板库(STL)提供的双向链表容器,其底层实现基于双向链表数据结构,每个元素(节点)包含数据域和两个指针域(分别指向前后节点)。可以将list理解为:带头双向循环链表kw=listclass list// 节点类型定义(链表的基本存储单元)// 假设list_node是已定义的节点结构体(含_data, _prev, _next)public:// 迭代器类型定义(通过模板参数控制读写权限)// 可读写迭代器(解引用返回T&)
2025-10-19 10:03:39
1407
15
原创 【C++】:深入理解vector(2):vector深度剖析及模拟实现
注意:后面写的函数实现等内容都是再类中的public中实现的,后面不再赘述。
2025-10-18 19:59:18
1218
13
原创 【C++】深入理解vector(1):vector的使用和OJ题
vector这个单词的意思是向量,但是在STL中的使用可以理解为顺序表string是字符串,vector则是一个改变数据的顺序容器2 vector的介绍vector的文本介绍这段话的意思如下:代表大小可以改变的数组。和数组一样,向量的元素存储在连续的内存位置,这意味着可以通过指向元素的常规指针进行偏移来访问其元素,并且访问效率与数组相同。但与数组不同的是,向量的大小可以动态改变,其存储空间由容器自动管理。在内部,向量使用动态分配的数组来存储元素。
2025-10-17 21:20:57
913
11
原创 【C++】深入理解string类(5)
如果在strcpy拷贝的时候,遇到\0,就会直接停止拷贝(例如:hello world\0yyy\0),如果是在字符串的中间有\0,那么就会造成拷贝的不完全,所以不能使用strcpy,而是用memcpy。开辟一个和s3一样大的空间,s1指向该空间,释放s1原本的旧空间,将s3的内容拷贝给s1。传统写法和现代写法的算法效率是一样的,只是现代写法的代码较短,代码写法不同,充分利用了复用,本质上区别不大。)中的一个字符串处理函数,用于在一个字符串(主串)中查找另一个字符串(子串)的首次出现位置。
2025-10-16 17:15:46
1257
23
原创 【数据结构】强化训练:从基础到入门到进阶(2)
我们用 top 来标记栈顶位置,用 i 来标记现在需要放置的元素位置,那么我们找到原数组中对应放置在最后位置的元素位置,然后在数组最后从该位置元素往前来进行模拟放置即可。在环形链表中,慢指针每次走一步,快指针每次走2,3,4,5........步,快慢指针在环形链表中一定会相遇。创建两个链表(小链表,大链表),遍历原链表,小的尾插到小链表中,大的尾插到大链表中,大链表和小链表首尾相连。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。类型的指针(即整数的地址),因此传递。
2025-10-12 22:22:55
1002
10
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅