自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程程序替换

我们所创建的子进程,执行的代码都是父进程的一部分如果我们想让子进程执行新的程序呢???执行全新的程序和访问全新的数据,不在与父进程有瓜葛---->进程等待程序替换能替换指令程序,也能替换我写程序exec* 叫做进程的替换,系统大于一切我们可以用“语言”调用其他程序const char *path:我们要替换的新程序->文件->程序文件的路径加文件名const char *arg,...:如何执行,命令行上怎么写,参数就怎么传,以NULL结尾列如我们让子进程执行命令。

2024-02-29 19:28:09 413

原创 进程等待

通过的方式,让父进程对子进程进行资源回收的等待过程。

2024-02-27 22:58:59 913

原创 命令行参数和环境变量

如:当我们在进行C++/C链接的时候,我们从来不知道我们所连接的的静态库在哪,但是我们可以以链接成功,这就是因为我们有相关环境变量帮助编译器进行查找。输入一个指令后,系统会自动扫描环境变量的PATH,他存的就是环境变量的指令,如果找到了,则指令运行成功,如果没找到,则指令运行失败。命令行启动的进程都是shell和bash的子进程,子进程的命令行参数和环境变量都是都是父进程bash传递给我们的。执行一个可执行程序,我们必须获得它的路径,如果我们执行一个指令,我们怎么获得它的路径?

2024-02-26 22:13:24 1000

原创 哈希切分

此时要分为两种情况,如果子文件中冲突的IP大多是不相同的IP,那么map是会统计不下的,此时就需要我们换个字符串hashfunc,递归哈希切分这个子文件,可以改变一下哈希函数中除留余数法,模的大小,但除留余数法还是挺好用的,如果你觉得不太好用,你也可以尝试其他的哈希函数,我个人推荐继续使用除留余数法,改变一下模的大小,再换个hashfunc,重新建立映射关系,递归将这个子文件进行哈希切分,直到map能够统计这个子文件中的IP内容为止。所以这样的方式也是不行的。如果哈希切分后的单个子文件还是太大该怎么办呢?

2024-02-16 01:53:45 785 1

原创 布隆过滤器

相同的query,是一定进入相同编号的小文件,再对这些文件放进内存的两个set中,编号相同的Ai和Bi小文件找交集即可。我们可以采用三种字符串转化方法对字符串进行转化分别存储在位图当中,通过对三个位置的判断来进行对数据的判断。当我们进行对海量字符串进行查找时,我们单纯采用位图法可能存在冲突,无法解决,这时我们可以使用布隆过滤器。近似算法:利用布隆过滤器,交集的就一定会进去,但是可能会存在误判:不同的也会进去,这是近似。精准算法:query一般是查询指令,比如可能是网络请求,或者是一个数据库sql语句。

2024-02-16 01:36:23 312

原创 位图

如果出现海量数据判断数据在不在问题,我们用哈希表无法解决,我们可以利用哈希思想来创建一个新的stl容器,用bit位上的0或1来表示数据存在与否的哈希表。我们向让bit位这个位变成0,可以用这个int数据与(1左移之后值先进行按位取反是那一位变为0,其他区全为1)再进行按位与赋值。我们向让bit位这个位变成1,可以用这个int数据与(1左移之后值那一位变为1,其他区全为0)之后进行按位或赋值。我们测试这个bit位是否为1,可以之间用这个int数据与(1左移之后值那一位变为1,其他区全为0)相与。

2024-02-15 01:49:49 768

原创 哈希表—闭散列

闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表种必然还有空位置,那么可以把产生冲突的元素存放到冲突位置的“下一个”空位置中去。这里我们需要用key来%数组的size来获取该元素的位置,如果是int类型我们可以%,但如果是string类型我们就不能直接取模。设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希。缺点:存在哈希冲突,需要解决哈希冲突,哈希冲突越多,效率下降越厉害。当前位置被占用,开放空间里按照某种规则找一个没有被占用的位置存储。

2024-02-09 01:37:56 432

原创 map和set封装

这里存在一个问题,插入时data的大小是如何比较的,如果是set,类型是key,那么可以正常比较,如果是map,那么类型是pair的比较,我们只需要比较key,而pair的比较如果key相等还会继续比较value来比较大小,就不可以了。了解:set和map,set的值不可以修改,set的底层是将const迭代器定义成普通迭代器和const迭代器,而mapkey值不可以修改,而value值可以修改,map底层是用const来修饰map'的key值。查找过程我们就可以套上仿函数来进行数据的比较了。

2024-02-02 21:02:44 684

原创 gdp调试—Linux

代码分为debug模式和release模式如果一份代码要被调试,这份代码必须是debugLinux下编译代码默认是是release模式如果你想代码是debug模式必须加上 - g小提:vim默认:命令模式gcc默认:release模式Linux中形成的可执行程序格式:ELF在debug发布时,一定会给可执行程序内部添加debug信息debug形成的可执行程序 > release形成的可执行程序。

2024-01-31 00:13:20 673

原创 手撕红黑树

2.如果插入结点的父亲是红色,那么需要进行处理(1.变色 2.旋转+变色)3.不能出现连续的红色结点(连续结点组成:红+黑 黑+红 黑+黑)每条路径的黑色节点数相同,所以最长路径最长是最短路径的两倍,不会超过。只需要将p和u变为黑色,g变为红色,然后令c=g继续往上调整。2.uncle不存在或存在为黑色 旋转+变色。单纯变色无法完成调整,我们需要先进行右单旋再进行变色。5.叶子节点都为黑色(空结点)NIL结点。1.如果插入结点的父亲是黑色,不需要处理。1.插入在parent的左侧。

2024-01-30 19:22:33 379

原创 手撕AVL树

第二步:将2的左指针指向1,然后修改1和2的父指针(注意如果1可能也是子树,所以需要保存1的父节点,这里可以用root==1这个结点来进行判断。第二步:将2的右指针指向1,然后修改1和2的父指针(注意如果1可能也是子树,所以需要保存1的父节点,这里可以用root==1这个结点来进行判断。第一步:先将1的右指针指向2的左子树b(这里需要注意2的左子树可能为空),将b的父指针指向1。第一步:先将1的左指针指向2的右子树b(这里需要注意2的右子树可能为空),将b的父指针指向1。子树的高度变化会继续向上影响祖先。

2024-01-28 18:41:50 571

原创 二叉搜索树基本概念与实现

搜索二叉树的中序遍历是升序。

2023-12-12 23:37:52 392

原创 list模拟实现

【代码】list模拟实现。

2023-11-29 09:29:48 610

原创 list简单使用

双向循环链表。

2023-11-29 08:49:44 421

原创 vector模拟实现

【代码】vector模拟实现。

2023-11-28 15:47:54 336

原创 priority_queue模拟实现

仿函数的通俗定义:仿函数(functor)又称为函数对象(function object)是一个能行使函数功能。仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重operator()

2023-11-27 21:53:12 487

原创 priority_queue优先级队列基本使用

类似于堆。

2023-11-27 21:19:34 625

原创 stack和queue的模拟实现

适配器就是接口,对容器、迭代器、算法进行包装,但其实质还是容器、迭代器和算法,只是不依赖于具体的标准容器、迭代器和算法类型。概念源于设计模式中的适配器模式:将一个类的接口转化为另一个类的接口,使原本不兼容而不能合作的类,可以一起运作。容器适配器可以理解为容器的模板,迭代器适配器可理解为迭代器的模板,算法适配器可理解为算法的模板。

2023-11-27 19:25:54 812

原创 stack和queue

栈 先进后出队列,先进先出。

2023-11-24 20:03:03 465

原创 Vector的简单使用

1.vector是STL容器中的一种常用的容器,和数组类似,由于其大小(size)可变,常用于数组大小不可知的情况下来替代数组2.vector是为了实现而产生的容器,然而这个名字是STL编写者取名没区好,因为在数学上的向量在几何中是矢量,两者名字相同而意义大相径庭3.vector也是一种顺序容器,在内存中连续排列,因此可以通过下标快速访问,时间复杂度为O(1)。然而,连续排列也意味着大小固定,数据超过vector的预定值时vector将自动扩容。

2023-11-21 00:36:43 120

原创 string类的模拟实现

(现代写法):需要引入swap函数改变指针指向。

2023-11-17 13:18:47 69

原创 string的简单操作

string是一个字符序列的类。

2023-11-15 23:41:38 112

原创 模板初阶 C++

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具,所以模板就是把原本我们需要做的的事情交给了编译器。类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化结果才是真正的类。在编译器编译阶段,对于函数模板的使用,编译器需要根据传入的实参类型来推演生成对应的函数以供调用。1.函数重载仅仅是类型不同,代码复用率较低,只要出现新类型时,就需要用户增加对应的函数。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。

2023-11-12 12:01:35 254

原创 make/makefile

makefile就相当于一个脚本,集合了程序编译指令的文件,make是一个命令工具,当执行make指令时,它会自动读取makefile中的编译指令并执行,完成项目的自动化构建。

2023-11-10 18:18:29 90

原创 gcc [linux]

2、静态库链接时需要拷贝一份完整的文件到目标文件中,然后一起链接生成可执行文件,而动态库不需要,动态库分动态加载库和动态链接库,动态加载库是程序运行时需要的时候才会被加载到内存中,动态链接库是项目生成的可执行文件被加载到内存中时,顺带着也会将动态链接库加载到内存中,这种方式会导致系统资源浪费。3、依赖静态库的可执行文件体积较大,而且修改静态库之后需要重新编译生成,而依赖动态库的可执行文件和动态库实际是分开的,动态库改变之后只需要将动态库重新编译链接生成即可,不影响可执行文件。当然这也会成为他的缺点。

2023-11-10 15:20:57 111

原创 内存管理

注意:与malloc/free不同的是,new/delete在对于自定义类型开空间的同时还会调用构造函数和析构函数opeartor new也是malloc来申请空间,如果成功申请就直接返回,否则执行用户提供的空间不足的应对措施,如果用户提供措施就继续执行,否则就抛异常(try catch函数)operator delete最终也是通过free来释放空间。

2023-11-10 13:47:45 390

原创 yum

Linux中我们也要进行工具/指令/程序,安装,检查卸载等,需要yum的软件安装软件的方式:1.源代码安装--交叉编译工作2.rpm包直接安装3.yum:yum是我们linux预装的一个指令,搜索,下载,安装对应的软件,相当于手机上的应用市场。

2023-11-05 21:45:15 174

原创 Linux权限

r 读权限 w: 写权限 x: 可执行权限 -: 没有权限。可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。有风险,用户自定义的指令shell都是创建子进程的方式让子进程去执行有风险的指令。可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.可执行权限: 如果目录没有可执行权限, 则无法cd到目录中。当一个目录被设置为“粘滞位”,则该目录下的文件只能由。charg 用户名 文件名。

2023-11-05 18:32:16 97

原创 类和对象 下

构造函数是在构造类的时候给对象赋初值,并不是给类的成员函数初始化,赋值可以赋多次,而初始化只能初始化一次,这里我们引入初始化列表来对成员函数进行初始化初始化列表,以冒号 :开始,接着以逗号 ,分隔开的成员列表,每个成员后面跟着一个放在括号中的初始值或者表达式注意:1.每个成员变量在初始化列表中只能出现一次2.类中包含引用成员变量const成员变量自定义类型成员变量(且该类没有默认构造时),必须放在初始化列表初始化3.尽量使用初始化列表初始化。

2023-11-05 16:09:01 134

原创 Linux指令【下】

用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表。unzip test.zip -d 110 解压到指定目录。-C 解压到指定目录 tar -xzf -C 指定目录。find + 目录 -name 文件名。uname -a 查看Linux的体系结构。解压:tar -xzf/-xvzf。时间戳->时间 date -d@秒数。-3 显示上个月,当前月和下个月。时间->时间戳date +%s。

2023-11-02 09:45:50 78

原创 日期类函数实现

【代码】日期类函数实现。

2023-11-01 20:49:47 87 1

原创 Linux指令【中】

直接删除不用询问我删除前逐一访问删除整个目录下的文件,-r递归的意思直接删除,无法删除使用rm -r 就可以删除。

2023-11-01 15:34:02 80

原创 vim

vim是一款多模式的文本编辑器,vim里面还有很多子命令,来进行代码的编写操作。

2023-10-31 00:03:44 1012

原创 Linux指令【上】

whoami 查看当前帐号是谁who 查看当前有哪些人在使用pwd 当前的工作目录。

2023-10-30 21:21:18 179

原创 类和对象 中

一旦涉及到资源申请时,一定要写拷贝构造函数,否则就是浅拷贝,例入栈,如果不写拷贝构造,拷贝出来的栈还在用之前的空间。构造函数是一个特殊的成员函数,名字与类名相同,在创建类类型对象时由编译器自动调用,以保证每个成员函数都有一个合适的初始值,并且在对象整个生命周期只调用一次。3.若未显式定义,编译器会生成默认的拷贝构造函数,按内存储存按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。3.一个类只能有一个析构函数,若未显式定义,系统会自动生成默认的析构函数,析构函数不能重载。一旦涉及到资源管理则必。

2023-10-29 23:28:44 85

原创 常用排序算法

在单趟排序结束进行交换时,要注意maxi的下标,如果maxi==begin,那么先进行mini和begin两个数的交换就会将最大值交换到mini位置上,所以要进行判断,如果相等,那要令maxi=mini。令最大和最小的下标为开头的数,然后从第二个数开始遍历直到最后一个数,在此过程中进行比较,改变maxi和mini的值,最后将mini和第一个数进行交换,maxi和最后一个数进行交换。将最后一个数依次与前面的数比较,如果前面的数比最后一个数大,就依次将前面的数后移,知道最后一个数到达位置。

2023-10-29 16:30:32 447 1

原创 C++ 入门

1.定义命名空间,需要用到namespace关键字,后跟命名空间的名字,加 { }, { }中为命名空间的成员可以在里面定义变量,函数,结构体等2.命名空间可以嵌套3.同一个工程中允许存在多个相同名称的命名空间,编译器最后合成同一个命名空间中注意:一个命名空间定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中命名空间的使用命名空间的三种使用方式1.加命名空间名称及作用域限定符 : :2.使用using将命名空间中某个成员引入。

2023-10-29 01:34:42 128

原创 类和对象【上】

在C语言中结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数,在C++中,更喜欢用class来代替一种是是声明和定义全放在类里面如果成员函数定义在类中,编译器会将其当作内联函数处理另一种是类的声明放在.h文件这种,类的定义放在.c文件中(需要注意,成员函数名前需要加类名::.h文件.c文件。

2023-10-28 23:29:59 125 1

原创 手撕二叉树

【代码】手撕二叉树。

2023-09-21 00:03:39 408

原创 手撕 队列

QNode;int size;}Que;//初始化队列//入队//出队//判断队列是否为空//队列数据//队尾数据//队头数据//销毁队列。

2023-09-08 23:27:56 129 1

空空如也

空空如也

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

TA关注的人

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