自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux-进程控制

分配新的内核数据结构即pcb以及mm_struct、vm_area_structfork()创建子进程,给父进程返回子进程pid,给子进程自己返回0;那么3493就是父进程的pid,子进程pid就是3494原理:写时复制是一种延迟拷贝技术,多个进程在最初可以共享同一块内存区域,只有当其中某个进程尝试对这块共享内存进行写入操作时,系统才会为该进程创建一个独立的内存副本,让其在副本上进行写入,而其他进程继续使用原来的内存,以此避免不必要的内存拷贝,提高系统性能。 实现方式:Linux 通过页表机制来实现写

2025-04-26 17:35:32 1040

原创 第一章、概述

计算机网络(简称网络)由若干节点和连接这些节点的链路组成(节点可以是计算机、集线器、交换机或路由器登)互连网(网络的网络):多个网络通过路由器连接在一起与网络相连计算机称为主机,路由器是一种特殊的计算机,但是不能称之为主机网络将许多计算机连接在一起,而互连网则把许多网络通过路由器连接在一起,与网络相连的计算机常称为主机1.2.2、互联网基础结构发展的三个阶段。

2025-04-22 01:00:00 713

原创 MySQL复合查询

1、查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J2、按照部门号升序而雇员的工资降序排序3、使用年薪进行降序排序4、5、6、7、8、

2025-04-20 01:00:00 609

原创 MySQL内置函数

1、length显示的是字节数而不是字符数,也就说,在utf8下若是汉字时,一个汉字占3个字节,也就是一个汉字显示length是3;方法:首先将姓名分为两部分,第一部分就是首字母,第二部分就是剩下的,对第一部分进行lcase,再将这两部分进行cancat拼接。2、这些函数的操作最终都不会影响原表,也就是说就算涉及到表中数据的改变,只是呈现的看起来改变了,但是实际上,原表没有被更改;显示exam_result中的内容,格式为 XXX的语文成绩是:XXX,数学成绩是:XXX,英语成绩是:XXX.

2025-04-14 19:03:49 806

原创 Linux-进程概念

当我们要运行某个程序或者代码时,这个程序或者代码会从磁盘载入到内存,而操作系统会在开机时就载入内存进行运行,操作系统对载入的程序或者代码进行管理,通过先描述再组织的方式进行管理形成的PCB(process control block即进程控制块)(PCB也可以叫做内核数据结构对象)和载入的程序或者代码就是进程。这些一个一个PCB数据结构是操作系统管理中描述过程的结果,PCB中包含一个进程的相关属性(如标识符、状态、优先级、程序计数器、内存指针等等);

2025-04-14 01:00:00 1667

原创 C++_智能指针

智能指针类除了满⾜RAII的设计思路,还要⽅便资源的访问,所以智能指针类还会想迭代器类⼀样,重载等运算符,⽅便访问资源。

2025-04-10 15:03:15 587

原创 C++_异常

目录一、异常的概念以及使用1.1、异常的概念1.2、异常的抛出和捕获1.3、栈展开1.4、查找匹配的处理代码1.5、异常的重新抛出1.6、异常安全问题1.71.7、异常规范二、标准库的异常 若是b为0,那么会throw抛异常,先在当前函数域找有无匹配的catch来匹配抛出异常对象的类型,但是这个函数里面的是int,继续在函数链中找,Divide里面也不匹配,编译器直接跳到main函数,匹配,那么打印异常信息;注意,throw之后Divide里面throw后面的都不会执行;当捕获异常时,若是不匹配那么

2025-04-06 20:26:44 747

原创 C++11详解

lambda表达式。

2025-04-06 16:56:39 1043

原创 MySQL基本查询

所以total是第三步出来的,但是where是第二部。查询姓孙的,或者语文成绩大于数学成绩并且英语成绩小于80的。

2025-04-04 15:24:35 579

原创 MySQL表的约束

例子:一个学生表,包含学生的各种属性,其中有一个属性是班级id,若是在这个学生表中查看班级id就会有很多重复的,因为可以出现很多学生在同一个班级的情况;那么定义一个班级表,其中包含主键班级id和班级名;再将学生表中的班级id定义为外键,关联的是班级表的主键id,此时查看起来就会很方便;并且更重要的一点就是有了完整性约束,就是给学生表插入新数据时,插入的所属班级id的值不能是主表班级表中主键id不存在的值。先创建主表:再创建从表:给主表插入数据,表示能收学生的班级号有哪些;

2025-03-31 21:41:59 1041 1

原创 二叉树扩展-二叉树进阶算法题

val = val;T _val;

2025-03-26 11:26:02 678

原创 MySQL数据类型

tinyint范围是-128~127,那么给这个表的num插入数据时,不能插入超过这个范围的数据;这里tinyint后面括号中的内容不是字节数;tinyint可以是无符号的,范围是0~255,

2025-03-25 12:40:00 766

原创 MySQL表的操作

field表示列名,即属性datatype表示列的类型字符集,如果没有指定字符集,则以所在数据库的字符集为准collate校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准engine 存储引擎,如果没有指定存储引擎,则以所在数据库的存储引擎为准comment是对这些属性的说明;查看使用MyISAM存储引擎的表的文件:users.frm:表结构users.MYD:表数据users.MYI:表索引进入/etc/my.cnf,默认使用的引擎是innodb。

2025-03-18 10:32:25 476

原创 MYSQL库的操作

没有写-h 127.0.0.1默认连接本地没有写 -P 3306默认连接3306端口号创建一个名字为db_name的数据库在Linux的目录下可以看到新建的数据库目录d1:同样地在Linux这个目录下也可以创建一个新的目录在mysql里面相当于创建了新的数据库,但是一般不会这样写。创建一个数据库,但是若是这个数据库已经存在就不会创建了。

2025-03-18 01:30:00 1077

原创 哈希扩展-位图、布隆过滤器、海量数据处理

问题:现有40亿无符号整数,需要从中查找一个指定的无符号整数是否存在,你要怎么解决?解法一:遍历这些数据(效率低O(N));解法二:先排序再二分查找(O(N*logN)+O(logN)),看似可行,实则不然:首先先要存放这些整数,一个整数4个字节,总共160亿字节,约为16G的内存,显然不行;解法三:使用位图将数据映射到bit位,这个bit位为1表示存在反之不存在;就算是40亿个不重复的无符号整数,只需要40亿个比特位来映射,也就是4G左右;###测试。

2025-03-03 09:29:11 1015

原创 C++ unordered_set、unordered_map哈希使用及其封装

和unordered_set与set差异相同;本身与map使用差不多;unordered_multimap/unordered_multiset跟multimap/multiset功能完全类似,⽀持Key冗余。二、哈希表实现。

2025-02-28 19:10:10 804

原创 Linux基础环境开发工具使用

用自己定义的变量代替命令,但是使用时要用$(),echo打印测试是不是能替换echo前面加上@不显示执行的命令,但是非命令的会显示;

2025-02-16 15:33:31 768

原创 Linux权限

普通用户权限低受管控,超级用户权限高;超级用户切换到普通用户方式 :su 普通用户名,不需要输入密码普通用户切换到超级用户方式:su root(root可省略)之后回车输入密码或者su -之后回车输入密码;这两种方式区别是第二种切换为超级用户之后路径会回到/root,但是第一种保持为切换前的普通用户的路径不变exit从超级用户退出到普通用户。

2025-01-21 22:11:12 756

原创 Linux基本指令(3)

进行Linux和Linux系统之间进行互传压缩包 :scp dst.tgz 用户名@你的公网IP: 目标机器指定的路径;打包压缩目录:zip -r dir1.zip dir1 那么dir1和其里面的文件变成了一个文件 dir1.zip;unzip -d dir.zip /root 把解包后的文件解包到指定目录 /root。选项一般是-czf,不需要加 -r;常见选项:-n 显示行号、-v 显示不含关键字的行的信息、-i 忽略行中信息的大小写进行匹配。输入指令sz后回车,弹出界面,选择安放压缩包的位置。

2025-01-16 21:37:21 648

原创 Linux基本指令(2)

显示时间,加上选项(选项最开始又加上‘+’)可以设置打印出来的时间的格式:%Y表示年,%m表示月,%d表示天,%F相当于%Y-%m-%d;意思就是先查看出前num1行的内容,再查看这部分内容的后num2行的内容,相当于就是查看中间部分的内容。显示内容时,输入 / 加上字符串可以直接查看到这个字符串所在的文件位置,并且显示出这一页的内容,若是多个出现按n表示next逐页查看。查看文件,开始时只显示当前屏幕能容纳的文件内容,需要按回车查看下面的内容,但是只能向下查看,不能再向上查看了。cal 月份 年份;

2025-01-15 20:26:18 478

原创 Linux基本指令(1)

功能:对于目录,显示这个的目录名以及文件名;对于文件,显示文件名后面可接命令行选项配合使用,接选项时ls与选项以及选项与选项之间要有一个空格;这里先学习了两个选项:-l ,-a,-d1、-l:ls只是显示名称属性,加上-l就是显示这个目录下目录以及文件的详细信息d开头字符的就是表示文件夹(目录),-字符开头的表示的就是普通文件2、-a :显示当前目录下的所有文件,包括隐藏的文件3、-d:只是显示目录,而不显示这个目录下的文件它们可以合起来使用,哪种顺序都可以(-al;-a -l;-la;

2025-01-10 23:11:56 540

原创 C++红黑树封装map和set

set里面的key就是value,而map里面的value是pair<key,value>;在封装map和set时,要使用同一个红黑树的类模板去封装,也就是说,红黑树的类模板只有一份;但是两者的value不同,首先对于map来说,传key和value需要两个模板参数,为了兼容map,要求set也传两个模板参数,那么set的value也传key;此时就能保证共用一个红黑树类模板了;但是由于两者数据的不同,数据比较的逻辑也不同;

2025-01-08 15:15:45 908

原创 数据结构-排序

因为是让end先走的,end是要找小于基准值的位置,这里分析begin和end相遇的几种情况:情况一,end找不到比基准值小的,那么最后相遇的位置就是基准值的位置,跳出循环,自己和自己交换,递归右边的部分;这里取最左边地的数据,那么从后面开始找,找到比基准值小的就把这个值放在坑的位置,那么这个比基准值小的数据的位置又形成了一个坑,从前面开始找找到比基准值大的值就把这个值放在上次的坑处,最后end和begin相遇,相遇得到位置也是一个坑,最后把基准值放在这个坑处;这样也能把大的值放到后面,小的放在前面;

2024-12-04 15:05:16 1295

原创 红黑树的概念以及基本模拟

若uncle存在且为黑色,那么cur一定不是新插入的红色节点,而是cur下面的节点通过变色变上来的红色节点,否则parent的左右子树黑色节点的数量就不同,违反规则;由于每条路径的黑色节点的数量的个数相同,极端情况下最短路径的长度就是全是黑色节点的数量,最长路径长度就是红色黑色相间的路径,那么恰好就是最短路径的二倍;双旋的原因:不同于单旋,当parent是grandfather的左节点但是cur是father的右节点时,单旋不能解决问题,若是单旋,只是交换了左右位置,本质上还是没有完成规则的维护;

2024-11-27 22:07:03 743

原创 C++AVL树

先看图中前两个旋转:e和f的位置最终是固定的,当插入到e时,e的父节点的平衡因子是一种情况,但是插入到f时,e的父节点的平衡因子又是另外一种情况,而这种差异的产生是因为插入的位置不同,也就是当前节点的右子树根节点的平衡因子的不同;为了解决这个问题,需要提前记录当前节点的的右子树节点的平衡因子(单旋会改变这个节点的平衡因子,不记录最后判断有误),旋转完之后,通过判断这个平衡因子的不同来手动给这三个关键节点的平衡因子置值,其他的节点的平衡因子没有变化;之后让5这个节点的父节点指针和10这个节点的父节点链接。

2024-11-17 16:47:28 723

原创 C++map基本概念和接口

##map和set很多地方相似,最大的不同就是map中存放的不仅仅是key,还有value;使用map时,一般都是通过key去寻找value;

2024-11-10 20:44:43 1082

原创 C++-set的基本概念和接口

set是存储数据的容器,它的存储数据的规则按照红黑树的规则;左子树的节点数据都小于根节点的数据,右子树的节点数据都大于根节点的数据大小;class set;T是set底层的关键字类型;set默认支持的是小于的比较,less,可以传greater;set底层存储的数据的内存是从空间适配器中申请的,可以自己实现内存池,那么就传给第三个参数;一般来说,我们不需要传后面的两个参数底层是红黑树,增删查的时间复杂度是O(logN);

2024-11-08 20:17:48 1025

原创 二叉搜索树

这里的性能指的是在树里面找指定值的节点;根据左子树节点值小于根节点,右子树值大于根节点值,每次判断指定的值大于还是小于根节点的值,来实现往左子树走还是右子树走并且向下遍历了;这里介绍的是key带着一个value的情况,key不能被修改,找到key就找到value;value是和key相关的;相比于普通的二分查找,平衡二叉树具有的优势就是不会被限制于下标的固定形式去查找;实现的代码:只需要将节点的成员变量加上一个value;上面的平衡二叉树是Key的搜索场景,找的是key;

2024-11-06 20:32:48 866

原创 C++ 多态原理

用一个题目引入:现有代码:32位平台上输出的是12,按照我们之前学习的内容可知,类的大小实际上按照对齐规则计算类中成员变量的大小,那么这里应该是8;输出12的原因:类含有虚函数,那么会类中会有一个指针(_vfptr),这个指针是一个指向函数指针数组的指针,也叫虚函数表指针或者虚表指针;指针的大小是4,指针指向一个数组,数组里面存放的是虚函数的地址,这个数组至少存放一个虚函数的地址;这个指针不一定放在成员变量前面,这个根据平台而定;在满足多态条件之后,程序运行到指向的对象的虚表中找到对应函数的地址进行调

2024-10-30 16:44:15 457

原创 C++ 多态使用详解

必须是成员函数。

2024-10-30 12:16:01 914

原创 C++-继承

可以把基类当作派生类中的一个自定义类型的属性,这个属性和string类似要调用自己的默认成员函数。

2024-10-27 19:12:53 2037

原创 C++模板进阶

之前学到的模板是类型模板,也就是模板参数都是代表的类型,但是非类型模板参数可以是具体的值,并且非类型模板参数的值是在编译阶段就要确认;非类型模板参数值得注意的几点:非类型模板参数的不能是类类型、字符串、浮点型(浮点型只有C++20版本之后支持)非类型模板参数可以给缺省值;当模板参数有缺省值,可以不传参,并且也确实没有传参时,要在实例化对象后面加上<>,这样适应各种版本的写法(不加<>只有C++###代码示例:非类型模板参数不能是浮点型,除非是C++20版本的;非类型模板参数不能是类类型;

2024-10-20 20:49:44 1036

原创 C++容器适配器的模拟实现-stack、queue、priority_queue

##容器适配器是将容器转换到其他容器自身不方便使用的地方,但是就容器适配器其本身还是包装的容器,所以这个类模板中各个接口的实现都是调用的容器的接口,因为容器适配器可能适配多个容器,所以这个类模板的模板参数中有一个参数是代表容器类型的,方便传参过来能及时改变;

2024-10-16 11:09:02 790

原创 C++容器适配器1-基本使用(stack、queue)

##适配器意思是可以将一种不能用于某种场景的东西经过特殊转换,包装成一个新东西,这个新定西可以用于这个场景,并且还具有之前旧东西的功能作用;stack、queue就是C++里面的容器适配器,这两个适配器堆vector和list两个容器进行了包装,具有vector和list的特性;deque相当于一个缝合怪,具有list和vector的特性,所以在标准库中,stack和queue都是将deque作为包装的缺省类型,至于怎么包装的,后续介绍,现在只用记得deque具有vector和list的各有的特性。

2024-10-14 22:46:00 423

原创 C++-list模拟实现

##模拟实现list需要先看源码,了解基本的结构和设计思路###list底层是双向链表,每一个节点包含数据域和两个指针(一个指向后一个节点,一个指向前一个节点),并且list带有一个哨兵位;###链表的结构的实现并不困难,这里阻碍实现的是迭代器;像string和vector底层结构是连续的,可以直接++、--、+几、-几来实现随机访问每一个数据,它们的迭代器的实现(迭代器的基本操作)也容易,但是list底层双向指针不能++、--来访问到下一个数据,这个时候要单独封装一个迭代器类模板实现需要的迭代器;

2024-10-13 19:13:12 1009 1

原创 C++-vector模拟实现

##vector底层相当于是数组,查看源码可以发现,这个类的私有成员变量是三个迭代器;在实现时迭代器就可以当作是vector里面的元素的指针类型;###vector是一个类模板,实现时也应当按照这样的写法用一个模板去实现,类模板vector中数据类型是T;_start指向vector的开始地址,_finish指向vector的有效元素的结束地址,_end_of_storage指向vector最大存储数据的地址;

2024-10-03 16:23:13 824 2

原创 C++-list使用学习

emplace_back也是尾插数据,但是可以直接传值去尾插,这样省去来拷贝构造的步骤,有一点优化;而push_back不能直接传值去初始化;list<A> l1;list<A> l2;//可以直接给值。

2024-09-27 09:29:04 1204 1

原创 C++ vector的使用

##vector介绍:vector是C++中引入的类模板,这个模板相当于顺序表,里面可以存放不同类型的数据,同时实现了多个接口去完成对vector对象的各种操作;基本使用方式:#include<vector>//包含头文件//展开头文件中的命名空间int main()//定义一个vector对象,这个对象存放的是int类型的数据;

2024-09-16 13:01:07 1905 1

原创 C++string模拟实现

C++中的string相当于是一个类模板,包含在头文件string中,具体实现在这个头文件中名为std的namespace中,所以一般在直接使用string时,展开std;那么模拟实现string时,首先要将实现的内容放在一个自己定义的命名空间里面,在这个命名空间里面再定义自己的string类;这里实现string吗,模板的主要接口功能。

2024-09-14 17:29:40 1481 1

原创 C++ string类—容量、元素获取

这些成员函数是获取string类里面的元素的;

2024-09-01 20:55:50 724

空空如也

空空如也

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

TA关注的人

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