自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux理解文件fd

打开文件的方式w Truncate(缩短) file to zero length or create text file for writing.如上,是我们之前博客学的文件相关操作。man 2 open我将它们整理一下pathname: 要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开。

2025-05-07 17:03:02 630 3

原创 Linux进程控制

当一个进程调用fork之后,就有两个二进制代码相同的进程。通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自拷贝一份副本。所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。低8位也就是下标8~15,是我们的错误码信息,0~7中前7位是我们的进程信号区,后一位是我们的标志区。可以看到我们的父进程/子进程要修改数据时,为了保证进程间的独立性,操作系统就会采用写时拷贝。衡量一个程序的退出我们只需要看两个,一个退出码,一个退出信号。

2025-04-30 17:30:26 976 3

原创 Linux程序地址空间

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!Linux的进程优先级 NI 和 PR - 简书。

2025-04-23 20:56:49 799 4

原创 Linux环境变量

因为我们写的程序都是bash的子进程创建的,父进程的数据被子进程共享,而我们的bash在被加载的时候会创建两张表,一张是命令行参数表(argv【】)接收着我们用户输入的命令行,一张是环境变量表(env[])从os的配置文件中来的,所以我们的子进程能通过各种方式拿到父进程的这两张表。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。可以看到我们的PATH,我们也可以在后面添加。

2025-04-16 20:01:50 724 4

原创 Linux进程概念及理解

计算机管理硬件1. 描述起来,用struct结构体虽然不同厂商生产出来的硬件不一样,但是这不重要,我们操作系统只关心需要的数据,比如型号,厂商,状态...这些信息大家都是有的我们只需要将这些信息描述好就可以了。2. 组织起来,用链表或其他高效的数据结构描述好后,我们再用数据结构将他们管理起来就可以了。至此,值得关注的进程状态全部讲解完成,下面来认识另一种进程。

2025-04-08 22:07:22 762 1

原创 Linux项目自动化构建工具-make/Makefile

makefile是一个文件,它能帮助我们用make指令进行自动化构建,文件里面的构造是这样的,mytest,clean这些是目标文件,冒号后面的是依赖文件列表,这一行(比如说第一行这种)我们称他们为依赖关系,下面这一行gcc指令我们称他们为依赖方法,我们的make扫描是从上往下扫描,拿上面这个案例来说,我们的操作系统先是扫描到我们需要构建一个目标文件mytest,它需要什么呢?make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。这是我们可执行文件的修改时间。

2025-04-01 22:49:46 300 2

原创 Linux编译器-gcc/g++使用

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

2025-03-25 20:07:52 586 1

原创 Python基础语法(2)

条件语句能够表达 "如果 ... 否则 ..." 这样的语义. 这构成了计算机中基础的逻辑判定条件语句也叫做分支语句, 表示了接下来的逻辑可能有几种走向.一个典型的例子:如果丘处机没有路过牛家村,1. 那么金兵不会死在郭, 杨两家手上2. 郭, 杨两家就不会流亡北方3. 郭夫人就不会去到大漠, 完颜洪烈就不会遇到包惜弱4. 郭靖就不会和江南七怪救了铁木真5. 蒙古就不会统一6. 蒙古铁骑就不会西征7. 欧洲就不会出现火药, 也就不会出现文艺复兴, 大航海.

2025-03-18 22:05:47 1043 4

原创 Linux开发工具----vim

三种模式正常模式 插入模式 底行模式我们一共有12种总模式,大家下来可以研究一下vim操作打开,关闭,查看,查询,插入,删除,替换,撤销,复制等等操作。

2025-03-11 16:27:47 1028 3

原创 Python基础语法(1)

a = 10创建变量的语句非常简单, 其中a 为变量名. 当我们创建很多个变量的时候, 就可以用名字来进行区分.= 为赋值运算符, 表示把 = 右侧的数据放到 = 左侧的空间中.注意: 变量的名字要遵守一定规则.硬性规则(务必遵守)变量名由数字字母下划线构成.数字不能开头.变量名不能和 "关键字" 重复.变量名大小写敏感. num 和 Num 是两个不同的变量名.软性规则(建议遵守)变量名使用有描述性的单词来表示, 尽量表达出变量的作用.

2025-03-04 14:16:20 698 5

原创 Linux 软件包管理器 yum

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.

2025-02-25 16:52:16 336 7

原创 Linux权限的概念

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

2025-02-18 12:22:40 583 2

原创 Linux的基础指令(二)

在我们的/dev/pts目录下有我们云服务器的当前终端窗口的虚拟编号:虚拟终端设备:/dev/pts是Linux系统中的一个虚拟终端设备目录,它允许用户通过一个终端窗口访问多个物理终端。伪终端(pty):伪终端是一种虚拟的终端设备,它模拟了一个物理终端的行为,包括输入输出、鼠标操作等。伪终端通常用于创建一个新的会话,例如运行远程登录客户端时,系统会为每个用户分配一个伪终端。

2025-02-11 11:52:01 670 3

原创 Linux的基础指令(一)

cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。1.2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。我们目前只学习基础指令,其他的大家可以自己进行尝试,在初级阶段我们用的最多的其实是不带选项,用touch指令来创建我们的文件。Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。

2025-02-04 12:24:47 790 5

原创 浅谈Linux的发展

Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。并且保持着快速的增长率。随着Linux操作系统飞速发展,各种集成在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。

2025-01-28 19:18:57 1175 3

原创 跳表——C++

skiplist本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key或者key/value的查找模型。那么相比而言它的优势是什么的呢?那么等我们学习完它的细节实现,我们再来对比。skiplist是由William Pugh发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》。对细节感兴趣的同学可以下载论文原文来阅读。

2025-01-22 11:13:08 1112 10

原创 简单了解B+树和B*树及B树的应用

B树:有序数组+平衡多叉树;B+树:有序数组链表+平衡多叉树;B*树:一棵更丰满的,空间利用率更高的B+树。mysql是目前非常流行的开源关系型数据库,不仅是免费的,可靠性高,速度也比较快,而且拥有灵活的插件式存储引擎,如下:MySQL中索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。注意:索引是基于表的,而不是基于数据库的。

2025-01-15 10:52:59 975 1

原创 B树——C++

1. 如果树为空,直接插入新节点中,该节点为树的根节点2. 树非空,找待插入元素在树中的插入位置(注意:找到的插入节点位置一定在叶子节点中) 3. 检测是否找到插入位置(假设树中的key唯一,即该元素已经存在时则不插入)4. 按照插入排序的思想将该元素插入到找到的节点中5. 检测该节点是否满足B-树的性质:即该节点中的元素个数是否等于M,如果小于则满足6. 如果插入后节点不满足B树的性质,需要对该节点进行分裂:申请新节点找到该节点的中间位置将该节点中间位置右侧的元素以及其孩子搬移到新节点中。

2025-01-09 20:48:13 1241 6

原创 LRU Cache(C++)

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。什么是 Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用 DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。

2024-12-31 20:02:48 822 4

原创 图的最短路径(C++实现图【4】)

比如上面这幅图,我们先从s顶点下手的话,我们就是s->s的距离+dist中s的距离,我们会发现s作为我们的起点肯定是一开始就是最小的0,加下来我们再来看从s出去,可以更新两条,s->s+s->t和s->s+s->y,从t和y出去我们又可以更新s->t+t->z和s->y+y->x,接下来再从x出去我们又可以更新s->x+x->t这个时候我们就要对t的前顶点的指向进行更新,总计n轮的更新之后我们肯定就能得到我们要的最短路径了,当然中间我们也可以进行一些优化来帮助我们提前结束循环,我们在代码部分再来细谈。

2024-12-24 16:36:41 1155 5

原创 图的最小生成树(C++实现图【3】)

首先,我们要选择边最小的一条(按照贪心策略),所以我们选择了h,g两点所连成的边,其次我们找下一个最小的,我们发现有两条边的权值都为2,所以我们随便选择其中一条就行了,假设我们选i,c两点间的那条,接下来就选择g,f那条,以此类推,直到f图我们发现,它没有选权值为6的那条边,这是因为如果选了那条边,i根g就相连了,构成了回路就不满足我们的要求了(如何处理回路我们在代码讲解部分来解决)。我们会发现,库鲁斯卡尔算法和普利姆算法还是有相似之处的,都是采用贪心策略,只不过一个是从全局选择轻量级边,一个是局部选择。

2024-12-17 16:40:37 988 5

原创 图的遍历(C++实现图【2】)

(比如:小王的朋友为亲密度1的关系,小王的朋友介绍他自己的朋友给小王,小王就认识了他朋友的朋友,我们就称这是亲密度为2的朋友,以此类推...),在图这个结构中,我们就可以将它转化为直接相连与间接相连的关系划分等级,我们的levelsize表达的就是同一等级下有多少个点,这样我们就能知道每一层要遍历多少个点,而q呢就是存放这些点的队列。在子函数中我们做的第一步就是要把我们的srci先标记上,然后我们要找出srci没有被访问过的邻接点,以它为新的起点进行我们的递归操作就能将所有的节点遍历出来。

2024-12-10 18:28:54 614 3

原创 图的概念即存储结构(C++实现图【1】)

目录1. 图的基本概念2. 图的存储结构2.1 邻接矩阵2.1.1私有成员变量2.1.2类模板的声明2.1.3构造函数2.1.4获取顶点下标2.1.5添加边的信息2.1.6打印图2.1.7测试用例2.2邻接表2.2.1私有成员变量2.2.2Edge类2.2.3类模板的声明2.2.4构造函数2.2.5获取顶点下标2.2.6添加边的信息2.2.7打印图2.2.8测试用例1. 图的基本概念图是由顶点集合及顶点间的关系组成

2024-12-03 15:28:19 1058 7

原创 C++实现并查集

首先,我们需要一个vector来当我们的并查集结构,其次我们需要的第一个功能函数就是找根,我们可以使用lambda表达式来完成它,函数的设计跟我们的并查集类里面的是一模一样的,然后,我们遍历题目里面所提供的vector,我们先找出所有==的数据,将这两个数进行我们的合并操作,合并的操作也是一模一样的,合并完成之后我们再遍历一次,将!我们这里的路径压缩就比较有效果了,我们在查找的这个过程中把被一个父亲元素都归到根的下边,因为在一个集合中除了根,其他元素的地位都是一样的,我们可以随意更改其路径。

2024-11-26 18:35:29 1329 6

原创 C++的IO流

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?1. 使用itoa()函数2. 使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定, 而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。

2024-11-19 13:34:09 769 3

原创 C++的类型转换

1. C++中的4中类型转化分别是:_static_cast________、___reinterpret_cast______、__const_cast_______、___dynamic_cast______每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。因此C++提出了自己的类型转化风格,注意因为。1. typeid运算符。

2024-11-12 12:21:35 719 5

原创 C++特殊类设计

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

2024-11-05 13:56:23 644 4

原创 C++——智能指针

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.

2024-10-30 13:02:23 1004 5

原创 C++ —— 异常

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

2024-10-22 20:56:56 1065 5

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

在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。(C++11中线程类)kw=thread注意:1. 线程是操作系统中的一个概念,线程对象可以关联一个线程,用来控制线程以及获取线程的状态。

2024-10-18 16:14:49 763 5

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

我们无法直接获取参数包args中的每个参数的, 只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。现阶段呢,我们掌握一些基础的可变参数模板特性就够我们用了,所以这里我们点到为止,以后大家如果有需要,再可以深入学习。第三次的调用是先走的两次第二个ShowList再走一次第一个,原因跟上面是一样的,由于第一个参数的原因,导致我们每次传args的时候,args就会少一个参数,因为编译器会把这个包里的第一个参数填充到T的位置上去。

2024-10-11 16:20:36 918 3

原创 C++11新特性(基础)【2】

左值是一个表示数据的表达式(如变量名或解引用的指针),

2024-10-05 10:31:59 1032 2

原创 C++11语法(基础)【一】

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2024-09-24 12:00:20 740 3

原创 unordered_map/set(底层实现)——C++

我建议大家看过我《哈希表的底层实现之闭散列(C++)》、《红黑树模拟实现STL中的map与set——C++》这两篇文章之后再来看这一篇,因为这一篇的一部分哈希实现和一部分unordered_map和unordered_set的实现原理是建立在这两篇的基础之上的。//哈希链表T _data;{}跟闭散列不同,这回我们的结构体里就没有状态码的设置了,因为我们这回是以链表的方式进行哈希桶的实现来处理哈希冲突,所以我们需要next指针指向产生哈希冲突的元素。

2024-09-20 14:47:16 1297 4

原创 哈希表的底层实现之闭散列(C++)

private://有效数据个数这里我们就用std库里的vector来充当我们的底层结构,我们的哈希链表就存放到这个顺序表里就好了,_n代表我们的有效数据个数,可以先给它上个0;我们接下来讲它的各个函数。

2024-09-09 13:21:49 1010 5

原创 哈希基础概念即使用(C++)

1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。2. 在unordered_map中,键值通常用于唯一的标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

2024-09-02 09:58:06 873 4

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

迭代器我们采用类模板的方式来进行,Ref是T的引用,Ptr是T的指针Node是我们红黑树的节点,Self是我们迭代器类型本身,构造我们也就选一个红黑树的节点进行拷贝构造就好了。我们的map和set的简单封装到这里就结束了,我们要弄清楚红黑树的迭代器的主要功能的实现思想,还要红黑树的一些修改,最重要的还有map和set的封装思想,弄清楚这些,大家在日常生活中对map和set的使用就会更加得心应手。

2024-08-28 09:39:50 1006 7

原创 C++实现——红黑树

我们将红色与黑色设置成枚举类型,使代码看起来更加规范,我们定义节点采用类模板的方式,内部成员分别是左节点指针,右节点指针,父亲节点指针,pair结构体类型的变量,然后就是代表我们颜色的变量。我们再对它们进行初始化列表就可以了,我们的每个节点初始颜色都得设置成红色,不然就无法满足我们上面给的5条红黑树的性质。

2024-08-20 15:12:17 982 7

原创 C++实现AVL树(图解)

如上图所示,我们每一个节点的结构体就长这样,我们使用了类模板来构建一个K_V模型,类里面有三个结构体指针,分别代表左孩子,右孩子,还有父亲节点,多个父亲节点是为了后期我们进行旋转操作的时候能控制住节点间的关系。除了这三个指针外我们还有一个标准库里的pair结构体和一个平衡因子,这个平衡因子就是保证我们的二叉搜索树是平衡二叉搜索树的关键,接下来就是初始化列表来对这些成员变量进行初始化。

2024-08-15 16:34:21 755 1

原创 C++——多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。再举个栗子: 最近为了争夺在线支付市场,支付宝年底经常会做诱人的扫红包-支付-给奖励金的活动。那么大家想想为什么有人扫的红包又大又新鲜8块、10块...,而有人扫的红包都是1毛,5 毛....。其实这背后也是一个多态行为。

2024-08-11 16:00:54 1300 5

空空如也

空空如也

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

TA关注的人

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