自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mysql 数据库 关于库的基本操作

如果想到 mysql 客户端当中数据 系统当中的命令的话,直接输入的话,会被认为是 mysql 当中的命令。所以,在mysql 当中执行系统当中的命令的话,要在系统命令之前带上 ststem ,表示系统命令: 但是不是所有命令都是可以使用的,只能使用部分命令。说明: IF NOT EXISTS : 表示的是 如果当前没有这个要创建的数据库,才会对这个数据库进行创建。创建名为 db1 的数据库: 其实上述创建数据库的本质其实就是在 指定存储数据库文件的目录当中,创建一个目录。 删除一个数据库:

2023-12-15 15:09:40 1203 6

原创 Linux - 进程间通信(中)- 管道的应用场景

在上篇博客当中,对Linux 当中的进程通信,做了详细阐述,主要是针对父子进程的通信来阐述的同时,也进行了模拟实现。对于管道也有了初步了解,但是这仅仅是 进程间通信的一部分,Linux 当中关于进程间通信还有很多的内容,这篇博客将会在上篇博客的基础之上,继续阐述进程间通信。

2023-12-12 22:53:02 966 3

原创 初始数据库 - 了解数据库

上述我们简单的新建了一个数据库,然后在这个数据库当中建立了一个表,然后对于这个表当中的一个一个对象进行了一个访问查找的操作。所以,其实本质上,我们新建一个数据库本质上就是在创建一个目录,在这个目录当中有一个数据库的配置文件,在这个数据库目录当中,我们新增一个 表其实就是 在这个数据库目录当中新增一个 几个文件。对于上述的 数据库目录,和 目录当中管理着各个表的 文件,其实都不是有 用户 或者是 程序员去做的;

2023-12-12 22:52:46 1108

原创 leetcode - 矩阵区域和

上述就是递归公式,但是 dp[x2][y2] 不是在 dp 这个 二维前缀和数组当中的,这个位置是没有 数据的,所以,其实这个位置的数据是在 mat 当中的。在上述计算出递推公式之后,就可以开始计算上述的 x1 y1 和 x2 y2 了。新返回的矩形当中,应该存储的是上述 绿色区域当中的全部的 元素之和。所以,我们可以利用二位矩阵的前缀和 来解决上述的问题。所以,上述就计算出了存储前缀和的二维数组。是所有满足下述条件的元素。使用黑色位置存储元素值。

2023-12-03 19:50:44 594

原创 Linux - 动态库的加载 和 重谈进程地址空间 - vscode 当中的 Remote - SSH 插件

在上篇当中,末尾,我们对动态库是如何做到被所有进程共享的?这个问题,进行了浅述,和 动态库当中的 数据存储,其实也是按照谁先修改数据,谁就进行写时拷贝的方式,来共用动态库当中数据的。具体请参考上述博客:Linux - 动静态库(下篇)-CSDN博客。

2023-12-02 12:15:36 1242

原创 Linux - 进程间通信(上) - Linux 当中的管道

管道是Unix中最古老的进程间通信的形式。因为Linux本身就是一种类UNIX操作系统。所以,UNIX 支持 管道,Linux 也支持管道。我们把一个进程 把数据 写到 另一个进程的数据流称之为 --管道。

2023-12-02 12:15:16 1135 1

原创 Linux - 动静态库(上篇)

不管是操作系统对于进程之间的管理,还是 对于文件的访问和修改等等的操作,都是要把数据加载到内存当中的,所以,所有的工作都离不开 内存管理模块。内存的本质其实是对数据的一种临时存储,可以把 内存看做是一个 加载 外存 和 cpu / cpu 寄存器之间的一个 数据的缓冲区。当我们要从外设当中,比如是 磁盘当中访问的修改数据的话,需要把数据加载到内存当中。

2023-11-28 10:06:22 907 4

原创 Linux - 动静态库(下篇)

静态库 只需要在 编译时期 ,可以找到这个 静态库在哪,把这个静态库当中的数据,拷贝到 对应源程序当中。但是动态链接不一样,如果要是用到 动态库的话,动态库就需要再 内存当中被加载,从而执行。而 静态库是不需要 加载到内存当中执行的,它完成了 拷贝的工作就可以 下岗了,在当前可执行程序的链接就不需要他了。在上述说明的 四种 可执行程序链接 动态库 的方式的当中,其实用得最多就是拷贝这种方式。因为这种方式最直接了当,你会发现,这种方式其实是最方便的。

2023-11-28 10:06:11 1199 3

原创 leedcode 刷题 - 除自身以外数组的乘积 - 和为 K 的子数组

如果我们像计算题目描述的某个位置(比如是 i 位置)的 前缀积 和 后缀积的话,只需要计算 f[i] * g[i] 既可,因为 f[i] 表示的就是 i 之前的 所有积,g[i] 表示的就是 i 之后的所有的积。还有一种情况,当 当前的整个的 前缀和 等于 k 的话,那么,在上述的算法当中,其实我们是找不到这个情况的,因为 我们找到的是 等于 k 的子区间,这个子区间的起始位置上述说过了,是 j ,那么 满足。我们需要找到一个 符合要求的最长的连续的子数组,返回这个子数组的长度。

2023-11-24 09:07:06 904 5

原创 Linux - 文件系统 - 理解目录 - 理解 软/硬链接

在上篇博客当中,我们对 文件系统 和 inode 做了初步了解,本博客将在上篇博客的基础之上,对于 文件系统当中的目录进行进步一阐述。

2023-11-24 09:06:52 1393

原创 Linux - 进一步理解 文件系统 - inode - 机械硬盘

在上一篇博客当中,已经对 用户级缓冲区 和 系统缓冲区 的区别,和 初步认识 C 库函数 封装的 文件接口这些做了阐述。本博客将在上篇博客的基础之上,对 Linux 当中的 文件系统进行进一步理解。当前 很多 用户级笔记本电脑,使用的都是 SSD 的 固态硬盘,而在可能 10 年之前,很多计算机使用还是 磁盘这种硬件设备来 存储 数据。我们所熟知的 机械硬盘 和 磁盘是同一个概念,机械硬盘是一种使用磁盘作为数据存储介质的计算机硬件设备。

2023-11-19 13:18:28 437 8

原创 Linux - 用户级缓冲区和系统缓冲区 - 初步理解Linux当中文件系统

当。

2023-11-16 21:54:30 410 3

原创 leetcode - 串联所有单词的子串 - 最小覆盖子串 - x 的平方根

所以,在 存储我们找出的子串当中 各个字符出现次数 的 hash 表当中,依旧按照 滑动窗口 当中的逻辑,进行 计数,只不过,如果是 和 目标字符 hash 当中有重复的,也就是当前的 计数器++ 的是 有效字符,那么就 count++。而且,在这个题目当中,滑动窗口的 起始位置可能不是 从数组的最开始位置开始的,可能从 第二,第三··· 都有可能,但是,如果超过了 words 数组当中一个子串的 大小,那么后续就会是重复的。就是在我们所寻找的子串当中,有多少 种类 的字符,是和 目标字符是 一样的。

2023-11-16 21:54:18 267 2

原创 如何理解 Linux 当中 “一切皆文件“

操作系统为了能更好的管理这些个 外设,和 软件,都会为这些 设备 创建一个 描述方法,就是使用 struct 结构体来把这些设备的各种属性 保存起来,方便管理,管理的方式也简单,就是利用某种数据结构,把这些个 设备的 结构体对象按照某种算法链接起来,这过程叫组织。以后,只要是 要打开一个文件,除了会创建这个 文件的 文件结构体对象之外,还会创建一个 方法集合(函数集合)的 结构体,在这个结构体当中存储的是 这个外设的各种对应 方法(函数)的。所以,在冯诺依曼体系结构当中的外设,都是有自己的 读写方法的。

2023-11-14 20:01:20 362 3

原创 leetcode 刷题 - 最大连续1的个数 - 将 x 减到 0 的最小操作数 - 水果成篮 - 找到字符串中所有字母异位词

不需要再像 暴力解法当中 一个子串一个子串的 暴力枚举,因为 在包里枚举的过程当中,区间是一直向后走的,在暴力解法子串区间向后迭代的过程当中,我们发现,left 向后迭代之前 指向的 元素被 移除的,而 right 新变量的 字符是被添加的,而在 left 和 right 之间的字符 和 字符出现次数(也就是 在 left 和 right 之间 没有被 left 丢弃 和 right 变量的字符 和 字符出现次数) 是不变的。所以,进窗口 其实就是 hash 表当中 对应映射位置的 计数器++;

2023-11-14 20:00:36 224 1

原创 Linux - 基础IO(重定向 - 重定向模拟实现 - shell 当中的 重定向)- 下篇

上述我们已经介绍了 输入/输出重定向 的简单实现,所以,在shell 当中,其实这些 输入/输出重定向 命令是属于 内建命令,直接在内建命令当中 判断 类似 ">>" ">" ">" ">" ">" ">" "

2023-11-12 16:37:07 442 4

原创 leetcode 刷题 - 有效三角形个数 - 长度最小的子数组 - 无重复字符的最长子串

我们先要找出 一个字符串当中的所有子串,其实就是那一个 字符做开头,后序的一个字符一个字符的和之前的字符就链接,就可以构成一个子串,当链接到最后一个字符之时,说以这个字符开头的 子串已经枚举完毕了。那么,要判断出 每一个满足条件的子串,就把寻找一次子串 保存一个子串当中的字符,把这些字符保存到 hash 表当中,如果后续在链接子串的过程当中 链接到了 hash 当中有字符,说明这个字符已经不满足条件了。上述只是伪代码,只是表示一种思路,但是你也看出来了,这个时间复杂度非常高,不推荐。

2023-11-10 16:57:42 192 2

原创 Linux - 基础IO(Linux 当中的文件,文件系统调用接口,文件描述符)- 上篇

pathname: 要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开上述这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写返回值:成功:新打开的文件描述符失败:-1。

2023-11-10 15:12:50 727 1

原创 Linux - 实现一个简单的 shell

所以,当系统运行起来的时候,或者说我们进行登录的时候,系统就是要运行一个 shell 程序。比如在 Linux 当中就是 bash 命令行解释器。而 ,我们知道 各个进程的 环境变量是来自于 bash 父进程的,那么 bash 的环境变量从那里来呢?其实在 自己用户,当前的工作目录下,有一写配置文件,如 Linux 当中这个文件当中:所以,当用户登录的时候,shell 会读取当前用户目录下的 .bash_profile 这个配置文件在个文件当中存储了环境变量导入到方式。

2023-11-08 21:15:31 1007 3

原创 Linux - 进程程序替换 - C/C++ 如何实现与各个语言之间的相互调用 - 替换环境变量

上述所说的 excel ()函数只是其中之一,实现进程替换的 exce*() 系列的函数还有很多:上述七个是在 3 号手册当中的,在 2 号手册的当中还有一个 函数被单独拿出来了:这些函数都是以 exec 开头的。其实 在 exec*()系列的 函数当中,"l" , "v" , "p" , 这些后面的不同组合的名字就代表了不同的 使用方式,一个字母代表的是一种使用方式。所以,对于这七个函数的使用,只需要按照这些不同的 字母 代表的意思来使用即可。

2023-11-08 09:22:10 260 1

原创 Linux - 进程控制(下篇)- 进程等待

此时,我们再使用。

2023-11-04 12:43:23 302 7

原创 Linux - 进程控制(上篇)- 进程创建 和 进程终止

对于进程的创建,你肯定知道,在 C/C++ 当中使用 fork()函数,以当前可执行程序生成的进程为 父进程,创建这个父进程的 一个子进程,这个 子进程就是一个新的进程。如上图所示:刚开始创建出子进程之时,甚至父子进程的 页表 ,数据 和 代码都可以是共用的,当 子进程 有修改操作之时,才会发生写时拷贝,拷贝子进程修改之后需要有用到的数据。当父进程 执行到 fork()函数之时,就会在内核当中去找到 fork()函数定义,调用 fork()函数创建子进程,此后,就从fork()函数之后,父子进程就会各自执行

2023-11-04 12:43:19 513

原创 Linux - 进程地址空间

地址空间的本质,其实是以进程的视角,来对内存进行划分的,其实也就是我们说的在 内存当中的离散存储。在计算机当中有很多的 设备,把这些各种设备连接起来,那么设备和设备之间,内存和外设之间,cpu和内存之间,一定要做到数据的交互。那么这些个设备要进行数据的通讯,就要用“线”来连接起来。这些“线”实际上可以划分成三类:地址总线,数据总线,控制总线。cpu 和 内存之间连线的叫做系统总线;内存和外设之间连接叫做 IO总线。我们需要这些先,把数据从一个设备拷贝到另一个设备当中。

2023-10-31 22:22:47 227 6

原创 Linux - 环境变量 - 常规命令 和 内建命令

环境变量是有系统提供的一组 name = value (键值对)形式的变量,不同的环境变量有不同的用户,通常具有全局属性。环境变量 一般是指在操作系统中用来指定操作系统运行环境的一些参数。

2023-10-29 12:03:13 394 7

原创 Linux - 进程的优先级 和 如何使用优先级调度进程

在Linux 当中,一个进程的 PCB 不会仅仅值存在一个 数据结构当中,他既可以在 某一个队列当中,又可以在 一个 多叉树当中。队列比如 cpu 的 运行队列,键盘的阻塞队列等等的双线链表当中。而多叉树就本篇博客需要阐述的 进程优先级了。如何实现的其实也很简单,就是在一个 PCB 结构体对象当中,不仅仅只有 双链表的 prev 前序结点指针和 next 后继结点指针;还有 多叉树当中的 比如 parent 父亲结点指针,和各个孩子的指针。

2023-10-26 17:09:32 422 3

原创 Linux - 进程状态 - Linux 当中的进程状态是如何维护的?

一个进程在 系统当中有很多的状态,比如:一个进程正在被cpu执行,那这个进程就是一个 r 状态;一个进程已经准备好了,但是其中的运行这个进程需要的资源没有准备好,那么这个进程一人不能运行。比如 在一个程序当中有一个 scanf()函数,当你 执行这个程序之后,那么这个程序就变成一个 进程了,但是,在当 scanf()函数执行开始时候,你一直没有输入数据,那么这个进程就会一直等待你输入的数据,那么此时这个进程有没有被 cpu 执行呢?肯定是没有的,因为这个进程一直等不到 你输入的数据。

2023-10-26 08:50:47 509 6

原创 进程 概念和理解 - Linux 是怎么做到 管理进程的?-fork 手动创建进程

所以,一个内核PCB数据结构对象不叫进程;一个code & data (文件二进制数据(代码和数据))也不叫进程,这两个 加起来 才叫一个进程。操作系统会把一个 PCB 和 一个 code & data(文件二进制数据) 构建成一个 结构体对象,这个结构体对象是由操作系统自己生成的。所以,操作系统要管理这个进程,根本就不看 这个进程的 代码和数据,只看 PCB对象当中的属性就行了。

2023-10-24 12:13:16 380 10

原创 冯诺依曼体结构 - 为什么要有操作系统

我们现在常见的 计算机,如 笔记本电脑,或者是不常见的 计算机,如服务器,大部分都遵循一个体系结构 -- 冯诺依曼体系结构。计算机的基本构成 就是由 冯诺依曼体系结构 来构成计算机的基本单元的。而,冯诺依曼体系结构非常的简单,就是由输入设备输入数据,保存到 存储器当中,然后将数据读取到 运算器当中,进行逻辑运算,再把运算结果 写会到 存储器当中,输出设备就可以从 存储器当中读取数据进行输出操作。这就是 冯诺依曼最基本的 操作流程,如下图所示:上述就是冯诺依曼体系结构。

2023-10-22 09:43:24 315 13

原创 Linux - 还不懂 gdb 调试器?(调试软件)

gdb 当中还有很多命令,像 b 命令打断点,可以用b 文件名:行号给指定可执行文件的行号位置处打上断点。而b 函数名这种方式打出的断点,本质是就是在函数体的起始位置处,也就是函数体的第一行代码当中打上断点:list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。list/l 函数名:列出某个函数的源代码。r或run:运行程序。n 或 next:单条执行。s或step:进入函数调用break(b) 行号:在某一行设置断点。

2023-10-20 14:16:17 944 8

原创 C++当中的IO流介绍 - operator 类型()的特殊用法

我们这里就直接使用 fstream 来演示了。这种方式就和 C语言当中的使用方式是类似的,open()函数的第一个参数是 文件名,支持用 C 当中的字符串的形式传入,也支持使用 string 对象的方式传入;第二个参数是文件使用的方式,这个就和C 当中的使用方式是一样的了:除了可以使用 C当中 类似 'r' 'w' 这样的方式来确定读取文件的方式,还可以使用 C++ 当中独有的方式,具体请看下面一种方式 当中的详细介绍。

2023-10-19 16:02:21 301 4

原创 C++ - 类型转换 - static_cast - reinterpret_cast - const_cast - dynamic_cast

其实在 C语言当中就已经有了类型转换,只要是。在C 语言当中,总共有两种类型转换方式:隐式类型转换:编译器在编译时期自动进行,如果能转换就转换,如果不能转换就报错。显示类型转换(强制类型转换):需要用户自己进行处理。对于,或者说是,可能进行。比如:像 double ,int , char , shrot 等等这些整形家族是可以发生隐式类型转换的;整形 和 指针类型也是可以的,因为 指针存储的是地址,地址是编号,是 四个字节存储的十六进制的数。还有,单参数的构造函数也支持隐式类型转换。

2023-10-18 10:49:54 240 2

原创 C++ - 一些特殊类的设计

在 类当中重写是是实现 这个类的专属 的。

2023-10-17 15:28:43 198

原创 C++ - 智能指针的定制删除器

在上一篇C++ 文章当中,对 智能指针的使用,做了很详细的介绍,对 C++11 和 C++98 库当中实现的一些常用智能指针做了很详细的介绍,但是智能指针的使用还有一些拓展用法。

2023-10-16 20:16:30 295

原创 C++ - git 命令行

你很可能遇到过这种情况,在写项目的时候,要我不符合 leader 的要求,因而修改了很多个版本,但是修改到最后一版的时候,leader 有觉得当前这版还没有之前 某一版好,现在又要求你在 之前的那一版上进行一些修改然后就提交;但是 , 对于leader需要的那一版的具体细节你也记得不是很清楚,也不好直接修改回去。所以,你就在电脑当中创建了一个文件夹,里面存放的都是你修改过的代码不同版本的文件,我们把这个文件夹叫做本地仓库。

2023-10-13 18:00:18 522 1

原创 Linux 编写一个 简单进度条

回车换行理解:就和一起打字机一样:在打字的时候,有一个 负责打印印刷在纸上的机器,是跟随者使用人打印文字,往有迭代走的,当这个机器走到 最右边的时候,或者使用人想要再次换行的时候,使用人机会把这个机器从最右边 手动 移动到 最左边,这个过程就和上述的 "r " 换行一样。而且在换行的时候,纸还会往上走,这个过程就相当于是 回车了。

2023-10-13 10:58:04 204 3

原创 Linux - make命令 和 makefile

作。makefile 相对与 vim来说,他可以实现--“

2023-10-12 19:14:10 331 1

原创 C++ - 智能指针 - auto_ptr - unique_ptr - std::shared_ptr - weak_ptr

Boost库_百度百科 (baidu.com)他其实是在 C++11 出来之前,由 C++委员会当中的一些成员,创建了 Boost 库社区,在这个社区当中探索出了很多 有用的语法,比如:右值引用,等等。在 boost 库当中也诞生了 更好的 智能指针:C++11 当中相当于是沿用了 boost 库当中的一些智能指针,进行了一些细节上的修改,基本上属于是 cv了。

2023-10-11 17:47:51 167

原创 C++ - 包装器 - bind()函数

在 C++ 当中可能会有各种各样的可调用类型,比如 函数指针,仿函数,lambda 等等,那么这么多的可调用类型,我们在使用的时候就会犯迷糊,那可不可以统一控制一下呢?function包装器,也叫做适配器。我们先来看一个例子:上述有三种调用方式,分别是:函数指针,仿函数 和 lambda表达式。每一个 不同类型的 函数,在同一个 函数模版当中会实例化出 三份 函数,因为 f 这个变量,接收的是 可调用对象,三种不同的可调用对象的传入,可能是要实例化出 不同的函数出来的,所以,对于上述 static 的

2023-10-10 20:39:02 630

原创 C++ - 可变模版参数 - emplace相关接口函数 - 移动构造函数 和 移动赋值运算符重载 的 默认成员函数

如上图所示,

2023-10-09 21:05:29 346

原创 C++ - 完美语义(右值引用的中篇) - lambda表达式

之前对右值引用的理解,用使用场景做了详细说明,具体看博客:C++ - 右值引用 和 移动拷贝-CSDN博客在 有值引用 当中还有一个 完美转发,请看本篇博客。 我们现在看这个例子: 上述当中的 PerfectForward(a); // 左值 当中,a 是一个左值,但是 PerfectForward()这个函数的参数类型是 T&& t 是一个 右值引用,按照上一篇博客当中对右值引用的介绍,右值引用是不能引用左值的,应该会编译报错。但是,实际上是没有编译报错,编译通过。 其实,原因是 T&& t

2023-10-09 08:47:49 199

空空如也

空空如也

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

TA关注的人

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