- 博客(93)
- 收藏
- 关注
原创 C++——AI大模型接入SDK
其次就是move函数的使用,它的作用在于告诉编译器,某个资源是可以被移动的,因为unique_ptr是禁止拷贝的,所以这里只能进行所有权的转移,移动语义只转移对象的 “控制权”(比如指针的指向),不存在任何拷贝,效率是非常理想的。这个问题我们在前面提到过,其实本质就是流式返回的时候是“边生成边返回”,这也是现在所有主流大模型的统一回复方式,用回调函数,就是可以在每收到一段增量数据的时候,就立即通知上层处理,而不需要等到完整结果生成,大大提升了用户的体验。否则返回nullptr,整体是很安全的。
2026-03-15 18:07:10
463
原创 C++11——线程库
这里我们实现了一个类,它重载了operator(),其实这里本质就是仿函数,我们利用类实例化出一个仿函数对象,再讲这个仿函数对象传给thread,这时线程就会调用operator()函数执行线程的相关任务。,如果不调用join函数,那么主线程就会提前结束,主线程一旦终止,子线程也会立即终止,这就可能导致子线程的逻辑还没执行完毕就被强制退出了,这是不合理的。线程并不是越多,效率就越高,线程数超过 CPU 核心数时,操作系统会频繁切换线程上下文(保存 / 恢复线程状态),反而增加开销,导致程序变慢。
2026-01-06 16:50:20
608
原创 C++——衡判云OJ系统
每台主机对应一个Machine对象,初始化负载为0,分配互斥锁,这里有一个细节,我们将m对象填充好后,先进行操作online数组,我们把每台主机的下标当作主机id,所以在第一次调用时,此时machines数组中还没有元素,所以这里插入的就是0,表示0号主机已经在线了。遍历online数组,筛选出负载最小的主机,返回其ID和指针,这里idh和m都是输出型参数,并且这里m是一个二级指针,这样做是为了在我们找到负载最小的主机后,我们返回其地址,这样就可以直接访问这台主机,就不需要在去遍历寻找了。
2025-11-23 23:15:31
1110
原创 MySQL——事务管理
这里大家需要注意,右边commit之后,刚才左边阻塞的操作就会立即执行完成,这时我们查看表,发现数据还是没变,这是因为左边还没commit,我们隔离级别是最高级别,所以左边必须commit之后,我们才可以看到改变后的数据。2. 一般的数据库在可重复读隔离级别下,update数据是满足可重复读的,但insert数据会存在幻读问题,因为隔离性是通过对数据加锁完成的,而新插入的数据原本是不存在的,因此一般的加锁无法屏蔽这类问题。一个事务中的所有操作,要么不做,要么全完成,不会结束在中间某个环节。
2025-10-13 22:05:29
1169
原创 MySQL——索引
而这里的Buffer Pool其实不是直接与磁盘进行交互的,它属于应用层软件mysqld自己的缓冲区,而上面我们所说的MySQL与磁盘交互的基本单位是16KB,本质上是指Buffer Pool 与内核缓冲区交互的基本单位是16KB,只不过在说的时候更关注的是MySQL和磁盘之间的关系,所以直接说的是MySQL与磁盘交互的基本单位是16KB,相当于忽略了中间的内核缓冲区。1. 索引是用来提高查询速度的,如果没有索引,查询的效率将是O(N)级别的,这在海量数据库中就会很慢,所以需要建立索引来提高查询速度。
2025-10-13 22:05:18
1035
1
原创 MySQL——复合查询
然后我们需要利用上面子查询得到的结果来进一步查询,这里就需要用到in关键字,判断员工的工作岗位是子查询得到的若干岗位中的一个,如果是则符合筛选条件,由于要求筛选出来的员工不包含10号部门的,因此还需要在where子句中指明筛选条件为部门号不等于10。但实际这道题也等价于找到工资高于30号部门的最低工资的员工,因此也可以使用单行子查询得到30号部门的最低工资,然后判断员工的工资是否高于子查询得到的最低工资即可,由于要求筛选出来的员工包含30号部门的,因此不需要再对部门号进行过滤。
2025-10-13 22:05:10
841
原创 MySQL——内置函数
strcmp函数用于逐字符按照ASCII码比较两个字符串的大小,两个字符串大小相等返回0,前者大返回1,后者大返回-1。replace函数用于将字符串中的指定子字符串替换成另一个字符串,例如将员工表中所有名字中的“S”替换成“北京”。现有如下成绩表,要求以“XXX的语文是XX分,数学是XX分,英语是XX分”的格式显示成绩表中的信息。如果在date_add函数中添加的日期/时间为负值,则相当于在日期的基础上减去日期/时间。substring函数用于从字符串的指定位置开始,向后截取指定个数的字符。
2025-10-13 22:04:54
690
原创 MySQL——表内容的增删查改
因为被查询到的数据需要通过网络从MySQL服务器传输到本主机,查询的列越多也就意味着需要传输的数据量越大,此外,进行全列查询还可能会影响到索引的使用。将测试表重命名为其他名字(相当于对去重前的数据进行备份,如果不需要可以直接删除),将临时表重命名为测试表的名字,这时便完成了表中数据的去重操作。再向表中插入一些数据,在插入数据时不指明自增长字段的值,这时会发现插入数据对应的自增长id值是在之前的基础上继续增长的。
2025-10-13 22:04:45
1102
原创 MySQL——表的约束
向表中插入第一条记录时如果没有指明自增长字段的值,那么自增长字段的值默认将会从1开始,后续向表中插入记录时如果也不指明自增长字段的值,那么自增长字段的值就会依次递增。再创建一个学生表作为从表,表当中包含学生的id、姓名以及学生所在班级对应的id,并将学生表中的班级id列设置成外键,关联到班级表中的班级id列。但如果插入学生表的记录对应的班级id是3,相当于插入学生表的这条记录对应的班级并不存在,此时将会插入失败,这就是外键约束。
2025-10-13 22:04:35
877
原创 MySQL数据类型
无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为0~99.99,实际可插入的范围是0~99.994。3. varchar(L)定义后,会根据存储字符串的长度按需开辟空间,并且需要使用1-3字节的空间用于表示存储字符串的长度以及其他控制信息,如果存储的字符串长度超过L则会报错。需要注意的是,这里所说的字符并不只是指一个英文字母,一个汉字也是一个字符,因此只要插入的汉字个数不超过6个也是可以插入的。
2025-10-13 22:04:21
656
原创 MySQL——表操作
可以看到在新增列之前插入表中的两条记录对应的path值为NULL,因此新增列后可能还需要对原来插入的记录进行修改。3. CHARSET用于指定表所采用的编码格式,如果没有指定则以所在数据库的编码格式为准。4. COLLATE用于指定表所采用的校验规则,如果没有指定则以所在数据库的校验规则为准。,如果我建表时没有指定使用哪种存储引擎,那么就会默认使用InnoDB存储引擎。将test_user表中password列的列名改成passwd。1. SQL中大写的表示关键字,[ ]中代表的是可选项。
2025-10-13 22:03:30
511
4
原创 MySQL——库操作
使用不同的校验规则操作数据库中的数据可能会得到不同的结果,比如utf8mb4_0900_ai_ci校验规则在比对数据时是不区分大小写的,而utf8mb4_bin校验规则在对比数据时则是区分大小写的。这里我们仿照上面的实验思路,只查出了'king',而没有查出'King',这里就说明utf8mb4_bin校验规则在对比数据时则区分大小写。1. SQL中大写的表示关键字(MySQL中命令不区分大小写,建议小写,可读性比较好),[ ]中代表的是可选项。对数据库的修改主要指的是修改数据库的字符集或校验规则。
2025-10-13 22:03:11
337
4
原创 数据链路层协议——以太网协议
在局域网通信中,一个主机发出的消息,该局域网中所有其他主机其实都可以收到,只不过是大部分主机不做处理而已,像上图中主机A给主机E发消息,其实主机BCD都收到了主机A的消息,但是通过对比目的MAC地址,发现不是给自己的就丢弃了,只有主机E发现这个报文是给自己的,于是就处理了报文。当主机A想主机B发送数据是,数据通过路由,来到了路由器D,此时路由器D与主机B在同一个子网,路由器D得将数据交给主机B,但是路由器D现在只有目的IP地址,而给同局域网中的另一台主机发送数据,需要知道对方的MAC地址。
2025-09-26 13:36:53
831
1
原创 网络层协议——IP
这里我们需要知道,私有IP是不能出现在公网中的,所以在我们访问公网时,路由器会将我们报文中的源IP地址不断替换成路由器的WAN口IP,比如上面图中,我们从主机192.168.200/24发出一个报文,经过家用路由器时,源IP地址192.168.200会被替换成家用路由器的WAN口IP10.1.1.1/24,经过运营商路由器时,刚才的IP就再次被替换成运营商的WAN口IP,这样我们的报文就顺利地进入到公网了。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
2025-09-26 13:36:51
1620
1
原创 传输层协议——UDP/TCP
大家观察上图,在这种情况下,滑动窗口就没有进行右移,只是变窄了,其实这也很好理解,发送端发送了1001-2000的报文,假设对方窗口大小为4000,且对方上层一直不拿其接收缓冲区中的数据,此时ACK报文中确认序号是2001,表示刚才发的1000字节对方收到了,那么此时对方接收缓冲区就只剩3000字节的空间了,此时发送端就不能将滑动窗口右移,只能将滑动窗口变窄,所以滑动窗口是不一定右移的,因为对方接收能力可能不断在变化,从而滑动窗口也会随之不断变宽、变窄或者不变。,这样就陷入了一个死循环。
2025-09-22 20:25:36
1650
2
原创 应用层协议——HTTP
再谈协议之前,我们先来看一下上面这张图,对整个网络协议栈有一个宏观认识,下三层的任务是解决通信细节问题,而最上层的应用层需要负责对下层传上来的数据进行处理使用,所以应用层也需要协议,HTTP协议是基于请求和响应的应用层服务,作为客户端,你可以向服务器发起request,服务器收到这个request后,会对这个request做数据分析,得出你想要访问什么资源,然后服务器再构建response,完成这一次HTTP的请求。这些端口号与对应协议的一一对应的,所以一般情况下,在URL中端口号的可以省略的。
2025-09-22 20:25:32
1248
1
原创 C++——异常
1. 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码,如果抛出的异常对象没有捕获,或是没有匹配类型的捕获,那么程序会终止报错。1. 当异常被抛出后,首先检查throw本身是否在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地方进行处理。异常是面向对象语言常用的一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数直接或间接的调用者处理这个错误。:try块中放置的是可能抛出异常的代码,该代码块在执行时将进行异常错误检测,
2025-07-26 20:50:54
714
原创 C++11——lambda表达式
要对一个数据集合中的元素进行排序,可以使用sort函数,但由于这里待排序的元素为自定义类型,因此需要用户自行定义排序时的比较规则。这样一来,调用lambda表达式时就不用传入参数了,但实际我们只需要用到变量a和变量b,没有必要把父作用域中的所有变量都进行捕捉,因此也可以只对父作用域中的a、b变量进行捕捉。lambda表达式和范围for是类似的,它们在语法层面上看起来都很神奇,但实际范围for底层就是通过迭代器实现的,使用lambda表达式,可以明显增加代码的可读性,还可以减少代码的体量,让代码更简洁高效。
2025-07-26 20:50:51
732
原创 C++11——右值引用和移动语义(重点)
此时当to_string函数返回局部的string对象时,会先调用移动构造生成一个临时对象,然后再调用移动赋值将临时对象的资源转移给我们接收返回值的对象,这个过程虽然调用了两个函数,但这两个函数要做的只是资源的移动,而不需要进行深拷贝,大大提高了效率。调用左值引用版本的push_back函数插入元素时,会调用string原有的operator=函数进行深拷贝,而调用右值引用版本的push_back函数插入元素时,只会调用string的移动赋值进行资源的移动。而我们加上移动构造后,这里编译器。
2025-07-21 11:14:58
1576
原创 优选算法——前缀和
这里需要强调一点,大家不要去死记硬背前缀和的模板,而是要去理解这种思想;比如本题,其实是前缀积,但是本质上和前缀和的思想是一样的。这里的思想类似于动态规划,我们需要定义出两个状态表示。与上题很类似,但是需要一些补充知识;2. 除自身以外数组的乘积。3. 和为k的子数组。1. 数组的中心下标。
2025-05-10 21:29:42
589
原创 优选算法——队列+BFS
在正常的层序遍历过程中,我们是可以把⼀层的结点放在⼀个数组中去的。既然我们有这个数组,在合适的层数逆序就可以得到锯齿形层序遍历的结果。层序遍历即可~仅需多加⼀个变量,用来记录每⼀层结点的个数就好了。2. 二叉树的锯齿层序遍历。4. 在每个树行中找最大值。3. 二叉树最大宽度。
2025-05-10 21:29:38
511
原创 Linux——进程间通信
而此时子进程代码都还没跑完就被终止了,属于异常退出,那么子进程必然收到了某种信号。这里大家发现,管道文件的大小为0,尽管服务端不读取管道当中的数据,但是管道当中的数据并没有被刷新到磁盘,也就说明了双方进程之间的通信依旧是在内存当中进行的,和匿名管道通信是一样的,这也就与我们前面的结论逻辑自洽了。进程间通信的本质就是,让不同的进程看到同一份资源,使用匿名管道实现父子进程间通信的原理就是,让两个父子进程先看到同一份被打开的文件资源,然后父子进程就可以对该文件进行写入或是读取操作,进而实现父子进程间通信。
2025-04-26 19:08:27
1343
1
原创 Linux——动静态库
并且,可执行程序将其入口地址填充到CPU的EIP寄存器中,这样一来CPU就知道了可执行程序从哪里开始执行,然后通过MMU,再加上页表,找到对应程序语句的物理地址,执行语句,如果语句中还在调用其他地方的语句,那么CPU会得到相应的虚拟地址,然后继续查页表,去找到对应物理地址,所以总结来说,进入CPU的都是虚拟地址,出来的都是物理地址。合并了后,空间利⽤率就⾼了,否则,很小的⼀段,未来物理内存也浪费太⼤(物理内存页分配⼀般都是整数倍⼀块给 你,比如4k),所以,链接器趁着链接就把小块们都合并了。
2025-04-26 19:08:12
4088
2
原创 优选算法——优先级队列
• 并且将粉碎后的⽯头放⼊⽯堆中之后,也能快速找到下⼀轮粉碎的最⼤⽯头和次⼤⽯头;这里大家要注意一个点,定义堆的时候要定义成全局的,这样类内两个函数都可以找到。• 每次从⽯堆中拿出最⼤的元素以及次⼤的元素,然后将它们粉碎;• 如何顺利的拿出最⼤的⽯头以及次⼤的⽯头;1. 最后一块石头的重量。2. 数据流中第K大元素。3. 前K个高频单词。4. 数据流的中位数。
2025-04-17 19:10:25
461
原创 动态规划——两个数组的dp问题
这里说明一下,在做字符串类型的dp问题时,我们可以在原字符串的前面加上一个字符,这样下标的关系就不需要去调整了。这里大家需要注意我们的预处理,前面加一个空串可以帮我们解决下标映射的问题。本题和上一题解法一样,可以转化为上一道题。7. 两个字符串的最小ASCII删除和。5. 正则表达式匹配。8. 最长重复子数组。1. 最长公共子序列。
2025-04-09 18:28:23
446
原创 Linux——冯 • 诺依曼体系结构&操作系统初识
当学生的数量多起来了,校长就可以将全部学生的信息组织起来,当然组织的方式有很多种(链表、顺序表、树),而每种组织方式都有其自己的优势,于是就有了一门课程专门教我们管理数据的方式,那就是数据结构。与此同时,键盘将信息加载到内存后,CPU要获取内存中的信息并进行处理,处理完后写回内存,此时你的电脑网卡就回从内存中获取相应的信息,再通过网络传输到对方的电脑。,在你向朋友发送消息这个过程中,你的电脑当中的键盘充当输入设备、显示器和网卡充当输出设备,你朋友的电脑当中的网卡充当输入设备、显示器充当输出设备。
2025-04-01 18:02:04
3722
1
原创 动态规划——回文串问题
这道题看起来比较困难,实际上并不难,我们利用前面动态规划的思想可以瞬间降这道题变得简单。说明:填表顺序那里笔误,应该是从下往上填每一行。6. 让字符串成为回文串的最小插入次数。5. 最长回文子序列。4. 分割回文串II。
2025-04-01 18:01:46
370
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅