自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (1)
  • 收藏
  • 关注

原创 Qt 信号与槽机制

当信号发送者 sender 或接收者 receiver 被销毁时,Qt 会自动断开所有相关的信号与槽的连接(一个信号可以连接多个槽,一个槽可以被多个信号所连接),所以通常无需手动 disconnect。槽函数可以像普通函数一样直接调用,无需通过信号触发,且槽函数支持重载(多个同名但参数不同的槽函数)。信号 和 槽 的本质都是函数,子类会自动继承父类的所有信号和槽(包括直接父类和间接父类)。接收 信号 的前 N 个参数(N 为槽函数的参数数量),多余的信号参数被自动忽略。是,在特定事件发生时,发出的通知;

2025-03-14 11:03:20 865 1

原创 Parser 模块:HTML 解析与数据清洗

筛选出所有 .html 文件,为后续解析提供数据源;从 .html 文件中提取 title、content ,并构造对应官网的 url 地址;将清洗后的数据按自定义格式存储为文本文件,便于后续建立索引。本文主要讲解编写 Parser 模块过程中涉及的部分知识。boost::filesystem 是 Boost 库中的一个组件,用于跨平台处理文件系统路径、文件操作和目录管理。它提供了面向对象的接口,简化了文件和目录的创建、删除、遍历等操作。

2025-03-09 02:46:23 1033 13

原创 Qt 对象树详解:从原理到运用

对象树是一种基于父子关系的对象管理机制。在 Qt 中,所有继承自QObject的类都可以参与到对象树中。当一个对象被设置为另一个对象的父对象时,子对象会被添加到父对象的内部列表中,形成一种树状结构。Qt 提供了一个调试工具方法,可以帮助开发者打印对象树的结构。

2025-02-27 00:53:46 1212 22

原创 Qt 事件处理:理解处理器、过滤器与事件系统

如果希望在事件滤波器 B 处理完事件后,仍然让目标对象 A 继续处理该事件,可以在事件滤波器逻辑的末尾 return false。例如,用户按下鼠标左键,会产生一个 QMouseEvent 对象,该对象包含了关于鼠标点击的所有信息,包括点击的位置、按钮的状态等;事件过滤器允许拦截发送给某个对象的所有事件,并在这些事件被该对象处理之前,决定如何处理它们。每个事件对象包含该事件的所有相关信息,如:鼠标事件包含鼠标的坐标、按下的按钮等信息。当用户与应用程序进行交互,或系统内部发生某些变化,就会产生相应的事件。

2025-01-31 14:45:22 1841 28

原创 Qt 控件与布局管理

QWidget是所有界面对象的基类,代表了一个可以显示和交互的窗口部件(控件),如:按钮、标签、窗口。每个QWidget可以有自己的几何属性(位置、大小)、样式、事件处理机制等。QLayout是一个抽象基类,用于管理一组QWidget的布局。它的主要作用是,自动调整这些控件的位置和大小,以便它们能适应不同的窗口大小和分辨率。。

2025-01-22 10:41:18 1591 20

原创 从 SQL 语句到数据库操作

在 MySQL 中创建一个新的数据库时,会在文件系统上为该数据库创建一个对应的目录。这个数据库通常包含了与该数据库相关的、所有表的数据文件、索引文件、以及其它文件。​ 适合读密集型应用,但在高并发写场景时可能会遇到性能瓶颈。删除表中的一个字段时,该字段及其对应的所有数据都将被永久删除。​ 适用于需要频繁写入操作,和事务支持的应用场景。不同的存储引擎可能会以不同的方式组织这些文件。: 用于控制访问权限和管理数据库的安全性。: 用于添加、删除、更新数据库中的数据。插入新字段后,对原来表中的数据没有影响。

2025-01-13 00:33:03 2003 21

原创 讨论 Linux 内核中的连接处理机制

在 Linux 内核中,不同类型的套接字(TCP / UDP)通过一系列嵌套的结构体来实现其特定的功能。当应用程序创建一个 TCP / UDP 套接字时,内核会分配相应的。这种双向关联使得内核能够在需要时,在两者间进行导航。同时,内核会为该套接字分配一个唯一的文件描述符。对象,这些对象包含了协议特定的状态和操作。系统调用时,内核会为该套接字分配一个。结构体,该结构体中包含一个指向具体。结构体,并初始化其中的。

2025-01-04 07:30:00 418 18

原创 网段划分和 IP 地址

这种方式可以有效分配 IP 地址,避免地址浪费,特别是在 IPv4 地址资源有限的情况下。每一个连接到互联网的设备,都需要一个公网 IP 地址,以便其它设备可以与之通信。​ 如果在子网内新增一台主机,这台主机的网络号与子网的网络号保持一致,但主机号不能与子网中其他主机的主机号重复。地址分配:为每个连接到公网的设备分配一个唯一的 IP 地址,确保数据能被准确地发送到目标设备。IP 协议是网络层协议,主要负责在不同网络设备之间,进行数据包的地址分配和路由选择。不同字网间,可以有相同的 IP。

2025-01-01 18:01:37 2660 12

原创 滑动窗口、流量控制和拥塞控制

既然发送一条数据,接收一个 ACK 后,再发新数据的方式效率太低。那么,一次性发送多条数据,就可以大大提升性能。​ 当发送方接收到对滑动窗口中的数据确认后,窗口右移,被确认的数据被移除窗口,新的、未被发送的数据进入窗口。TCP 拥塞控制的主要目的是,防止过多的数据被注入网络,导致网络拥塞,从而保证数据段高效、可靠的传输。一次性发送 3 个数据段,收到第 1 个 ACK 后窗口向右移动,发送第 4 个数据段。这种情况下,部分的 ACK 包丢失无影响,可以通过后面的 ACK 包确认数据已顺利到达。

2024-12-30 02:07:37 936 13

原创 TCP 连接:三次握手与四次挥手

TCP 协议,全称为“传输控制协议”。

2024-12-29 07:30:00 2331 14

原创 快速上手 muduo

以词典服务与客户端为例的实战教程。

2024-11-08 09:45:00 586 44

原创 HTTP 协议

HTTP 是超文本传输协议,它是互联网上应用最为广泛的一种协议,主要用于浏览器和 web 服务器之间的的数据传输。

2024-11-02 09:45:00 4442 46

原创 进程组、会话 与 守护进程

不仅创建一个新的会话,还会使调用进程成为新会话的领导进程,且该进程不能已经是任何进程组的组长。在**当前会话(SID:32813)**中启动 tcpserver,在另一个终端中再次运行。进程组定义:一组相关进程的集合;我们可以通过发送信号到整个进程组来控制这些进程,如使用。,通常是为了执行特定的任务或等待处理某些事件。命令,查看当前的进程及其会话信息。函数用于将当前进程转化为守护进程,:不关闭标准输入、输出、错误流。终止整个管道中的所有进程。会话通常由一个登入会话创建,那么,如何创建守护进程?

2024-10-25 09:45:00 948 31

原创 TCP 开发常见接口解析

本文从 TCP 通信与 UDP 通信之间的差异入手,从服务端和客户端两个角度详细介绍 TCP 通信的主要手段,并探讨两者在发送消息上的理解差异。

2024-10-24 09:45:00 1115 29

原创 基于 UDP 协议的 socket 编程:实现 UDP 服务器

假设应用A的客户端程序显式绑定了8080端口,启动应用A之后,同样显式绑定了8080端口的应用B将无法被启动,因为该端口已被占用。作为 IP 地址绑定在套接字上 —— 这种做法可以使服务端程序接收来自任何网络接口的连接请求,而不仅仅是特定 IP 地址。如果客户端程序显式绑定了一个特定端口号,那么启动该程序之后,同一机器上其他需要使用相同端口号的程序将其无法启动。OS 会在第一次使用套接字时,自动分配一个临时端口,并将其与套接字绑定。结构,以便传递给网络相关的系统调用函数。结构是一个通用的网络地址结构。

2024-10-16 09:45:00 2408 32

原创 构建基于 阻塞队列 / 环形队列 的高效生产消费者模型系统

生产-消费者模型:一个或多个生产者线程产生数据并将其放入共享缓冲区,同时一个或多个消费者线程从该缓冲区中读取数据进行操作的情景。缓冲区是一个用于存储生产者产生数据的中间容器;缓冲区的容量通常是有限的,只能容纳一定数量的数据项。1. 线程与线程之间的同步与互斥关系;生产者与消费者之间的等待和唤醒机制。生产者-消费者模型是一类多线程编程问题,涉及一次性创建多个生产者线程和消费者线程,并将其高效组织起来;生产者线程负责生产任务并将其放入共享队列中,消费者线程负责将任务取出并执行;

2024-10-12 09:45:00 1014 29

原创 信号处理: Block Pending Handler 与 SIGKILL/SIGSTOP 实验

用于初始化一个信号集为空,即将信号集中的所有信号位都清零。创建一个sigset_t类型的变量,在对该变量进行各种信号处理操作之前,先要使用对该变量初始化。// 对 sig 初始化, success -> 0, fail -> -1sigaddset:用于在一个已存在的信号集中添加信号。:用于更改当前进程的信号掩码,简单来说即设置哪些信号被阻塞。​how的处理方式,SIG_BLOCK​SIG_BLOCK: 设置新的信号掩码,同时保留旧的信号掩码​。

2024-09-28 10:00:00 1426 27

原创 构建与优化自定义进程池

简单来说,进程池就是预先创建固定数量的工作进程,通过设计任务队列或调度算法来分配任务给空闲的进程 —— 实现“负载均衡”。

2024-09-22 09:45:00 1215 28

原创 软硬链接与动静态库概览

创建一个新文件,“file” 和 “.” 同时建立了与 inode — 528280 的映射关系,故引用计数为 2。要了解 “为什么一个新目录的引用计数为 2”,首先需要明晰一个概念:Linux 中,一切皆文件。硬链接 是通过 inode 引用另外一个文件,软链接 是通过 名字 引用另外一个文件;// gcc -fPIC -c [所有必须的 .c 文件]// 将 [所有.c] 文件编译成 [.o] 文件。,才被加载到内存中的库,不会在编译阶段合并到可执行程序中。

2024-09-12 09:00:00 539 11

原创 特殊类设计

C++ 98:将 拷贝构造 和 赋值重载 只声明不定义且私有化。C++ 11:error C2280: “Copy_Ban::Copy_Ban(Copy_Ban &)”: 尝试引用已删除的函数核心步骤只有 3 条:创建对象:3. 请设计一个 只能在栈上创建对象 的类将构造私有化通过特定接口创建对象将 operator new (operator delete)封死创建对象:何时需要删除 ?你的类被设计成不可复制的(既不能被拷贝构造,也不能被赋值)。你的类包含了一些不允许复制的

2024-07-17 09:00:00 979 26

原创 C++ 智能指针

混淆:智能指针的出现,是为了。

2024-07-14 09:00:00 541 17

原创 包装器 std::function

是 C++标准库 中的一个通用;、绑定的成员函数、等。

2024-07-10 09:00:00 363 14

原创 lambda 表达式

传值捕捉时,mutable 可以取消参数的常性,使其在函数体内能被修改。不使用时,可以省略;,且 lambda表达式 的名称是编译器根据特定算法实时生成的、保证不重复。此处解释了,“为什么 lambda表达式 之间不能相互赋值”。:函数体的返回值类型,通常可以省略,由编译器自行推导。C++11 中,最简单的 lambda 表达式为。不需要传递参数时,可以连同。的方式不是类重载“函数调用运算符”吗?不可省略(即使参数列表为空)。通过以上场景,可以看出。,但它没有任何作用。

2024-06-20 09:30:00 468 20

原创 右值引用和移动语义

通俗来讲,可以出现在赋值语句左侧的,为左值;只能出现在赋值语句右侧的,为右值。左值能取地址,但右值不能。本文主要通过三个场景 —— 与移动构造、移动赋值、完美转发有关,讲解右值引用在实际场景中的作用及其相关的知识。右值通常也被形象的称为“将亡值”,代指赋值重载和拷贝构造过程中产生的临时对象。public:// 拷贝构造 -- 左值cout << "string(const string& s) -- 深拷贝" << endl;// 拷贝赋值。

2024-06-14 09:30:00 1179 19

原创 C++11 列表初始化(initializer_list),pair

的使用范围,使其可用于所有内置类型和自定义类型。是 C++11 引入的一个模板类型,用于处理一组。初始化或传递一系列相同类型的值。C++98 中,允许使用。

2024-06-09 08:30:00 636 17

原创 布隆过滤器

假设 “Tencent” 与 “Baidu” 映射到同一 pos2 ,删除 “Tencent” ,将无法再查询到 “Baidu”。Set("Tencent") ——> 经过一系列哈希函数的映射,对布隆过滤器底层数据结构上 pos1、pos2、... 等位置进行标记;所对应的 pos1、pos2、... ,那么即便没有插入 “Tencent” ,Test(Tencent)的结果仍然为。经这一系列哈希函数映射的、对应底层数据结构的位置,是否都被标记,得出结论。——> 换一个哈希函数,把该小文件。

2024-05-18 19:09:51 337 24

原创 位图和布隆过滤器:位图

在《和》 中提到过:哈希是一种思想,通过哈希函数将数据转化为一个或多个整型 —— 映射关系;通过这种映射关系,可以做到以 O(1) 的时间复杂度查找数据。本文即将介绍的和就是两个非常典型的哈希思想的应用成果,可以在的同时,。

2024-05-16 09:00:00 834 20

原创 unordered_map 和 unordered_set

unordered——,从表面上来看,与 map 和 set 不同之处就在于,unordered_map 和 unordered_set 无法保证插入数据是有序的;尽管如此,由于这两种容器内部封装了“哈希桶”,可以实现—— 这一优点与 map 和 set 相同。其实,在我们模拟过 map set 的基础上,再学习封装 无序map 和 无序set 实在简单。因此,。哈希哈希表 / 哈希桶。

2024-05-14 09:00:00 1283 17

原创 开散列哈希桶

通过 HashFunc 计算每个元素的哈希地址,哈希地址相同的元素所组成的子集称为 哈希桶,这些元素通过单链表链接在一起。。开散列的每个桶中存的都是发生哈希冲突的元素。

2024-05-13 08:45:00 446 10

原创 闭散列哈希表

哈希。

2024-05-11 09:00:00 1009 14

原创 通过红黑树封装 map 和 set 容器

template // 与 list 迭代器处没有区别,Ref —— T& ,Ptr —— T*{}迭代器指向节点的右子树不为空时, operator++() 的下一个位置就是其右子树的最左节点。迭代器指向节点的右子树为空,意味当前节点所在的左子树已经全部访问完了,operator++() 的下一个位置是当前子树为左子树的最近祖宗节点。

2024-05-09 12:16:13 756 16

原创 红黑树(RBTree)认识总结

红黑树是一种二叉搜索树,与普通搜索树不同的是,在每个节点上增加一个“颜色”变量 —— RED / BLACK。通过对各个节点颜色的限制,确保从 根 到 NIL,没有一条路径会比其他路径长出两倍。

2024-05-07 08:30:00 690 18

原创 平衡二叉搜索树(AVL)旋转

单独开一章节介绍 RotateL 、 RotateR 及更复杂的 LR 和 RL 型旋转,更多是为了红黑树的旋转部分做铺垫;由于 AVL 树和红黑树发生旋转的判断标准不同 —— 分别为平衡因子和节点的颜色,两棵树左旋和右旋的在细节上会有一些差异,但从整体来看,二者的精神一致。关于如何快速记忆什么时候为左旋、右旋、或左右旋、或右左旋,有一个小技巧:当左树更高,需要向右调整高度,此时右旋;当右树更高,需要向左调整高度,此时左旋 … …

2024-05-06 08:00:00 617 8

原创 map::operator[] 底层大致介绍及与 map::insert() 区别

把该式的返回值结果记为 pair<Iterator_pair_val, bool>假设 map 中已经存在 pair<key1, value1>,需要对 insert 的返回值进行一系列操作,才能实现。调用 insert(pair<key1, value2>)为了方便后续讲解,把创建的。变量记为 pair_val。,因此在这种情况下,

2024-05-05 10:42:28 450 5

原创 模板进阶:非类型模板参数,特化

非类型模板参数,就是用一个常量作为 类/函数 的模板参数,在 类/函数 中可以被当成常量使用。一般情况函数模板无法实例化出满足要求的函数,我们通常给出具体实现——更简单、方便。首先给定一个 Date 类,并完善必要的函数及运算符重载,以便后续介绍相关概念。如果想要做到通过指针就能完成对日期大小的比较,则需要。全特化:将模板参数列表中所有参数都给明。下,Less(p1, p2) 是在。

2024-03-16 10:57:01 745 28

原创 C++ 反向迭代器的设计与实现

为了使我们的反向迭代器能快速用起来,优先实现 ++ , * , -> ,!= 等功能,其余以此类推。重载 ++--cur;--cur;return tmp;// 存在隐式类型转换 <--> ReverseIterator<Iterator>(tmp);“为什么前置++ 的返回值不能是 cur?error C2440: “return”: 无法从“Iterator”转换为“ReverseIterator<int *> &”重载 * :引入一个模版参数 Ref--tmp;

2024-02-29 13:10:45 697 15

原创 stack_queue:三个关键注意事项解析

使用过程中存在大量“头删”——pop_front(),用 vector 进行封装效率太低,故。就是一个仿函数——从根往叶子节点看,数值/优先级 越来越小,因此默认为大堆;的重载,故 priority_queue 不支持底层使用 list。时——_con[child] > _con[parent],要。—— 从根往叶子节点看,数值/优先级 越来大,则建小堆。为容器,在实例化创建对象时,我们可以传。,在插入和删除时,通常会涉及。实现,其实例化对象可以。queue 的原则是。

2024-02-03 08:00:00 483 18

原创 C++ STL中list迭代器的实现

list 的模拟实现中,重难点在于迭代器功能的实现,因此本文只围绕iterator及的设计进行介绍,其余如增删查改则不再赘述——在C语言的基础上,这些都非常简单。与 string / vector 不同,list 的节点原生指针不能通过简单的 ++ / * 等实现迭代器,因此我们需要节点指针封装自定义类型运算符重载,完成迭代器的设计。为了与 STL中list 进行区分,我们在创建的命名空间内实现。

2024-01-28 14:33:49 853 13

原创 解决 Linux git push 贡献者不同(没有出现绿点)的问题

【代码】解决 Linux git push 贡献者不同(没有出现绿点)的问题。

2023-12-22 08:00:00 1136 8

原创 【make/Makefile】Linux下进度条的设计与实现

Makefile 和 makefile 不区分大小写,但是一定只能是 “makefile”!!!make是一个指令,makefile是一个文件。使用 make 生成目标文件时,默认从上到下扫描 Makefile 文件,默认形成的是第一个目标文件——默认只生成一个。

2023-12-21 08:00:00 563 2

解决WIn11画图问题

解决WIn11画图问题

2023-12-29

空空如也

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

TA关注的人

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