- 博客(78)
- 收藏
- 关注
原创 RAII简介
想象你有个健忘的朋友,每次借东西都会忘记归还。RAII(ResourceAcquisitionIsI“你负责借,我负责还!核心逻辑出生即打工:对象在构造函数里获取资源(内存、文件、锁等)。去世前还债:对象在析构函数里自动释放资源。死也要还:即使程序中途崩溃(如抛异常),对象死前也会调用析构函数清理资源!👉本质资源的命,就是对象的命!对象活着,资源有效;对象去世,资源释放。懒人福音:资源获取释放全自动化,告别new/delete噩梦。异常克星:程序崩了也不留资源烂摊子。
2025-07-02 23:20:04
420
原创 Qt—模态与非模态对话框
文章摘要:Qt中的对话框分为模态和非模态两种类型。模态对话框强制用户优先处理当前窗口,阻塞特定范围的用户交互,分为应用级模态、窗口级模态和伪模态。应用级模态阻塞整个应用程序,窗口级模态仅阻塞父窗口及其子窗口,伪模态则允许后台代码继续执行。非模态对话框允许用户自由切换窗口,无交互阻塞。实现时需注意内存管理、UI响应性、模态类型选择和线程安全等问题。典型应用场景包括关键操作确认、局部配置、后台任务提示和工具面板等。
2025-05-19 23:23:04
1209
原创 双指针算法总结
环),也就是:left == right (两个指针指向同一个位置)left > right (两个指针错开)• 对撞指针从两端向中间移动。以个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。如果我们要研究的问题出现循环往复的情况时,均可考虑使快慢指针的思想。• 对撞指针的终止条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循。快慢指针又称为龟兔赛跑算法,其基本思想就是使用两个。常见的双指针有两种形式:对撞指针,左右指针。对撞指针一般用于顺序结构中,也称左右指针。
2023-09-05 15:35:46
340
原创 动态规划算法总结
对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。这样才是
2023-08-30 19:18:28
356
原创 深入浅出C++ ——线程库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行了支持,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。常用函数函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程构造一个线程对象,并关联线程函数fn,args1,args2,…为线程函数的参数。
2023-07-20 20:50:19
524
原创 09.计算机网络——套接字编程
socket套接字通常指的是封装了ip和port的结构体,其是网络编程中的一种通信机制,支持TCP/IP的网络通信的基本操作单元,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP 地址,但是我们通常用点分十进制的字符串表示IP 地址,以下函数可以在字符串表示 和in_addr表示之间转换。h表示host,n表示network,l表示32位长整数,s表示16位短整数。
2023-07-20 20:40:52
662
原创 08.计算机网络——其他重要协议和技术
代理服务器的作用:客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,于是人们发明域名,其本质是一个字符串,映射了它和IP地址的关系。 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址。DNS是传输层采用UDP协议的应用层协议。 NAT是一种将私有IP和全局IP相互转化的技术方法,是解决IP地址不够用的主要手段,是路由器的一个重要功能。
2023-07-20 20:37:18
590
原创 07.计算机网络——数据链路层
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后, 选择较小的作为最终MSS,MSS的值在TCP首部的40字节变长选项中。 如果UDP在网络层分成多个IP数据报,这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。 当进行网络通信的时候,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。
2023-07-20 20:36:02
453
原创 06.计算机网络——IP协议
转发过程: 如果要发送的数据包的目的地址是192.168.56.3跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去。 路由是指:多台设备进行通信时,彼此之间发送具有IP特征的数据包,当数据包经过具备路由功能的设备时,设备进行解包并查看IP报文的目的网络地址,并于自身维护的路由表条目进行匹配,符合则进行转发,否则丢弃报文,回应网络不可达。
2023-07-20 20:34:24
777
原创 05.计算机网络——TCP协议
TCP协议——TCP全称为 “(Transmission Control Protocol)”,对数据的传输进行一个详细的控制。
2023-07-20 20:27:09
838
原创 JavaScript——基础知识及使用
JS 分成三个大的部分ECMAScript: 基础语法部分DOM API: 操作页面结构BOM API: 操作浏览器WebAPI 就包含了 DOM + BOM. 所谓的 API 本质上就是一些现成的函数/对象, 让程序猿拿来就用, 方便开发.相当于一个工具箱. 只不过程序猿用的工具箱数目繁多, 功能复杂.
2023-07-19 20:10:31
1370
原创 CSS——基础知识及使用
CSS是层叠样式表 (Cascading Style Sheets)的简写.CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离。
2023-07-19 20:04:28
1296
原创 HTML5——基础知识及使用
html 标签是整个 html 文件的根标签(最顶层标签).head 标签中写页面的属性.body 标签中写的是页面上显示的内容.title 标签中写的是页面的标题.HTML 标签HTML 代码是由 “标签” 构成的.例如:head 和 body 是 html 的子标签.html 是 head 和 body 的父标签.title 是 head 的子标签.head 是 title 的父标签.head 和 body 之间是兄弟关系.标签之间的结构关系, 构成了一个 DOM 树,DO
2023-07-19 19:57:54
2656
原创 04.MySQL——用户管理
初始化mysql_init()链接数据库设置链接的默认字符集是utf8,原始默认是latin1下发mysql命令读取结果该函数malloc了一片内存空间来存储查询过来的数据,所以一定要记的 free(result),不然是肯定会造成内存泄漏的。执行完mysql_store_result以后,数据都存放在MYSQL_RES 变量中。获取结果行数获取结果列数获取列名获取结果内容//按照行读取文件内容,自动更新行数。
2023-07-19 19:28:35
1110
原创 03.MySQL——索引和事务
mysqld本质是一个运行在OS上的进程。对MySQL数据进行操作本质上是对文件进行操作。任何的磁盘数据在进程中操作本质都必须在内存中进行。MySQL在启动的时候,会预先申请一部分内存空间,通过文件系统把文件load到缓冲区中。MySQL进行保存和IO的基本单位(Page)是16KB,OS管理内存的基本单位是4KB,磁盘设备的基本单位是512字节(扇区大小)。根据局部性原理,有很大概率能访问到预加载的数据,所以MySQL的IO交互是 Page相较于用多少,加载多少的方案而言可以提高效率。
2023-07-19 19:25:45
1090
原创 深入浅出C++——C++的IO流
“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据的抽象描述。C++流是指信息从外部输入设备向计算机内部输入和从内存向外部输出设备输出的过程。这种输入输出的过程被形象的比喻为“流”。它的特性是:有序连续、具有方向性。为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能。C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台。使用cin进行标准输入即数据通过键盘输入
2023-05-25 19:42:55
1025
原创 深入浅出C++——C++的类型转换
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型,即类型转换为不相近的类型。编译器以为a不会改,把a放到了寄存器中,打印的时候去寄存器中拿,加volatile可以去掉编译器的优化,拿到内存中正确的值。为了弥补C语言类型转换的缺陷,C++提出了自己的类型转化风格,并且C++中还可以使用C语言的转化风格。向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)类对象的指针或引用(动态转换)。
2023-05-25 19:40:41
1167
原创 深入浅出C++ ——智能指针
auto_ptr的实现是采用管理权转移的思想,在拷贝时(需要的就是浅拷贝,不能改为深拷贝),会导致被拷贝对象悬空,很多公司明确要求不要使用它。weak_ptr不是常规的智能指针,没有RAII,不支持直接管理资源,只用来解决循环引用问题,原理是weak_ptr的next和prev不会增加node1和node2的引用计数。C++11中开始提供更靠谱的unique_ptr ,unique_ptr的实现原理为简单粗暴的防拷贝,解决上述拷贝会出现的管理权转移问题。的shared_ptr。
2023-05-25 19:37:07
1235
原创 深入浅出C语言——字符/字符串操作函数
模拟实现strlen。模拟实现strcpy。模拟实现strcat。模拟实现strcmp。模拟实现strstr。
2023-05-16 22:41:59
619
原创 深入浅出C语言——排序
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤(除了最后一个)即可完成排序。选择排序每一次从待排序的数据元素中选出最小和最大的一个元素,存放在序列的起始位置,在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余
2023-05-12 00:25:23
764
原创 深入浅出C++ ——线程库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。常用函数函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程构造一个线程对象,并关联线程函数fn,args1,args2,…为线程函数的参数。
2023-05-05 15:05:40
539
原创 深入浅出C++ ——异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象捕获一个基类就可以了。} };return str;
2023-05-01 19:04:10
1133
原创 深入浅出C++ ——C++11
1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫C++07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。
2023-05-01 18:03:10
5983
原创 深入浅出MySQL——CRUD
CRUD:语法:[ ]内的元素可以省略案例——创建一张学生表单行数据全列插入 value_list 数量必须和定义表的列的数量及顺序一致。多行数据指定列插入 value_list 数量必须和指定列数量及顺序一致。插入否则更新 由于主键或者唯一键对应的值已经存在而导致插入失败,可以选择性的进行同步更新操作,当导入的数据不存在时则进行添加,有修改时则进行更新。语法:ON DUPLICATE KEY 当发生重复key的时候,将原有的记录修改了案例:替换——REPLACE
2023-04-25 17:22:02
610
原创 01.MySQL——MySQL基础
数据库是数据库专家统一编写的数据库服务,该服务以mysqld的形式呈现,在磁盘上有大量的文件保存数据库和数据库内部的数据,把数据库服务端和数据库及其内部的数据统称为数据库。 总之,数据库是提供较为便捷的数据的存取服务的软件集合或解决方案
2023-04-24 17:36:24
624
原创 04.计算机网络——UDP协议
发送填充是将除了校验和的16位比特位,其余的按照16个比特位相加,在相加的过程中如果出现比特位超过16位的情况需要进行回卷,回卷的策略:最高位+低16位计算出来的新值。如果校验失败,即使数据已经到达了接收方传输层的UDP协议,也会被丢弃,有可能在传输的过程中失真。应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。当数据在应用层会被打上应用层的报头,在报头中会有数据的长度和两个标识,一个标识用来标识是否属于同一条数据,另一个标识用来标识当前数据在整个完整的数据的什么位置,相当于偏移量。
2023-04-18 14:27:17
759
原创 03.计算机网络——HTTPS协议
加密就是把明文(要传输的信息)进行一系列的变化生成密文。解密就是把密文再进行一系列变化,还原成明文。在这个解密和加密的过程中,往往都需要一个或者多个中间数据,辅助进行这个过程,这样的数据被称为密钥。数字指纹/数据摘要,其基本原理是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数字摘要。它并不是⼀种加密机制,但可以用来判断数据有没有被窜改。
2023-04-17 22:45:11
386
原创 02.计算机网络——HTTP协议
应用层程序员写的一个个解决实际问题,基于socket接口之上编写的具体逻辑,满足我们日常需求的网络程序,都是在应用层。这些工作都是与文本处理相关的,所以http协议一定具有大量的文本分析和协议处理。协议协议是一种 “约定”,协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送/报文接收或其他事件所采取的行动。socket api的接口在读写数据时,都是按 “字符串” 的方式来发送接收的。
2023-04-17 22:43:44
849
原创 01.计算机网络——网络基础
路由器接受到数据后,会拆掉数据链路层的MAC头部信息,将数据包送往网络层,路由器将检测数据包头部的目标IP地址信息,并根据该信息进行路由转发,将数据报文转发到下一路由器上,在转发前要重新封装新的MAC头部信息,并将数据转换成二进制。协议本质就是软件,软件是可以“分层”的,所以协议在设计的时候就是按照层状划分的。协议是双方约定同一种语言,进行沟通,计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式。
2023-04-13 18:13:19
618
1
原创 Linux学习笔记——多线程
vm_area_struct 进程的虚拟地址空间中,堆分配的空间在逻辑地址上是连续的,但在物理地址上是不连续的。OS使用vm_area_struct结构体来细粒度划分进程中的堆区资源,vm_area_struct结构体中包含着标记位start和end,来描述堆空间,采用双链表来组织堆空间数据。页帧和页框 可执行程序就是一个文件,用户的可执行程序是按照地址空间的方式进行编译的,可执行程序按照区域被划分为了以4KB为单位的区域,这每4KB的区域称为一个页帧,物理内存每4KB的块称为一个页框。程序加载到物
2023-04-12 20:02:59
1669
原创 Linux学习笔记——进程信号
信号的概念生活中的信号有红绿灯、闹钟、狼烟等,为什么人类能识别这些信号呢?是因为我们记住了对应场景下的信号和后续应该做的动作,也就是识别了这个信号。在我们的大脑中能识别信号,且即使无法理解处理的时候,也一定会被临时记住。Linux信号本质上是一种异步通知机制,用户或操作系统通过发送一定的信号,来通知进程某些事件已经发生,该进程可以后续进行处理。进程要处理信号,必须具备识别信号的能力,包含看到信号和处理动作。
2023-04-09 22:46:39
985
原创 Linux学习笔记——文件IO
文件=内容+属性,内容和属性都是数据,对于文件的所有操作无外乎对于文件内容操作和对于文件属性操作。文件在磁盘存放,磁盘是硬件,只有操作系统才有权利访问硬件。用户访问文件先写代码再编译形成可执行程序,该程序运行起来才能访问文件,所以访问文件本质上是进程在访问文件。进程访问文件需要操作系统提供的文件类的系统调用接口来访问。系统调用接口比较难,语言上对这些接口进行了封装,为了让接口可以更好的使用,导致了不同的语言有不同的文件访问接口,但是封装的是同一个操作系统接口,而操作系统接口只有一套,这也是学习它的价值。
2023-04-05 14:33:31
504
原创 深入浅出C++ ——哈希的应用
数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:在布隆过滤器中查找"alibaba"时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其他元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。,表示一个数是否在可以分为四种情况,0次可以用00表示,1次可以用01表示,2次可以用10表示,三次及其以上使用11表示。位图速度快,省时间,采用直接定址法,不存在哈希冲突。
2023-02-23 22:33:27
868
原创 深入浅出C++ ——哈希
在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,unordered系列的关联式容器的底层结构采用哈希结构。map/set的遍历是有序的,而unordered系列容器遍历是无序的。map/set是双向迭代器,而unordered系列容器只支持单向迭代器。但是当对大量数据进行增删改查时,unordered系列容器的效率更高,尤其是查找的效率。
2023-02-23 17:08:15
990
原创 深入浅出C++ ——红黑树模拟实现STL中的set与map
但是在插入的过程中,比较大小时,不能用data来比较,因为对于map而言,data是pair,要用pair中的first来比较,可以使用。如果该节点的右子树为空,就找祖先里面孩子不是祖先的右的那个。如果该节点的右子树为空,就找祖先里面孩子不是祖先的左的那个。如果要生成map,就传(key,pair),由第二个参数来控制生成容器的结构。红黑树作为set和map的底层容器,既要实现插入key又要实现插入pair,所以做了稍许的改动,使其成为一颗。红黑树的begin迭代器是整棵树的最左侧节点,end迭代器是空。
2023-02-23 11:28:03
810
原创 深入浅出C++ ——手撕红黑树
/节点的值域 Colour _col;//节点的颜色 RBTreeNode < K , V > * _left;//节点的左孩子 RBTreeNode < K , V > * _right;//节点的右孩子 RBTreeNode < K , V > * _parent;//节点的双亲 };
2023-02-22 19:21:54
961
原创 深入浅出C++ ——手撕AVL树
在前面的文章中介绍了map / multimap / set / multiset 容器,这几个容器的底层都是按照二叉搜索树来实现的。但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N)。因此 map、set 等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。
2023-02-22 17:15:36
911
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人