自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】HTTP 协议

HTTP 请求由 请求行(request line), 请求头部(header), 空行和请求数据 四个部分组成;那么就可以将浏览器视为客户端, 编写服务器, 通过 URL 的方式, 接收浏览器的 HTTP 请求;协议版本: 协议的版本, 如 HTTP/1.0, HTTP/1.1, HTTP/2.0 等;协议版本: 协议的版本, 如 HTTP/1.0, HTTP/1.1, HTTP/2.0 等;包含服务器返回的数据, 如请求的网页内容, 图片, JSON数据等;状态码: 三位数, 表示请求的处理结果;

2024-07-22 15:14:21 555

原创 【Linux】socket 套接字 / 序列化与反序列化

由于上文中的协议关于简单, 并且 TCP 协议 不同于 UDP 协议, UDP 协议是面向数据报的, 当多次发送时, 发送的是多个数据报, 并不影响接收或读取;客户端的启动只需要从用户输入获取数据, 发送至服务端, 获取结果即可, 套接字同样可以使用 write(), read() 进行通信;通过 accept 可以得知, 服务端一开始初始化的套接字并非用于通信, 而是处理连接请求的, 也被称为监听套接字;上文 计算器的输入和输出的规定, 就类似协议, 只有按照特定的格式输入或读取, 数据才是有效的;

2024-07-20 19:08:43 657

原创 【Linux】网络地址 / socket 套接字

当主机B 与主机A 在同一局域网内进行通信时, 主机A 通过目标主机 IP 地址 和 ARP 协议获取主机B 的 MAC 地址, 将 IP, MAC 地址封装在帧中发送出去;当路由器收到数据帧后, 将数据帧的 源 MAC 地址修改为自身, 目的 MAC 地址修改为主机B 的 MAC 地址, 转发至主机B;在此次通信中 MAC 地址会发生改变;主机A 就会获取路由器的 MAC 地址, 将当前 IP 和 MAC 地址为源, 主机B 的 IP 和 路由器的 MAC 地址为目的, 封装数据帧 转发至路由器;

2024-07-09 14:44:45 628

原创 【MySQL】函数

substring(str, position [, length]), 从 str 的 position 开始, 向后截取 length 个字符, 下标从 1 开始, length 默认为字符串长度;conv(number, from_base, to_base), 将 number 从 from_base 进制转换成 to_base 进制;sha(), sha1(), 两者等效, 返回给定字符串的 SHA-1 160 位校验和, 可以代替 password(str);否则返回第二个参数值;

2024-06-11 17:22:00 846 1

原创 【MySQL】表的增删查改

MySQL 中, 可以使用 update 语句修改表中的数据, update 同样支持 where 条件, order by, limit 选项;MySQL 中, 可以使用 delete 语句删除表中的数据行, 同样支持 where 条件, order by, limit 选项;order by 排序, 可以根据指定的一个或多个字段进行升序或降序排序, asc 为升序, desc 为降序, 默认为升序排序;全列查询, 但通常不建议使用, 查询的字段越多, 需要传输的数据量越大, 可能会影响索引的使用;

2024-06-06 16:01:09 980

原创 【MySQL】表的约束

为 t1 表的 num5 字段插入数据, 并创建 t2 表, 建立从属关系, 设置 num5 为主键字段, num6 为外键字段;真正约束字段的是数据类型, 但关于单一, 所以需要一些额外的约束, 满足不同的场景;修改 num1, num2, num3, num4 字段, 添加唯一键;向表中插入数据时, 不可为空且默认值为空的字段是不能被忽略的;向其插入数据, 不可为空的字段中是不能插入空值的;向表中插入数据, 主键的数据是不能重复, 为空的;表的约束保证插入的数据是合法的, 符合预期的;

2024-06-04 18:52:07 1095

原创 【MySQL】数据类型

若在 set 中查询元素, 可以使用 find_in_set(val, set) 元素, 若查询成功, 返回其下标, 若失败, 返回 0;其中, float(4, 2) 中的 (4, 2) 表示当前浮点数支持显示 4 位, 且小数精度为 2 位, 数据范围则为 [-99.99, 99.99];需要注意的是, 位字段类型 (m) 限制的是比特位的长度, 而非位数, 所以向 b1 插入 2 将会失败, 2 的二进制为 0010, 超出了范围;) 除了大小, 其他都和 int 的相同, 都适用于不同场景中;

2024-06-03 20:08:21 1104

原创 【MySQL】库和表的操作

在 d1 数据库中创建 t1 表, 插入大写和小写的数据, 并查询小写数据, 结果大写和小写字母全部打印;数据库的修改主要是数据库的字符集和校验规则, 但数据库的修改不会影响数据库中已有表的字符集和校验规则;创建 d1 数据库, 使用 utf8mb4_0900_ai_ci 校验规则, 不区分字母的大小写;在 d2 数据库中创建 t2 表, 插入大写和小写的数据, 并查询小写数据, 只有小写字母打印;数据库的更名方法推荐备份数据, 新建数据库(更名), 导入数据的方法, 并且轻易不要改名;

2024-06-02 17:49:25 667

原创 【MySQL】数据库基础

数据库的本质是一种基于 CS 模式的网络服务, 由客户端 (Client )和服务器 (Server) 组成, 用户只需使用客户端 MySQL 发出 SQL 语句, 服务器 mysqld 就会读取数据并处理请求, 数据库的可以存储在磁盘或内存上;数据库是按照数据结构来组织, 存储和管理数据的仓库;是一个长期存储在计算机内的, 有组织的, 可共享的, 统一管理的大量数据的集合;在 MySQL 中, 一切的数据都是以行和列, 也就是表的形式表示的, 表是 MySQL 中最常见, 最常用的结构;

2024-06-02 17:48:27 853

原创 【Linux】线程同步和生产者-消费者模型

假设有两个线程 A, B 和一个缓冲区;A 线程向缓冲区中写入数据, B 线程从缓冲区中读取数据, 这就是一个简单的生产者-消费者模型, A 为生产者, B 为消费者;

2024-05-23 19:23:02 997

原创 【Linux】线程互斥

即便是在多处理器环境下(总线只有一套), 访问内存的周期也有先后, 一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期, 即 swap 和 exchange 指令在多处理器环境下也是原子的;线程在访问临界资源之前, 需要使用同一把锁进行加锁申请, 只有申请成功的, 才可以访问临界区, 操作临界资源, 并且在操作完成后, 对当前互斥锁进行解锁;swap 或 exchange 指令决定着加锁的成功与否, 使得在进行 al 寄存器判断时, 所有线程只会有一个线程为真, 保证原子性;

2024-05-18 15:25:18 891

原创 【Linux】线程控制

数据 IO 通常是以块为基本单位的, 一个块的大小为 4KB(在文件系统中, 一个块由磁盘的8个扇区组成, 单个扇区大小通常为 512Byte), 所以内存实际上也是以块(4KB)为单位划分的, 这种以块划分的区域被称为页框(页帧);线程: 在进程中额外创建线程的结构 TCP, 其保存当前进程的虚拟地址空间等资源, 多个线程共享同一份虚拟地址空间, 页表, 代码和数据等进程的资源, 使得操作系统减少进程创建和调度的成本;当次线程终止时, 由操作系统释放次线程的资源, 主进程无需等待次进程, 避免阻塞等待;

2024-05-14 19:06:20 793

原创 【Linux】信号的保存及处理

自定义捕获 2 号信号, 并且设置 sa_mask 屏蔽 3 号信号, 当进行 2 号信号的处理动作时, 3 号信号会被堵塞, 保留在 pending 表中, 直至 2 号信号的处理动作结束, 才会递达 3 号信号;但在 Linux 上, 操作系统还做了一种特殊处理, 当用户显示的将 SIGCHLD 的处理动作置为 SIG_IGN 时, 子进程在退出时, 将会由操作系统对其负责, 自动清理资源并进行回收, 不会产生僵尸进程;当用户态的进程被调度(时间片), 系统调用, 中断时, 会切换至内核态执行;

2024-04-25 19:57:31 665

原创 【Linux】信号的产生

由于进程依旧运行, 并且 CR2 寄存器依旧为异常状态, 那么操作系统会轮询式的发送异常信号至进程, 直至异常被处理或终止.由于进程依旧运行, 并且状态寄存器依旧为异常状态, 那么操作系统会轮询式的发送异常信号至进程, 直至异常被处理或终止.信号是以位图的形式保存在 task_struct 的 pending 中, 当进程接受到信号时, 进程会将信号对应的位置设置为 1 即可;信号随时都可能产生, 是异步发送的, 所以进程并不会立即处理信号, 进程会在合适的时间进行统一处理;

2024-04-24 19:23:57 1065

原创 【Linux】进程间通信 -- 共享内存

ftok() 函数使用给定的路径 命名文件标识(必须引用一个现有的,可访问的文件)和 proj_id 的最低 8 位(必须为非零)来生成 key_t 类型的 System V IPC 密钥,适合用于 msgget(2), semget(2),或 shmget(2)。它可以用于获取先前创建的共享内存的标识符(在 shmflg 为 0且 key 的值没有 IPC_PRIVATE时),也可以用于创建一个新的集合。当使用相同的 proj_id 值时,对于命名相同文件的所有路径名,结果值是相同的。

2024-04-17 16:43:37 947

原创 【Linux】进程间通信 -- 管道

进程间通信 (Inter-Process Communication, 简称 IPC) 是多进程协作的基础, 当进程之间需要交互, 协同完成一件事时, 就需要进程通信.由于进程之间是相互独立的, 所以需要操作系统提供一份公共的空间或资源, 使得进程可以从公共空间或资源读写数据, 所以进程通信的本质是 操作系统提供一份不同的进程都可以访问的资源.

2024-04-12 14:28:26 722

原创 【C++】异常

由于 C++ 标准库的异常体系并不能满足需求, 所以可以根据需求自定义异常体系.

2024-04-11 14:20:00 706

原创 【Linux】软硬链接 / 动静态库

硬链接(hard link) 可以将它理解为原始文件的别名, 和原始文件使用相同的 inode 编号和 data block.(inode 是文件在该磁盘分区内的唯一标识, 记录着文件的属性等内容;动态链接解决了静态库空间浪费的问题, 可执行程序只需要保存库函数的偏移量, 在运行时通过动态库加载至共享区中的虚拟地址和页表的映射, 就可以调用库函数;软链接 类似 Windows 系统下的快捷方式, 是一个的全新的文件, 并且文件类型为 ‘l’ (链接属性), 内容仅包括所含链接文件的路径名字.

2024-04-05 17:27:06 699

原创 【C++】lambda 表达式 / 包装器 / bind 绑定

lambda 表达式的类型是由编译器自动生成的, 并且带有随机值, 是无法具体的写出 lambda 表达式的类型, 并且 lambda 表达式是一个匿名的函数对象(匿名对象生命周期只有一行), 若不立即使用 或 使用 auto 推导赋值给对象, 则会销毁.包装器是一种特殊的类模板, 是适配器的一种, 可以将相同或类似使用方式, 但类型不同的对象, 包装为同一类型, 使其可以达到类似回调函数的效果.下列的函数, 仿函数, lambda 表达式的使用方式相同, 但却会实例化出不同类型的 useF() 函数.

2024-04-02 21:09:43 869

原创 【C++】右值引用 / 完美转发 / 模板的可变参数 / emplace 系列函数

forward 函数, 也就是完美转发, 可以保持参数原有的类型属性. 若参数的类型属性为右值, 在右值引用后, 失去的右值的特性, 那么使用 forward 函数可以使引用恢复参数的右值属性.而对于将亡值, 例如匿名对象和临时对象, 它们的生命周期只有 “一行”, 若想保留其中的数据就必须拷贝其数据, 使用右值引用就可以将数据转移到特定空间, 就可以减少拷贝的消耗, 提高效率.就是当模板类型或 auto 等类型推演时, 使用右值引用的语法, 那么可以不仅可以表示右值引用, 也可以表示左值引用.

2024-04-02 15:47:48 1046

原创 【C++】C++11的新特性

由于 C++11 之前空指针 NULL 被定义成字面量 0, 在传参等情况会导致二义性, 所以在 C++11 中新增了关键字 nullptr, 用于表示空指针.增加强制生成和强制禁止生成默认函数的关键字 default 和 delete;而底层使用的就是迭代器, 所以支持迭代器的容器就会支持范围 for.继承和多态部分增加 final 和 override 关键字.范围 for 的功能就是遍历容器并取出所有的元素;默认成员函数增加了移动构造和移动赋值;新增了 const 迭代器的接口.

2024-03-31 20:21:57 1030

原创 【C++】位图和布隆过滤器

位图是一种高效的且占用内存很小的数据结构, 也是一种哈希思想的应用, 和散列表不同的是直接使用比特位的 0 / 1 来表示对应键值的状态.不同的是, 布隆过滤器使用多个哈希函数, 将一个数据映射到位图中的多个位置中, 降低哈希冲突的概率.使用两个位图, 分别将两个文件中的数据映射在位图中, 两个位图同时遍历, 返回同时存在的数据即可.在这里可以布隆过滤器的过滤的特性, 可以快速的过滤掉不存在的值, 而存在的值需要进一步判断.使用同一组哈希函数的布隆过滤器可以进行字符串的 交集, 并集, 差集运算.

2024-03-26 22:00:58 848

原创 【C++】哈希

当 const_iterator 迭代器参数传进来时, It的类型就会变成普通迭代器 HBIterator, 就可以达成使用 iterator 迭代器类型构造 const_iterator 迭代器类型.开散列又叫链地址法(开链法, 哈希桶), 即存储位置存放的是单链表, 多个键值可以映射相同的哈希值, 数据直接插入链表中即可, 查找时遍历链表查找.: 不是一个固定的函数, 只要符合哈希的映射思想, 可以建立映射关系的函数, 都可以被称为是哈希函数.

2024-03-20 23:52:05 712 1

原创 【C++】红黑树

每一个节点会增加一个存储位表示节点的颜色, Red或者 Black;每次插入节点时会根据自身性质调整, 保证每条从根节点到叶子节点的路径上的黑色节点数目相同;最长路径的红色节点和黑色节点数目相同, 最短路径只有黑色节点, 确保没有路径会超过其他路径的两倍, 近似平衡.

2024-03-13 17:27:31 815

原创 【Linux】系统I/O调用和文件描述符

每当 open() 函数新打开文件时, 操作系统会创建新的 struct file 结构, 进行文件管理, 而地址会被存在 struct file *fd_array[] 的数组中, 最后返回数组下标.注: 文件描述符(fd)默认从 3 开始. 0, 1, 2下标的地址分别指向标准输入(键盘), 标准输出(显示器), 标准错误(显示器), 是系统默认打开的.使用 open() 函数创建文件时, 必须指明文件权限. 所以当 文件打开方式包含创建文件时, 需要设置mode参数.count: 需要写入的字节数.

2024-02-15 13:29:56 914 1

原创 【C++】多态

一. 多态概念: 就是当不同的对象去完成某个行为, 完成时会产生出不同的状态.例: 这里 print() 函数会根据对象不同, 会调用不同的虚函数(被virtual修饰的类成员函数称为虚函数). (函数重载也是一种多态)class Person{public: virtual void _print() { cout << "Person" << endl; }};class Student : public Person{public: v

2024-02-07 18:35:48 892 1

原创 【C++】继承

class 派生类名 : 继承方式 基类名 {//... };

2024-02-01 15:57:11 780 1

原创 【C++】模板特化

若想在接收到 int, int 类型时打印 “<class int, class int>”, 就需要对类模板进行特化.为了对特定的类型做特定的处理, 就需要对模板进行特化. 在原模板类的基础上, 针对特殊类型所进行特殊化的实现方式.这里也可以使用函数重载, 并且在特化和重载两者都存在的情况下, 就不会实例化特化,会直接调用重载的函数.例: 下面的比较函数由于参数类型不同, 得出的结果不相同, 所以需要对指针类型进行特化。偏特化对参数的进一步限制, 不只是特化部分参数, 而对模板参数进行更进一步的限制.

2024-01-26 17:41:36 437 1

原创 【C++】模拟实现List

/ List的节点类:_val(val),_prev(this) //指向之后都要更改的{}//指向前一个节点//指向后一个节点T _val;//节点数据class listprivate:void CreateHead() //每个构造函数都需要创造哨兵节点, 所以单独创建一个函数调用//哨兵节点。

2024-01-22 17:14:27 357

原创 【C++】模拟实现Vector

为了避免和标准库中的命名冲突, 在自己的命名空间中定义Vector.私有成员也只需要三个指针: _start(起始位置), _finish(结束位置), _end_of_storage.所以像 size(), capacity() 的函数直接使用指针相减即可.public:// Vector的迭代器也是一个原生指针private:// 指向有效数据的开始// 指向有效数据的尾// 指向存储容量的尾。

2024-01-18 15:45:10 382 1

原创 【Linux】进程地址空间/进程控制

在C/C++中 我们认为进程的数据存储在内存中, 如下图一样.但实际上我们之前所认为的数据地址是虚拟地址/线性地址, 并不是物理地址.所以上图的结构实际上不是物理内存, 叫做进程地址空间, 进程地址空间是给上层用户使用的.进程地址空间都是有一定范围的(在32位机器上一般是0~4G), 并且是通过某种方式映射到物理内存的.进程地址空间实际上也是一个结构体, 叫做 mm_struct.进程具有独立性, 每一个进程都会有自己独立的 mm_struct, 操作系统也会管理进程地址空间.

2023-12-06 16:24:37 845 1

原创 【C++】模拟实现String

模拟实现string

2023-11-24 16:20:56 992 1

原创 【C++】内存管理

所以new/delete和new[]/delete[]应该规范代码,对应使用。

2023-11-10 17:28:35 23 1

原创 【Linux】make / Makefile

我们在使用make命令时,相当于执行了 make test.exe,如果我们将clean的依赖关系和依赖方法放在上面,那么使用make时,默认就是使用make clean。一般建议将clean修饰成伪目标,保证清理工作一直能够执行,编译目标的一般遵从Makefile的检查就足够了。但是再次运行make clean就会报错,这是rm时发现没有test.exe文件,rm命令报的错。至此将依赖关系和依赖方法写完后,简单的Makefile文件就写完了,就可以执行make命令了。

2023-11-07 15:53:28 130

原创 【C++】类和对象

注:如果只定义了其他构造函数,而没有定义无参或全缺省构造函数,编译器也不会生成默认构造函数,那么这个类就没有默认构造函数,初始化时会出现问题。

2023-10-25 15:48:42 27 1

原创 【C++】C++ 入门

namespace 后面跟空间名和大括号即可,括号内为命名空间的成员//成员 }命名空间可以嵌套使用int n1 = 0;//成员//成员int n1 = 1;int n2 = 0;注:在同一个工程中,相同名称的命名空间,编译器最后会将他们合成为同一个命名空间。

2023-10-17 15:20:00 28

原创 排序

2023-09-26 15:20:16 84

原创 二叉树

int _size;}Heap;

2023-09-14 08:36:59 28 1

原创 链表

由于顺序表中存在缺陷或者不能适用其他情况,所以进一步去学习链表。

2023-07-29 21:36:38 30

原创 顺序表

当传入的下标为0或等于size-1(和插入不同,这里如果是size就不行,size的位置没有数据)时,就分别是头删和尾删,就可以将头删和尾删函数改为调用此函数。配合查找函数使用,将pos(传入的下标) 的数据删除。使用固定长度数组存储元素,局限性比较大,不常使用。

2023-07-25 13:51:10 41

空空如也

空空如也

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

TA关注的人

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