自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 工作之余,学习Go,快速入门,第一节:变量

快速学习go

2023-10-10 09:59:12 138

原创 关于博客停更的原因

如果你还在写博客,请坚持下去,总会有用的

2023-05-20 00:13:39 818 4

原创 【力扣】正则表达式匹配--回溯法c++解剖

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。false"a" 无法匹配 "aa" 整个字符串。

2022-10-26 20:25:39 883

原创 【项目】C++实现高并发内存池

高并发内存池项目的实现

2022-08-11 18:51:01 2620 4

原创 【Linux】信号(2)如何阻塞、处理信号

sigset_t 是一个在栈上定义的一个用户级变量,而这些数据添加并不会影响进程,因为 sigset_t 并没有设置进 PCB 内,所以我们必须经过系统调用设置进 OS,才能够影响进程、pending 等。这里我们需要了解的函数是: oset 是可以看作 old set,我们调用函数会对信号屏蔽字进行修改,返回老的信号屏蔽字,万一哪一天想设置回来可以记得。how 有三种方式: 1、SIG_BLOCK:添加信号屏蔽字,mask = mask | set; 2、S

2022-06-26 19:10:58 551

原创 【Linux】信号(1)认识、记录和产生信号

当进程发生错误时,OS 会中止进程,它是如何做到的?这就需要了解一个重要的元素:信号。OS 会发出信号使得进程状态改变,比如我们常用的 kill -9、ctrl + c 等等,那么 OS 是怎么识别这些信号的,下面我们来认识一下信号。 当信号还没产生时,我们都知道信号的结果,为什么,因为我们学习了,那操作系统怎么学习呢,在产生时我们得先识别出来。且信号产生的种类有很多种情况,进程的运行和信号的产生是属于一种异步关系,也就是说,信号产生的同时不会打搅进程的运行。 当信号产生时,不一

2022-06-23 22:17:42 415

原创 【Linux】进程间通信

进程间通信有3种方法:1、管道 -- 通过文件通信2、system V -- 通过共享内存 IPC 通信3、POSIX -- 通过网络通信 通信的本质是“数据的拷贝”,是进程A -> “拷贝”给OS -> OS“拷贝”到进程B,其中“拷贝”需要用到空间,所以OS一点要提供一段内存区域,能够被两个进程所看到。 进程间通讯的本质:让不同的进程先看到同一份资源(内存、文件、内核缓冲区等)。 资源由谁提供,就有不同的进程通信方式。 实现先讲解匿名管道,和它的名

2022-06-22 23:30:58 322

原创 【Linux】动静态库

在 Linux 下动/静态库的后缀名是 .a/.so,Windows 下是 .dll/.lib ,这类库的本质其实是,一堆 .o 文件的集合,不包含 main,但包含了大量方法,相当于半个可执行文件。查看可执行文件所依赖的库。动态库的特征: 体积小,节省物理内存空间,加载一份即可,但是依赖库;静态库的特征: gcc -o 后加 static,体积大,多个加载时速度慢,且存在数据冗余,占据磁盘和内存空间,但与库无关; 动态库在内存中有特定的共享区映射动态库,而静

2022-06-21 19:37:04 190

原创 【Linux】文件系统的inode是什么?软硬链接是什么?了解意义

当我们在 LIiux 中输入 ll-i 指令时,会显示文件信息:权限、拥有者、所属组等这些我都知道,但是最前面的比如 1051810 是什么,还有权限后面的3和6是什么呢?本章我们就来讲解一下 inode 和 硬链接数。 ...

2022-06-08 10:39:20 2172

原创 【Linux】缓冲区的概念

缓冲区有 3 种:无缓冲、行缓冲和全缓冲。 行缓冲一般体现在显示器进行刷新数据时,在内存缓冲区中,遇到 “ \n ” 刷新,如果没有遇到,那就等本行满了再刷新;全缓冲体现在对于文件写入的时候,“ \n ” 无效,只有等数据满了才写入到文件。 ...

2022-06-05 23:13:30 1791

原创 【Linux】基础IO——C语言与底层OS的输入输出实现

在C语言中,我们用的打开文件的函数是: “ w ”、“ > ” :写入,是一种覆盖式;“ a ” 、“ >> ”:追加;“ r ” : 读取。 如果第一个参数不带路径只写文件名,那就默认在当前路径下执行。什么是当前路径?不是指可执行程序当前所在路径,应当是当前进程运行时所处的路径。 比如说,“ w ” 状态下,可执行程序在路径 /test/day/ 中,我们默认创建进程时(./ exe),会在当前路径下创建一个 log.txt 文件,但如果在 /test/ 中

2022-06-03 10:31:59 281

原创 【Linux】创建进程,进程终止,进程替换

1、为什么给子进程返回0,给父进程返回子进程的 pid ?2、如何理解 fork() 有两个返回值?

2022-05-31 22:52:21 119

原创 【Linux】进程地址空间是什么样的关系存在

通常情况下,32x 系统下的内存大小是 4G,进程在查找数据时的地址我们认为它是一个真正的地址,其实不是,我们所能看到的地址,包括堆栈、变量等等,它们的地址其实都是虚拟地址,可以总结的说,在语言层面上见到的地址都是虚拟地址。物理地址用户看不到,由操作系统控制,以虚拟找物理。那进程是如何通过虚拟地址查找数据的呢?下面我们来讲解一下。进程地址空间:程序地址空间准确来说应该叫:进程地址空间。当一个可执行程序加载到内存中,创建对应的进程控制块 PCB,也就是 task...

2022-05-30 09:52:47 132

原创 【Linux】子进程的创建、状态

fork() :创建子进程我们都知道,一个可执行程序加载到内存中,就叫做进程,进程执行对应的代码。可以看得出,我们是在执行一个进程,如果想要在该进程中再创建一个进程呢,该如何进行分流。这时了解一下 fork() 函数:fork() 函数使得该进程派生出子进程,两个进程之间是父子关系,和 .bash 是爷孙关系,而 fork() 函数有两个返回值,没错,有两个返回值!!至于为什么,等一下细说。1、那么在 main 函数中,在调......

2022-05-29 12:00:34 560

原创 【Linux】操作系统与进程

外设、CPU 之间的第三者:内存冯诺依曼体系结构:外设只与内存交互,CPU 只与内存交互。内存有什么作用?内存具有数据存储的能力,可以预装数据。在计算机中,每一部外设与 cpu 都遵守冯诺依曼体系结构。问:从外设到 CPU,还要经过内存,岂不是更加慢了?答:不是的,CPU要访问 1 条数据,外设直接给内存装载 100 条数据,这样就只有装载的时候那 1 次满,其余的 99 次都是快。由于三者之间是独立的,在 CPU拿数据的同时,外设可以往内存中装载数据,互不干扰。结论 1...

2022-05-28 09:27:48 441

原创 【Linux】Makefile--自动化项目构建

在构建大型项目时,我们需要对每个 .c 文件进行编译链接,vs 中直接就帮我们生成一个可执行文件,有的文件比较大,可能加载一次就要个把小时,而且我们无法单独一部分生成可执行文件,或者生成多个不同的可执行文件,这时候我们就要用到 Makefile 来创建文件之间的依赖关系,通过依赖关系进行编译链接。建议单独先编译 .o 项目,效率更高。创建 Makefile / makefile 文件,上面是依赖关系,下面是依赖方法,依赖方法前记得一定是 Tab。.PHONY:clean 是什么意思?

2022-05-21 21:18:30 229

原创 【Linux】编译器gcc/g++与调试工具gdb

编译链接过程:一个程序在翻译的过程得经历4个阶段:1、预处理:头文件展开、宏替换、去注释、条件编译(#if / #endif);gcc -E // -o(保存到后序文件中) 生成 .i 文件2、编译:将 C 代码翻译成汇编代码;gcc -S // 生产 .s 文件3、汇编:汇编语言翻译成可重定向目标文件(二进制文件);gcc -c // .o 文件4、链接:生产可执行文件gcc 目标文件动、静态库:gcc 生成的可执行程序文件只有函数的调用,并没有.

2022-05-21 19:37:26 949

原创 【C++】namespace--命名空间

namespace 其实是一个域,它的作用是解决C语言命名冲突的问题例子:int scanf = 10;scanf("%d", &scanf)

2022-05-21 10:24:13 184

原创 【Linux】vim的模式及指令

vim 是 Linux 系统的一种多模式文本编辑器,打开 vim 在底行模式下输入 help vim-modes 可查看所有模式。本次主要介绍3种模式:插入模式、底行模式、命令模式。每次打开 vim 一开始默认是命令模式,它们之间的切换可见下图:命令 -> 插入:-i :光标不移动;-o :新建一行;-a :往右移动一个光标;命令模式命令 :命令模式比插入模式效率高得多。锚点定位:-shift + $ :到行末尾-shift + ^ :到行开头-shif

2022-05-20 19:11:53 679

原创 【Linux】yum -- 软件包管理器

首先,想要再 yum 下载东西需要保证服务器是联网状态,如果用的是服务器,那么连的都是公网,可以用 ping + 网址,看到该网站的信息,想要查看几次就 ping - cn (n次)。yum 中的搜索指令:1、yum list :想要明确查看就 加上 | grep name;ps : 想要进行本地与服务器的文件交互功能,可以下载 lrzsz.x86_64 ,rz-E 是本地 -> 服务器,也可以直接拖拽, sz 是服务器 -> 本地,只传文件非目录。2、(sudo) yum mo

2022-05-19 22:37:43 247

原创 【Linux】文件权限:拥有者、所属组、other

权限介绍

2022-05-18 10:08:51 5192

原创 【Linux】关于基本操作指令的讲解

简介:Linux 操作系统的目录结构和文件组织形式是以多叉树的形式组织的。为什么呢?其实不止是Linux ,许多主流的操作系统都是多叉树结构。它的好处就是:便于查找,且所有的文件都有唯一的标识方式;因为每一个子节点都只有一个父节点,所以从叶子节点到根节点的路径是唯一的,反之,根节点到叶子节点的路径也是唯一的。下面来介绍基本指令:ls 指令 :1、单独 ls :显示当前目录下有那些文件(文件名)。2、ls -l :它可以简写成 :ll ;显示更多属性信息,就...

2022-05-13 07:59:59 671

原创 【C++】哈希概念、哈希表的实现和运用

为什么会产生哈希的概念:给一个常见的数组 { 501 , 502 , 503 , 504 , 505 ... 1000 } ,为了节省空间,一般采用通过相对映射的方式开辟空间,也就是开 500 的空间 ,0 对应 501 ,1 对应 502 ... ,如果要在数组里搜索一个数,它所用到的时间是 O(N),几千几万个数据还好,但是上亿万个数据遇到极端情况就得搜索上亿万次,人们认为所用时间太长了,于是想到一个巧妙的方法,根据一个数组的数量决定它需要开辟的空间,再把其中的值 % 取模,把模后的值填进对应的.

2022-05-03 12:06:12 894

原创 【C++】二叉搜索树之--红黑树

红黑树,是二叉搜索树的一种,它的每个节点只有红色和黑色,从而达到接近平衡的目的。红黑树的性质:·根节点都是黑色节点·每个节点不是黑的就是红的·如果一个节点是红的,那么它的两个孩子都是黑的·不能右两个连续的红色节点·每条路径下,黑色节点的数量都是相等的·叶子节点都是黑色节点(这里指空节点)·根节点到叶子节点最长的路径,最多是最短路径的2倍(最短路径都是黑子,最长路径是一黑一红)红黑树的原理:和AVL树不一样的是,没有平衡因子,而是节点的结构体中添...

2022-05-02 09:56:12 886

原创 【C++】AVL树--平衡搜索树

为什么要用到平衡二叉树: 我们都知道,普通的搜索树在良好的情况下,是一个类似于完全二叉树的树状结构,它所用到的时间复杂度为 O(logN),也就是高度次,但是难免有遇到极端场景,树状就退化成了单支树,这时的时间复杂度就变成了 O(N),严重影响了效率。为了提升效率,让搜索树的时间复杂度达到 O(logN),我们需要使得搜索树达到高度平衡的状态,于是发明了 AVL树,从而达到近似平衡。AVL树的性质:AVL树有以下性质:·左右子树都是AVL树·左右子树的...

2022-05-01 21:13:55 1063

原创 【牛客网】幸运的袋子--深度解剖

题目:幸运的袋子一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。示例1输入:【第一行输入一个正整数n(n ≤ 100

2022-04-18 11:39:01 694 2

原创 【C++】虚函数与多态

上一篇我们留了多继承与虚函数,这次来讲讲,与多态一起协同多继承就是一个子类继承了多个父类,也就是从原来的class C(子类) :public A(父类)变成了--->class C(子类) :public A(父类) , public B(父类)以及菱形继承,菱形继承需要用到虚继承解决本身数据冗余的问题,意识是把多个父类通过虚继承减少所消耗的空间。不过一般不推荐使用菱形继承,感兴趣的小伙伴可以找找相关资料。虚函数是指:被virtual修饰的成员函数,一般父类中拥有一个成员函数

2022-04-11 14:58:09 720

原创 【C++】继承

假设我们有一个对象person,里面的成员变量有个整型age,再创建一个对象student,成员变量是char类型的_name。继承的意思就是在person的基础上,再添加其他的成员,不改变person的成员变量,在一个新的对象里,不仅包含了person的成员,也加上自己的成员变量,从而达到继承的效果。这里的person对象称之为“父类”,而student称之为“子类”。我们可以理解为,儿子继承了爸爸的财产,再发扬光大,获得了爸爸没有的东西,当然,儿子也可以在某一地方选择低调,拥有而不显示。

2022-04-08 20:22:45 1085

原创 oj题:另类加法 -- 个人觉得挺经典的

题目要求计算 1 + 3 = 4,不得用 + 等算术运算符,看着就很难受,第一次做时感觉没有加法真的太难受了。下面我们来解析一下怎么做这道题:首先我们1 和 2 的原码分别是:0000100011分别求出它们的不进位数和进位数:我们先用按位与求出进位数,因为按位与是相同的数为1,不同为0,这样就可以找到两个都为1的位置:a = A & B;00001 & 00011 = 00001这时我们求得的,就是说两个位相等了,1+1,要进位,所以向左移动一位;00001

2022-04-01 16:53:32 675

原创 【Linux】linux 的常见指令,vim,gcc,gdb

---------Linux--------------ls 目录-ll 属性信息-pwd 当前目录-.. 返回上一个目录 -. 当前目录-al 详细目录,属性加文件名-whoami 文件创建者-sudo useradd xxx 创建新用户-passwd xxx-sudo userdel -r xxx 删除用户-^C 停止-yum install -y tree 建立tree命令-mkdir...

2022-03-09 21:46:26 321

原创 【C++】string 的底层实现

首先string的内置成员有:char* _str;size_t _size;size_t _capacity;static const size_t npos;实现的原理有:构造函数: string(const char* str = ""){ _size = strlen(str); _capacity = _size; _str = new char[_capacity + 1]; strcpy(_str, str);}

2022-03-03 21:34:53 1460 3

原创 【C++】malloc/free 和 new/delete 的区别

共同点:malloc 和 new 都是需要在堆上申请空间,且最后需要释放掉,new 只是在 malloc 的基础上初始化了。不同点:1、malloc 和 free 都是函数,而 new 、delete 是类的操作符;2、malloc 申请空间后需要手动初始化,而 new 不用;3、malloc 需要手动计算申请空间的大小,而 new 只用 类型+[大小]即可;4、malloc 在申请时是 void* 类型,需要强转,new + 类型;5、malloc 空间申请失败时返回 .

2022-02-22 22:50:14 438

原创 【C++】string的遍历

string 类有3种遍历方法:1、按下标打印2、迭代器3、范围for1、按下标打印:正常for循环: //1,下标,可以遍历也可以该 for (size_t i = 0; i < s2.size(); i++) { cout << s2[i] << " "; } cout << endl;2、迭代器: //2,迭代器 string::iterator it = s2.begin(); while (.

2022-02-20 15:12:33 5463 4

原创 【数据结构算法】-- C语言

用C语言实现的数据结构算法,下面来一个一个讲解:(Swap函数在末尾,一个换位函数,理解即可)1,插入排序顾名思义就是一个值从前面开始一个一个插入,插入的时候排序一次,有 n 个数就排序 n 次思想简单所以不介绍,代码如下:void InsertSort(int* a, int n){ for (int i = 0; i < n - 1; i++) { int end = i; int tmp = a[end + 1]; while (end >

2022-02-10 23:17:55 760

原创 【数据结构】-- 明解 ‘ 希尔排序 ‘

100年前,人类发明了味精;20年前,太太乐创造了鸡精;xxx年前,希尔创造了希尔排序:希尔排序的思想就是:把一个数组拆分成多个组进行排序,先分组再进行插入排序,然后缩小组间的间隔进行排序,这一步会使得整个数组接近排序,这也称为预排序。其中的组不是连续的数值组成,而是间隔 gap 个后的下一个数值组成。当 gap == 1 时,整个数组已经排序成功。为什么用希尔排序:答案当然是快啦,插入排序的时间复杂度为 O(N^2),而希尔排序的时间复杂度为O(N^1.3—N^2)希尔

2022-02-07 23:05:10 1015

原创 【数据结构】 -- 深究“向下建堆法”的时间复杂度为何是O(N)?

在正常排序的二叉树中,有满二叉树与完全二叉树两种,他们之间相差X个结点。如果我们要继续排序,就要用到大小堆的方法。这里我问一个问题:要建立顺序数组,应该用到哪个堆呢?答案是大堆,而不是小堆!为什么?因为大堆可以把最大值找出来,赋值给新的数组后与最后一个值交换隐藏即可,第二次排序即次大。用小堆的话很难找到最大值,因为左孩子有孩子之间无法排序(按本题思路为前提)。而排序的过程就是建堆,为什么建堆的复杂度是0(N)呢?现在我们来计算一下:我们可以先想象一下最坏的情况,就是满二叉树,每一个结点,

2022-02-03 12:09:57 1225

原创 【数据结构】二叉树的实现--需要时ctrl+c

#include <stdio.h>#include <assert.h>#include <string.h>typedef char BTDataType;typedef struct BinaryTree{ struct BinaryTree* left; struct BinaryTree* right; BTDataType data;}BTNode;//初始化BTNode* BTCreate(BTDataType x){ B..

2022-02-02 22:47:34 660

原创 【数据结构】堆 -- 大堆小堆

堆的物理结构其实是数组,逻辑结构则是二叉树。堆的调整算法有多种,其中典型的是:大堆 和 小堆。小堆的意思就是:父亲位,比孩子位,要小;大堆:父亲位,比孩子位,要大。下面我们来用图说明:给一组数组:int a[] = { 27,15,19,18,28,34,65,49,25,37 };按照小堆的方式来排序:由于我们父亲的两个孩子位都是小堆排序,所以我们可以直接从头开始进行一次排序即可。#include <stdio.h>void Swap(int* pa,

2022-02-01 15:35:52 2904

原创 【数据结构】双向链表的实现

本次双向链表分为2个源文件、1个头文件:test.c#include "DList.h"void Teat1(){ ListNode* plist = ListInit(0); ListPushBack(plist, 1); ListPushFront(plist, 2); ListNode* pos = ListFind(plist, 1); ListInsert(pos->prev, 3); //ListPopBack(plist); //ListPopFron

2022-01-28 17:13:38 710

原创 【数据结构】oj练习

1、合并两个有序链表:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) { if (list1 == NULL) return list2; if (list2 == NULL) return list1; struct ListN..

2022-01-25 23:51:46 292

空空如也

空空如也

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

TA关注的人

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