自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux --环境变量,虚拟地址空间

平时我们在写函数的时候都会有参数列表,main函数也是一个函数,那么它也有自己对应的参数可以传递,只是在我们一般写代码中不需要传递,只有在命令行中才可能需要传递使用。main函数一般有三个参数可以传递那么设置main函数参数的意义是什么,同一个程序中可以根据命令行参数,根据选项的不同表现出不同的功能,一些命令指令就是最好的体现,比如 ls -a mkdir -p这些后面都会带参数,实现不同的功能。argc是代码数组中argv char类型指针数组的参数个数,而env是环境变量,一会我们会讲解。

2025-06-05 20:35:33 285

原创 Linux --进程优先级

摘要:进程优先级是Linux调度资源的关键机制,通过PRI和NI值控制进程执行顺序。PRI越小优先级越高,NI(-20至19)用于修正PRI值。Linux采用O(1)调度算法,使用active/expired队列和bitmap快速定位待执行进程,当活跃队列耗尽时交换指针。进程切换通过保存/恢复PCB中的上下文数据实现,而task_struct的链表设计允许进程存在于多队列中。通过offsetof宏可计算结构体成员偏移量,实现从链表节点访问完整进程数据。该机制确保调度效率不受进程数量影响。

2025-06-03 15:45:39 498

原创 Linux --进程状态

本文介绍了进程状态的基本概念和Linux系统中的具体实现。宏观上,进程主要分为运行、就绪、阻塞等状态,其中阻塞状态可分为普通阻塞和挂起状态。Linux系统将进程状态细分为R(运行/就绪)、S(可中断睡眠)、D(不可中断睡眠)、T(停止)、X(死亡)和Z(僵尸)等状态。文章还展示了如何通过ps命令查看进程状态,并用代码示例演示了R/S/Z状态的转换过程,特别是通过父子进程模型说明僵尸进程的产生和孤儿进程的被收养机制。这些状态转换机制是操作系统实现高效进程管理的关键。

2025-06-01 20:44:32 830

原创 Linux --OS和PCB

本文介绍了计算机系统的核心概念,首先阐述了冯诺依曼体系结构的基本原理,包括输入单元、中央处理器和输出单元的运作机制,重点说明内存作为CPU与外设间缓存的重要性。接着讲解了操作系统的定位与功能,包括其对上为程序提供运行环境、对下管理硬件资源的核心作用,并介绍了系统调用和库函数的概念。在进程管理方面,详细说明了进程控制块(PCB)的数据结构task_struct及其分类属性,通过实际代码演示了进程创建、标识符获取等系统调用的使用,验证了父子进程间的数据独立性。

2025-05-31 10:50:02 785

原创 数据结构 --链表

那么还有什么方法可以自己去推导返回值呢?今天把链表重新用c++写了一遍,首先单纯的写一个链表并不困难,无非是定义一个结构体ListNode,设置变量data和下一个指针的地址next,然后完成增删查改的操作,需要注意的是在删除节点的时候记得先保存当前需要删除的节点的下一个节点,然后再删除当前节点并链接节点,否则会导致找不到删除的节点的下一个节点,无法链接。FindResult就好了,这里其实也是类模板的实现,只不过这里是用类型实例化出不同的类,然后实例不同的FindResult,没有具体的类其他的操作。

2025-05-30 17:49:12 901

原创 Linux -- gdb/cgdb的认识和使用

这里在第五行打了一个断点 b 5 ,然后运行代码 r,代码在第五行这个位置停下了,l/list可以显示10行的代码,剩下的一些使用大家可以自己去尝试。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者。给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if。中的变量:如果在函数内部设置观察点,且该函数有同名局部变量,则观察的是。上⾯的基本调试还是⿇烦,虽然是⿊屏,但是还是想看到代码调试。新建断点时添加条件 b n(断点序号) if i==30。

2025-05-28 23:25:58 568

原创 数据结构--顺序表

本文介绍了使用C++重构通讯录系统的过程。将项目分为三个部分:SqList类实现顺序表基本功能,PersonInfo类存储联系人数据,Contact类封装整个项目。重点讨论了以下几个技术点:1. 通过重载运算符(<<、>>、==)简化输入输出和比较操作;2. 指针成员变量的构造初始化问题;3. 联系人查重功能的实现;4. 流插入运算符作为非成员函数重载的原因。项目实现了通讯录的增删查改功能,采用分层设计保持代码可扩展性,避免了因上层修改影响底层结构。

2025-05-28 21:47:05 1086

原创 Linux --进度条小程序更新

process.c的实现与上一篇文章的方法类似,只是更改了一个下载样式 ' . ',lable使用一个数组来储存,其中点的个数由静态变量n控制,在第一个循环中当i等于NUM大小时会将最后一个字符设置为'\0',否则在打印的时候会出现“烫烫烫”等字符,这是因为字符串以'\0'作为结束标志。main.c 的代码,其中downlod这个函数使用的是函数指针,如果有多个进度条函数可以传入进行多样化的格式下载显示,还需要传入一个下载总量,每次"下载以后刷新一次进度条",具体实现如下。

2025-05-27 17:57:02 531

原创 Linux--gcc/g++ 和make

Linux第⼀个系统程序−进度条编译器gcc/g++背景知识1. 预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等)2. 编译(⽣成汇编)3. 汇编(⽣成机器可识别代码)4. 连接(⽣成可执⾏⽂件或库⽂件)gcc编译选项格式gcc [选项要编译的⽂件选项] [⽬标⽂件预处理(进⾏宏替换)预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。预处理指令是以#号开头的代码⾏。实例:选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停⽌编译过程。

2025-05-26 23:51:55 963

原创 Linux--vim

vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。在使⽤末⾏模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进⼊末⾏模式。「/关键字」: 先按「/」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以。「#」:「#」号表⽰⼀个数字,在冒号后输⼊⼀个数字,再按回⻋键就会跳到该⾏了,如输⼊数字。「q」:按「q」就是退出,如果⽆法离开vim,可以在「q」后跟⼀个「!按多次“u”可以执⾏。

2025-05-25 22:31:12 1024

原创 Linux--权限

于是, 问题来了,换句话来讲, 就是只要⽤⼾具有⽬录的写权限, ⽤⼾就可以删除⽬录中的⽂件, ⽽不论这个⽤⼾是否有这个⽂件的写权限. 这好像不太科学啊, 我张三创建的⼀个⽂件, 凭什么被你李四可以删掉?如果⽬录没有 -x 权限,则⽆法对⽬录执⾏任何命令,甚⾄⽆法 cd 进⼊⽬, 即使⽬录仍然有 -r 读。⽽如果⽬录具有 -x 权限,但没有 -r 权限,则⽤⼾可以执⾏命令,可以 cd 进⼊⽬录。可写权限: 如果⽬录没有可写权限, 则⽆法在⽬录中创建⽂件, 也⽆法在⽬录中删除⽂件.原因就是创建⽂件或⽬录的。

2025-05-24 20:47:35 582

原创 linux初识--基础指令

head 与 tail 就像它的名字⼀样的浅显易懂,它是⽤来显⽰开头或结尾某个数量的⽂字区块,head ⽤来显⽰档案的开头⾄标准输出中,⽽ tail 想当然尔就是看档案的结尾。当第⼆个参数类型是⽂件时,mv命令完成⽂件重命名,此时,源⽂件只能有⼀个(也可以是源⽬录名),它将所给的源⽂件或⽬录重命名为给定的⽬标⽂件名。当第⼆个参数是已存在的⽬录名称时,源⽂件或⽬录参数可以有多个,mv命令将各参数指定的源⽂件均移⾄⽬标⽬录中。“=”表⽰套接字(sockets)。由于find具有强⼤的功能,所以它的选。

2025-05-23 19:58:22 927

原创 c++类型转换

隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。隐式类型转化有些情况下可能会出问题:比如数据精度丢失。显式类型转换将所有情况混合在一起,代码不够清晰。显式类型转化:需要用户自己处理。提出了自己的类型转化风格,注意。

2025-05-19 17:57:38 377

原创 c++智能指针

此时p1和p2已经交给了samrtPtr的对象来管理,当该函数栈帧结束时会自动调用析构函数释放这两个指针,防止内存泄漏。存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现。工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。,接着控制对资源的访问使之在对象的生命周期内始终保持有效,

2025-05-19 16:42:50 984

原创 c++异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了这里构建一个服务器开发中会使用到的异常继承体系。

2025-05-17 19:47:49 875

原创 哈希表的实现

当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函 数⽀持把key转换成⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。这⾥存在的⼀个问题就是,两个不同的key可能会映射到同⼀个位置去,这种问题我们叫做哈希冲突,或者哈希碰撞。

2025-04-24 19:14:46 575

原创 STL--unordered_map和unordered_set的使⽤

1.2.1 查看⽂档我们会发现unordered_set的⽀持增删查且跟set的使⽤⼀模⼀样,unordered_set和set的第⼀个差异是对key的要求不同,set要求Key⽀持⼩于⽐较,⽽ unordered_set要求Key⽀持转成整形且⽀持等于⽐较,要理解unordered_set的这个两点要求得 后续我们结合哈希表底层实现才能真正理解,也就是说这本质是哈希表的要求。unordered_set的声明如下,Key就是unordered_set底层的关键字的类型.

2025-04-23 16:41:09 902

原创 stl--map和set的封装

其次因为RBTree实现了泛型不知道T参数导致是K,还是pair<K, V>,那么insert内部进⾏插⼊逻辑⽐较时,就没办法进⾏⽐较,因为pair的默认⽀持的是key和value⼀起参与⽐较,我们需要时的任何时候只⽐较key,所以我们在map和set层分别实现⼀个MapKeyOfT和SetKeyOfT的仿函数传给RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数取出T类型对象中的key,再进⾏⽐较,具体细节参考如下代码实现。之前使⽤部分,我们分析了,map和set的迭代器⾛。

2025-04-23 00:46:29 895

原创 C++红黑树实现

c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则 c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。再任意⼀条路径⿊⾊点。c变成课这颗树新的根,这样⼦树⿊⾊结点的数量不变,没有连续的红⾊结点了,且不需要往上更新,因为c的⽗亲是⿊⾊还是红⾊或者空都不违反规则。c变成课这颗树新的根,这样⼦树⿊⾊结点的数量不变,没有连续的红⾊结点了,且不需要往上更新,因为c的⽗亲是⿊⾊还是红⾊或者空都不违反规则。

2025-04-19 12:02:03 777

原创 C++ AVL树

• 更新后parent的平衡因⼦等于2或-2,更新前更新中parent的平衡因⼦变化为1->2或者-1->-2,说 明更新前parent⼦树⼀边⾼⼀边低,新增的插⼊结点在⾼的那边,parent所在的⼦树⾼的那边更⾼ 了,破坏了平衡,parent所在的⼦树不符合平衡要求,需要旋转处理,旋转的⽬标有两个:1、把 parent⼦树旋转平衡。• 插⼊结点,会增加⾼度,所以新增结点在parent的右⼦树,parent的平衡因⼦++,新增结点在 parent的左⼦树,parent平衡因⼦--2.2 AVL树的插⼊。

2025-04-18 15:37:01 745

原创 C++ set,map

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的 内存是从空间配置器申请的。关联式容器也是用来储存数据结构的,与序列式容器不同的是,关联式容器逻辑结构是非线性结构,两个位置有紧密的关联关系,交换一下他的数据结构就被破坏了。• set底层是⽤红⿊树实现,增删查效率是 O(logN)的,迭代器遍历是⾛的搜索树的中序,所以是有序。2.1set的构造和迭代器。

2025-03-28 23:39:01 335

原创 C++二叉搜索树

2. ⼆叉搜索树的性能分析最优情况下,⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为: log2 N 最差情况下,⼆叉搜索树退化为单⽀树(或者类似单⽀),其⾼度为: N 所以综合⽽⾔⼆叉搜索树增删查改时间复杂度为: O(N) 那么这样的效率显然是⽆法满⾜我们需求的,⼆叉搜索树的变形平衡⼆叉搜索树AVL树和红⿊树,才能适⽤于我们在内存中存储和搜索数据。key/value的搜索场景实现的⼆叉树搜索树⽀持修改,但是不⽀持修改key,修改key破坏搜索树性质了,可以修改value。4. ⼆叉搜索树的查找。

2025-03-25 10:47:30 942

原创 C++多态

• 析构函数的重写 基类的析构函数为虚函数,此时派⽣类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析 构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析 构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了 vialtual修饰,派⽣类的析构函数就构成重写。第⼆派⽣类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派⽣类之间才能有不同的函数,多态的不同形态效果才能达到。3.多态是如何实现的。

2025-03-22 19:21:50 502

原创 C++继承

7. 多继承及其菱形继承问题 7.1 继承模型 单继承:⼀个派⽣类只有⼀个直接基类时称这个继承关系为单继承 多继承:⼀个派⽣类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型 是,先继承的基类在前⾯,后⾯继承的基类在后⾯,派⽣类成员在放到最后⾯。4.2实现⼀个不能被继承的类 ⽅法1:基类的构造函数私有,派⽣类的构成必须调⽤基类的构造函数,但是基类的构成函数私有化以 后,派⽣类看不⻅就不能调⽤了,那么派⽣类就⽆法实例化出对象。(因为翻译的原因,所以 既叫基类/派⽣类,也叫⽗类/⼦类)

2025-03-19 21:42:32 727

原创 c++--模拟实现优先队列

向下调整这里使用的是假设孩子法来确定要交换孩子的下标,交换以后再将父亲和孩子下标更新,进行从上到下的调整,如果比较失效就跳出循环,建堆完成。Pop的实现先将头部数据和尾部数据进行交换,然后再尾删,再进行向下调整,而不是直接进行头删,这样会导致堆的结构被破坏。这里的迭代器构造在插入后就完成建堆,使用的是向下调整,向下调整的空间复杂度会比向上调整的要简单,减少消耗。这个类中会实现堆的push,pop,top,empty,size等接口。这里实现了push的操作,需要先将数据进行尾插,然后从尾进行向上调整。

2024-12-09 23:34:26 487

原创 c++--模拟实现队列

该底层容器应至少支持以下操 作: empty:检测队列是否为空 size:返回队列中有效元素的个数 front:返回队头元素的引用 back:返回队尾元素的引用 push_back:在队列尾部入队列 pop_front:在队列头部出队列。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的 成员函数来访问其元素。1. 与栈一样,队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。

2024-12-09 12:00:18 337

原创 c++--以容器适配器模拟栈实现

可以看出与一般模拟实现不同的是,并没有手搓各种操作,而是调用增加了一个类模板来调用这个类中的已经写好的成员函数接口来实现栈的后进先出,所以表明栈只是一种模式,其中可以使用其他各种类来实现栈的后进先出模式。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

2024-12-09 11:27:20 176

原创 c++--堆的模拟实现

【代码】c++--堆的模拟实现。

2024-12-08 21:11:34 249

原创 C++-list模拟实现

【代码】C++-list模拟实现。

2024-12-04 12:31:56 179

原创 c++--vector模拟实现

本文旨在完成vector的增删查改的内容。

2024-11-27 18:07:54 168

原创 c++--vector用法

因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器, 程序可能会崩溃)。3.erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

2024-11-22 20:46:27 823

原创 c++--string类的模拟实现

【代码】c++--string类的模拟实现。

2024-11-21 22:53:56 143

原创 C++--string类(1)

增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到。的库函数,但是这些库函数与字符串是分离开的,不太符合。操作时,如果能够大概预估到放多少字符,可以先通过。操作不仅可以连接单个字符,还可以连接字符串。,自动迭代,自动取数据,自动判断结束。中有效字符清空,不改变底层空间大小。结尾的一些字符的集合,为了操作方便,预留空间,不改变有效元素个数,当。

2024-11-01 12:03:31 710

原创 C++模板

重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增。如何实现一个通用的加法函数?我们可以类似这样使用函数重载的方法进行编写。代码的可维护性比较低,一个出错可能所有的重载均出错。运行结果很明显这个模板是能够完成这种泛型编程的操作。这是因为模板中只有一个T无法变成两种类型,类模板实例化与函数模板实例化不同,还有另外一种方法就是。

2024-10-24 23:57:00 489

原创 C++中的内存管理

由图不难得知,局部变量是储存在栈中的,而malloc,calloc,realloc开辟出来的空间是储存在堆中的,全局数据和静态变量储存在数据段中,也叫静态区.代码段存的是可执行代码和只读常量。自定义类型中使用new和delete会自动申请类型大小的空间和自动调用构造函数和相应的析构函数并释放空间。申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施。失败,尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否。在申请的空间上执行构造函数,完成对象的构造。

2024-10-24 20:08:50 1227

原创 C++类和对象(下)补充

当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化,有些更新更"激进"的编译器还会进⾏跨⾏跨表达式的合并优化。现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返回值的过程中可以省略的拷⻉。⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的 叫有名对象。匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名象。对象拷⻉时的编译器优化。

2024-10-22 22:41:38 142

原创 C++类和对象(下)

尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这 个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的 成员使⽤的。每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义 初始化的地⽅。,因为缺省值是个构造函数初始化列表的,

2024-10-22 00:54:59 935

原创 C++--类和对象中(补充)

7.重载<<和>>时,需要重载为全局函数,因为重载为成员函数,this指针默认抢占了第⼀个形参位 置,第⼀个形参位置是左侧运算对象,调⽤时就变成了 对象<<cout,不符合使⽤习惯和可读性。3.重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。4.如果⼀个重载运算符函数是成员函数,则它的第⼀个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数⽐运算对象少⼀个。

2024-10-21 03:30:00 349

原创 C++入门--类和对象(中)

类的默认成员函数

2024-09-13 23:30:35 1288

原创 C++--类和对象(上)补充

C++和C语⾔实现Stack

2024-09-13 18:11:09 264

空空如也

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

TA关注的人

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