自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 认识linux -- linux进程信号

上⾯所说的所有信号产⽣,最终都要有OS来进⾏执⾏,为什么?OS是进程的管理者信号的处理是否是⽴即处理的?在合适的时候信号如果不是被⽴即处理,那么信号是否需要暂时被进程记录下来?记录在哪⾥最合适呢?⼀个进程在没有收到信号的时候,能否能知道,⾃⼰应该对合法信号作何处理呢?如何理解OS向进程发送信号?能否描述⼀下完整的发送处理过程?

2026-01-06 21:56:29 748

原创 认识linux -- 进程间通信

数据传输:⼀个进程需要将它的数据发送给另⼀个进程资源共享:多个进程之间共享同样的资源。通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知⽗进程)。进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。

2025-12-26 19:44:37 823

原创 认识linux -- 软硬连接和动静态库

库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:静态库.a[Linux]动态库.so[Linux]

2025-12-20 11:22:21 858

原创 认识Linux -- Ext系列文件系统

下⾯⽤⼏张图总结,⼀张是画的,其他都是在⽹上找的.主要想从不同⻆度说明.

2025-12-15 16:46:45 556

原创 认识Linux -- 基础IO

open:man openpathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1mode_t理解:直接。

2025-12-06 17:18:53 760

原创 认识linux -- 进程控制

在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:1 分配新的内存块和内核数据结构给⼦进程2 将⽗进程部分数据结构内容拷⻉⾄⼦进程3 添加⼦进程到系统进程列表当中4 fork 返回,开始调度器调度当⼀个进程调⽤fork之后,就有两个⼆进制代码相同的进程。⽽且它们都运⾏到相同的地⽅。这⾥看到了三⾏输出,⼀⾏before,两⾏after。

2025-12-01 08:37:05 771

原创 认识linux -- 命令行参数和环境变量以及程序地址空间

1 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数2 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。3 环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性。

2025-11-22 21:31:23 634

原创 认识Linux -- 进程概念

在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成本增加,我们称之为进程调度O(1)算法!

2025-11-14 20:55:14 1299 3

原创 认识linux -- 调试器 - gdb/cgdb的使用

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者。要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g。单步执⾏,不进⼊函数内部, 逐过程 F10。单步执⾏,进⼊函数内部, 逐语句 F11。显⽰源代码,从上次位置开始,每次列出。选项,如果没有添加,程序⽆法被编译。跟踪显⽰指定变量的值(每次停⽌时)查看当前执⾏栈的各级函数调⽤及参数。取消对指定编号的变量的跟踪显⽰。执⾏到当前函数返回,然后停⽌。从当前位置开始连续执⾏程序。

2025-11-07 19:37:18 914

原创 认识linux -- 编辑器vim以及编译器gcc/g++和Makefile文件

本章节我们认识了编辑器vim,编译器gcc/g++,以及Makefile/make的相关用法,这样我们就基本了解了在linux下我们应该如何去写代码,编代码以及如何更高效的去做编译代码这件事,那么认识了这些,下一章节我们就要去认识linux下的debug是怎么样的。

2025-10-31 18:00:12 1256

原创 C++ 智能指针的使用及其原理

下⾯程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后⾯的delete没有得到执⾏,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete内存,再把异常抛出,但是因为new本⾝也可能抛异常,连续的两个new和下⾯的Divide都可能会抛异常,让我们处理起来很⿇烦。智能指针放到这样的场景⾥⾯就让问题简单多了。

2025-10-24 20:10:42 966

原创 C++ 异常

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

2025-10-16 21:49:44 537

原创 C++11新特性(3)

好了,C++11的新特性到此就告一段落了,相信大家对C++11添加的新语法和新特性都有一定的了解了吧,只有不断练习和训练才能达到更高的高度,下个内容我们再会!

2025-06-04 17:37:08 759

原创 C++11新特性(2)

本节主要讲的时右值和左值的语法,最主要的是理解它的语法和熟悉使用它的语法,下一节将会将到下一部分,《可变参数模板》。

2025-05-23 19:54:12 679

原创 C++11新特性(1)

C++11总体来说我们只需要了解他的语法是怎么用的,一些新型的特性是需要我们不断地取练习才能形成熟能生巧的,本节还只是做了一部分介绍,下一节我会介绍另一小部分。

2025-05-12 20:19:12 878

原创 unorder_map/set的底层实现---C++

_kv(kv){ }首先我们可以用pair结构来存储key对应的value值,然后再设置一个_next指针一个个往下链接,这样就能对哈希链表链接的基本实现了。unordered_map/set的实现就是再哈希表的基础长改装一下,然后再用这两个进行封装,这样就是先对unordered_map/set的模拟实现,当然你也可以写完以后自己测试一下是不是与库里面的相似。

2025-05-04 10:40:30 690

原创 哈希表的模拟实现---C++

/表中存储数据个数这里我们就用std库里的vector来充当我们的底层结构,我们的哈希链表就存放到这个顺序表里就好了,_n代表我们的有效数据个数;

2025-04-26 19:59:04 756

原创 红黑树模拟实现STL中的map和set---C++

​​这里采用类模板的方式,Ref是T的引用,Ptr是T的指针;

2025-04-19 16:27:16 881

原创 C++ 实现红黑树

RED,BLACK//这里默认的用key/value结构实现// 这里更新控制平衡也要加入parent指针:_kv(kv)我们将红色与黑色设置成枚举类型,使代码看起来更加规范,然后使用类模板来定义节点,内部成员是节点的存储,节点的左树,节点的右树,当前节点的颜色,然后再来初始化列表就可以了。col我们暂时先不设置。

2025-04-12 15:13:50 676

原创 C++实现AVL树

上上节我们学习了二叉搜索树,他的理想查找的时间复杂度是o(log n),但是如果是下面这种情况,那么它的时间复杂度就会变成o(n).这种情况就是出现一边高的那种,它的个数和它的高度相差不大。那么这样就会把二叉搜索树的优势给丢了,效率也是大打折扣,所以后面发明了一个用来平衡左右高度的树,AVL树。

2025-04-06 16:56:17 1064

原创 C++ --- map和set的使用

• set的声明如下,T就是set底层关键字的类型。• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是⽤红⿊树实现,增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序的。

2025-04-01 15:08:46 1007

原创 C++ --- 二叉搜索树

⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:1 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值2 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值3 它的左右⼦树也分别为⼆叉搜索树4 ⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义。

2025-03-26 21:55:32 949

原创 C++ --- 多态

多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。Person对象买票全价,Student对象优惠买票在虚函数的后⾯写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被 派⽣类重写,但是语法上可以实现),只要声明即可。包含纯虚函数的类叫做抽象类,抽象类不能实例 化出对象,如果派⽣类继承后不重写纯虚函数,那么派⽣类也是抽象类。纯虚函数某种程度上强制了 派⽣类重写虚函数,因为不重写实例化不出对象。

2025-03-22 22:33:17 1297

原创 Linux 权限的概念

Linux下有两种用户:超级用户(root)、普通用户。超级⽤⼾:可以再linux系统下做任何事情,不受限制普通⽤⼾:在linux下做有限的事情。超级⽤⼾的命令提⽰符是“#”,普通⽤⼾的命令提⽰符是“$”。su [⽤⼾名]:切换⽤⼾。例如,要从root⽤⼾切换到普通⽤⼾user,则使⽤ su user。要从普通⽤⼾user切换到root⽤⼾则使⽤ su root(root可以省略),此时系统会提⽰输⼊root⽤⼾的⼝令。

2025-03-19 18:15:31 587

原创 C++——继承

通过上面的案例,那么就很好理解了下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以既叫基类/派⽣类,也叫⽗类/⼦类)这里好像发现继承访问限定符和访问限定符都是一样的三个,那他们有什么关系呢?1.基类private成员在派⽣类中⽆论以什么⽅式继承都是不可见的。这⾥的不可见是指基类的私有成员还是被继承到了派⽣类对象中,但是语法上限制派⽣类对象不管在类⾥⾯还是类外⾯都不能去访问它。2.

2025-03-14 22:46:03 661

原创 C ++ 实现优先队列

由上面可以知道,优先队列里面的参数有三个,第一个很好理解就是我们要传的数据类型,第二个是传相对应的适配器,适配器其实是可以手动更改的,但是其实我们也就可以用它最基本的vector来实现,第三个参数是我们的仿函数,仿函数在这一节还是挺重要的,在这里先放着,在后面会详细的说。在这里先将全部的代码给放出来,一遍后面好讲解。

2025-03-08 20:37:04 372

原创 C++实现vector

本篇文章主要实现的是vector里面常用到的函数,而不是全部实现一遍,最主要的目的只是理解。

2025-03-04 16:25:22 673

原创 C++实现list容器

这一节和上一节一样,实现只是为了更好的理解底层。

2025-02-25 17:10:45 806

原创 Linux基本指令(2)

cat [选项] [⽂件: 查看⽬标⽂件的内容如图是一个file.txt文件,那么拿这个作为参考,来说明下面这三个命令-b是对非空输出行编号-n 是对输出的所有行编号-s是不输出多行的空行。

2025-02-21 13:53:11 760

原创 Linux的基础指令

ls [选项] [⽬录或⽂件(在【】里面的选项可以不写):对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。常⽤选项:-a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。-d 将⽬录像⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。如:ls ‒d 指定⽬录-i 输出⽂件的 i 节点的索引信息。如 ls ‒ai 指定⽂件-k 以 k 字节的形式表⽰⽂件的⼤⼩。ls ‒alk 指定⽂件-l 列出⽂件的详细信息-n ⽤数字的 UID,GID 代替名称。

2025-02-19 18:53:23 659

原创 C++中const成员函数

为什么d1<d2没有问题,而d2<d1却有问题了呢?首先对于第一个比较来说d1和d2都是权限的保持接着对于第二个比较来说d1传递过去是权限的缩小,本来是可以修改了,现在不能修改;d2传递过去就变成了【权限的放大】,原本的d2是const,但是this指针并没有加[const]做修饰,所以就造成了【权限方法】的问题既然这样我们该如何去做一个修改呢?此时就可以用到我们上面说的const来达到目的,依旧是在函数后面加一个const修饰就可以了class Datepublic://构造函数。

2025-02-16 18:22:41 689

原创 C++ 实现string类

一般来说,我们写的成员函数都是public类型的,这样能在外部调用到,一般类的内置成员变量都是private的,不能允许外界随便改变它public://写你的成员函数private://首先,string类是一个字符串,那么我们先要有一个char*类型的指针,还有记录它大小的_size,和一个记录它空间的_capacity,由此来看,string的初步创建就是这样。

2025-02-16 10:50:03 600

原创 C++内联函数(详解)

一 引入inline关键字的 原因一 引入inline关键字的 原因函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。一个 C/C++程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是main(),终点也是main()。

2025-02-09 22:13:44 751

原创 C++命名空间详解

域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。指定命名空间访问,项⽬中推荐这种⽅式。

2025-02-09 11:27:58 401

原创 C语言的编译与链接

在 ANSI C的任何一种实现中,存在两个不同的环境。第一种是翻译环境,在这个环境中代码被转化成可执行的机器指令(二进制指令)第二种是执行环境,它用于实际执行代码。

2025-02-08 20:42:27 1141

原创 C语言文件操作(详解)

上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如文件输出流)。

2025-02-08 12:53:09 1471

原创 C语言结构体的用法详解

要使用结构体呢,就需要先创建一个结构体类型:struct 结构体名称 {成员类型1 成员名称1;成员类型2 成员名称2;...成员类型n 成员名称n;struct 是定义结构体的关键字,结构体名称用于标识这个新的数据类型,花括号内部包含了若干成员变量的声明。每个成员变量都有自己的类型和名称,它们之间用分号分隔。下面通过一个具体的例子来说明结构体的定义和使用。int age;int id;这里定义了一个名为 Student 的结构体类型,它包含 4 个成员。

2025-02-07 15:38:47 916

原创 整数和浮点数在内存中存储

整数的二进制表示有三种方式:原码,补码和反码。这三种表示方式均由符号位和数值位两部分组成,符号位为最高位,0为”正“,1为”负“,其余位均为数值位。原码:按照整数的形式翻译成二进制得到的就是原码。反码:就是将原码的符号位不变吗,其余数值位全部取反。补码:就是在反码的基础上加1。正整数的反码,原码都相同。而负整数的反码,原码,补码都不相同。//比如5的原码,反码和补码。原:0000000000000000000000000000101。

2025-02-06 11:48:46 918

原创 库函数的模拟实现

1.malloc(): 用于在堆(heap)中动态分配指定大小的内存空间,并返回指向分配内存的指针。函数原型为:void *malloc(size_t size);2.calloc(): 用于在堆(heap)中动态分配指定数量和大小的内存空间,并初始化为零。函数原型为:void *calloc(size_t num, size_t size);3.realloc(): 用于重新调整之前分配的内存空间的大小。可以用来扩大或缩小内存空间。

2025-02-05 16:16:56 579

原创 c语言深入理解指针

本质上,口语中所说的,其实就是是用来存放地址的一个指针。我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是内存中读取的,处理后的数据也会放回内存中。但在如今电脑内存越来越大的时代中,这些内存空间如何高效的管理?那么就要把内存划分成一个一个的内存单元,每个内存单元的大小取1字节,每个内存单元都有一个编号。有了内存单元的编号,CPU就可以快速找到一个内存空间。内存单元的编号 == 地址 == 指针。

2024-10-05 14:04:35 1981

空空如也

空空如也

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

TA关注的人

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