自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Qt Object:社区安防系统

系统采用成熟的客户端/服务器架构,保障了应用的稳健运行和未来的扩展潜力。客户端之间的通信通过JSON格式进行,这种格式不仅简洁,而且提高了信息交换的效率。同时,系统利用TCP协议确保数据传输的可靠性和稳定性,为社区安防提供了坚实的技术支撑。1.sql模块:该模块提供了对数据库的访问支持。1.通过QTcpSocket使用TCP协议对客户端与服务端之间的数据进行传输,并且使用JSON格式对传递的数据进行格式化操作。社区安防系统,主要参考市场上主流的安防检测应用开发,例如社区人脸识别,校园出入打卡等。

2024-07-16 20:49:29 465

原创 Qt Creator:C++与Python混合编程

由于作者本人喜欢使用PyCharm进行Python代码的编写,一些环境配置都统一配置到Anaconda环境中,大家可以在Anaconda Prompt窗口执行conda env list指令进行查询环境的路径,如下图,其中Python解释器位于Summary_Library文件夹中。2.选择Python库文件路径后,添加库路径和依赖路径(红框为自定义添加的路径,上方路径是导入Python库后自动添加的路径),其自定义添加的路径就是选择的Pythom库路径下的include文件夹。图3.Python解释器。

2024-07-16 20:23:01 384

原创 Qt Object:智能即时聊天室项目

3.通过QNetWork模块,对其鉴权元素进行处理,对特定的地址进行POST请求,获取Token。5.针对用户作输入操作时,该项目采用正则表达式检测用户异常输出,防止恶意的SQL注入攻击及不规范的输入,减少服务端的恶意请求,降低成本。4.针对列表模块使用了模型/视图架构,针对好友,群聊以及智能聊天机器人分别对其映射,将数据与视图隔离,规范了代码,降低耦合。6.针对用户登录时,项目使用MD5加密算法对其密码等数据进行加密,减少用户被恶意攻击,数据泄漏的几率。

2024-06-22 14:59:48 718

原创 GDB:从零开始入门GDB

在日常开发中,调试是我们必不可少的技能。在GDB调试中,我们会经常遇到循环,为了方便输出循环中的值,我们可以使用print指令输出,但是每一次执行后都执行一遍print指令则会十分麻烦。在调试过程中,我们在代码中也可能会经常使用printf或者cout函数来输出代码中执行的变量信息,这样能实时的观察到变量值的变化,方便我们定位代码的Bug。在关于《MinGW:从入门到链接库》的文章中,曾对如何开启代码调试,关闭调试进行简单的讲解,在对GDB调试工具讲解之前,先简单回顾以下这些内容。

2024-06-15 20:10:45 1339

原创 Python:处理矩阵之NumPy库(下)

本篇文章作为介绍NumPy库的最后一章,其内容包含常用的NumPy函数以及关于ufuns的广播机制。跟本系列的其他文章一样,本篇文章也是对函数的参数进行讲解,提供代码示例。代表接收的数据,数组或字符串;字符串使用","或空格分隔列,使用";传入的data如果是数组,表示根据数组创建对应的副本,默认为True创建副本。字符串使用","或空格分隔列,使用";PS:在分隔不等量的数组时,分隔后的第一个数组占多数,其他按比例分隔。代表分隔方向,默认为1横向,0代表纵向。代表分隔方向,默认为1横向,0代表纵向。

2024-06-12 22:14:14 942

原创 Makefile:从零开始入门Makefile

在构建项目的时候在哪个目录下执行构建make命令,则这个目录下的makefile文件就会执行,因此在一个项目中可以存在多个makefile文件,分别位于不同的项目目录中。:查看当前规则的目标文件和依赖文件的修改时间,如果目标文件修改时间晚于依赖文件则不执行操作,早于依赖文件则执行步骤3。:当规则中的依赖文件不存在时,则会遍历Makefile文件中的其他规则,寻找能生成当前依赖文件的规则,并执行。:查看Makefile文件的规则中的依赖文件是否存在,存在则执行命令,不存在则执行步骤3。

2024-06-10 09:55:22 1340

原创 Python:处理矩阵之NumPy库(中)

PS:函数onse有着zeros函数一样的特点,可参考zeros函数的总结,主要原因是由于shape代表的是数组尺寸。代表存储多维数组时,是行优先('C')还是列优先('F')。PS:使用shape函数输出维度,一维数组只输出列数,二维数组输出行数和列数,以此类推。代表是否做引用计数检查,如果为False,则不会检查引用计数。代表展平方式,沿横轴还是纵轴,默认为'C'横轴展平,'F'为沿纵轴展平。代表存储多维数组时,是列优先'F'还是行优先'C',默认为行优先。代表数组中的元素的数据类型,默认为None。

2024-06-09 13:25:20 1085 1

原创 Git:从配置到合并冲突

本章将重点讲解Git的使用。Git是是目前世界上最流行的版本控制系统,广泛应用于软件开发中,帮助开发者管理代码的变更历史,支持多人协作开发。了解如何使用Git,如何提交代码,如何解决冲突,能帮助我们更快的上手团队项目Git的下载与初始化配置关于Git的下载可以通过官网进行下载,以下是官网链接:图1.如何下载Git在下载完Git后,我们可点击右键,选择Open Git Bash here打开Git命令窗口图2.打开Git命令窗口。

2024-06-09 12:54:40 880

原创 Python:处理矩阵之NumPy库(上)

NumPy库是一个开源的Python科学计算库,它提供了高性能的多维数组对象、派生对象(如掩码数组、矩阵)以及用于快速操作数组的各种例程,包括逻辑、形状操作、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等操作,本系列博客讲重点对NumP库的函数已经操作进行讲解

2024-06-08 23:12:49 998 1

原创 Linux:动态库和静态库的编译与使用

在《MinGW:从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库,本篇博客将详细的对Linux下编译动态链接库和静态链接库以及使用进行讲解,刨析创建库文件的时候Linux做了哪些操作。1..Linux下的动态链接库的命名规则为lib+文件名+.so,所以Linux中以.so结尾的文件,一般可以视为动态链接库的文件。1..Linux下的动态链接库的命名规则为lib+文件名+.a,所以Linux中以.a结尾的文件,一般可以视为静态链接库的文件。动态链接库在程序运行时被加载,而不是在编译时。

2024-06-08 12:35:07 982

原创 数据结构:顺序栈

顺序栈(Sequential Stack)是一种使用数组来实现的栈数据结构。栈是一种后进先出(Last In First Out, LIFO)的数据结构,只允许在栈顶进行数据的添加(push)和删除(pop)操作。如果栈已满,这可能会触发数组的扩展(如果使用动态数组):移除栈顶的元素,并返回它。:元素只能从栈顶添加或移除,这保证了最后添加的元素将是第一个被移除的。:在栈满时,如果使用动态数组,可以自动扩展数组的大小以容纳更多元素。:顺序栈通常使用一个固定大小或动态大小的数组来存储栈中的元素。

2024-06-07 19:35:03 366

原创 数据结构:顺序串

在顺序串中,字符串被存储在一个连续的内存块中,通常是数组或动态数组(如C++中的。顺序串的主要优点是它提供了一种简单且高效的方式来访问和修改字符串中的字符。:由于字符串存储在数组中,任何字符都可以在常数时间内被访问,即O(1)时间复杂度。:在需要频繁访问和修改字符串的场景下,顺序串提供了一种高效的数据结构。:可以在字符串的任何位置插入字符,但可能需要移动插入点后的所有字符。:可以从字符串中删除任何字符,但可能需要移动删除点后的所有字符。:字符串的所有字符都存储在连续的内存位置,这有助于提高访问速度。

2024-06-07 19:25:12 373

原创 数据结构:哈夫曼树及其哈夫曼编码

哈夫曼树(Huffman Tree)是一种特殊的二叉树,由David A. Huffman在1952年发明的,用于数据压缩领域。它将每个字符映射为一个唯一的二进制串,这些二进制串的长度不同,且是根据字符出现频率来确定的。频率越低的字符,其编码越长。:从根节点开始,向左子树走标记为0,向右子树走标记为1,直到到达叶节点,此时叶节点对应的字符的路径标记就是其哈夫曼编码。2.从队列中取出两个权重最小的节点,创建一个新的内部节点,其权重为这两个节点权重之和。:所有叶节点的权重乘以其到根节点的距离之和是最小的。

2024-06-07 19:11:35 2054

原创 数据结构:线索二叉树

线索二叉树(Threaded Binary Tree)是一种对普通二叉树的扩展,它通过在树的某些空指针上添加线索来实现更高效的遍历操作。线索二叉树的目的是减少查找特定节点(如前驱或后继节点)所需的时间,从而提高树的搜索效率。:每个节点的前驱是其在中序遍历中直接前的一个节点,后继是直接后的节点。线索二叉树允许我们通过线索快速找到这些节点。:在二叉树的空指针(左子树或右子树的指针)上添加线索,这些线索可以指导我们找到节点的前驱或后继。:线索二叉树是基于普通二叉树的,它保留了二叉树的所有性质。

2024-06-07 19:11:00 501

原创 数据结构:共享栈

共享栈(Shared Stack)是一种内存管理技术,通常用于操作系统和编程语言的运行时环境中,以支持多线程或多进程的程序。:在多线程环境中,线程切换时可以更快速地保存和恢复执行状态,因为所有线程都使用同一个栈。:操作系统或运行时环境可以更简单地管理内存,因为它们只需要维护一个共享的栈结构。:共享栈的使用需要考虑到安全性问题,确保一个线程的操作不会破坏其他线程的数据。:共享栈可以减少内存的使用,因为它避免了每个线程或进程都需要自己的栈空间。

2024-06-06 23:13:09 252

原创 数据结构:单链表

/定义函数InitList用于初始化不带头结点的单链表//定义函数CheckList用于查看不带头结点的单链表是否为空//定义函数InitNodeList用于初始化带头结点的单链表//定义函数CheckNodeList用于查看带头结点的单链表是否为空//定义函数CheckOrder用于遍历链表查找结点并判空//定义函数InsertNextNode用于在指定结点进行后插操作//定义函数ListDelete用于按位序删除数据//定义函数NodeDelete用于指定结点删除数据。

2024-06-05 20:03:22 639

原创 数据结构:顺序表

顺序表的实现通常依赖于数组。:在顺序表中插入或删除元素可能需要移动其他元素以维持元素的连续性,这通常会导致较高的时间开销(O(n))。:顺序表通过数组实现,数组中的每个元素都紧密排列在内存中,这意味着可以通过索引快速访问任何元素。:顺序表利用了空间局部性原理,即访问过的元素附近的元素很可能也会被访问,这可以提高缓存利用率。:顺序表可以是静态的,即其大小在创建时就固定,也可以是动态的,即其大小可以根据需要调整。:由于顺序表基于数组,它支持随机访问,即可以在O(1)时间复杂度内访问任何位置的元素。

2024-06-04 19:01:08 533

原创 数据结构:链式队列

链式队列,指的是使用链表实现的队列,是一种常见的数据结构。队列遵循先进先出(FIFO)的原则,即最先进入队列的元素将是最先被移除的元素。链式队列通过链表的动态特性来实现队列的插入和删除操作,提供了比静态数组实现的队列更高的灵活性。: 链式队列需要维护两个指针:队首指针(指向队列的第一个元素)和队尾指针(指向队列的最后一个元素)。: 由于链式队列的元素是动态添加的,因此需要使用动态内存分配来创建新的节点。: 链式队列由一系列节点组成,每个节点通常包含两个部分:数据部分和指向下一个节点的指针

2024-06-03 22:50:30 638

原创 Qt Object:基于TCP协议的视频通话项目

设计思想是为了实现多个用户同时视频的功能,但是没实现服务端,于是把服务端使用的QTcpServer转到客户端实现,写Demo时本人将更多考虑的是提供更强的可扩展性。:该模块提供了音频和视频播放、录制以及处理的基本功能。:该模块提供了一组预构建的多媒体小部件,使得开发者可以快速地在应用程序中添加多媒体播放和控制功能。由于本机只有一个摄像头,就不能开另一边的摄像头了,后续会把Demo的github地址发布在评论区。以下函数为初始化设备的函数,针对Ui文件中控件名称的不同可以修改对应的指针,完成效果。

2024-06-01 17:53:05 1582 3

原创 Linux:Vim的安装及使用

这篇论文主要对Linux下关于Vim文本编译器进行讲解,一步步从具体的Vim下载,使用进行讲解,废话不多说,期待带来更多的优质文章(PS:作者是在Centos下存在,如果使用Ubuntu的同学,可以针对特定情况进行指令的修改哈!但关于Vim的指令基本没有差异)由命令模式进入末行模式只需要在命令模式中输入":"即可,末行模式支持对文件的保存,文本替换,分屏等操作,以下便对末行模式进行讲解。:末行模式中的替换相较于命令模式,区别在于可选中被替换的关键字或者多个行中替换指定的关键词,具体操作如下。

2024-05-30 10:21:32 896

原创 STL源码刨析:序列式容器之list

list的迭代器定义和结构。

2024-05-28 20:46:59 692

原创 STL源码刨析:序列式容器之vector

本系列将重点对STL中的容器进行讲解,而在容器的分类中,我们将容器分为序列式容器和关联式容器。本章作为容器的实现源码的讲解,将简单介绍这两种类型的容器的区别,再对每一个类型所含的容器的实现源码进行讲解。

2024-05-26 21:02:29 1073

原创 C++高并发内存池:PageCache层

由上文我们知道,PageCache层不仅要实现对CentralCache层分配内存和对其释放的内存进行管理,我们还需要针对PageCache层设计锁,保证在同一个时间内只有一个来着CentralCache层的哈希桶向PageCache层申请内存,而且我们还需要实现当PageCache层内存不足时,向OS申请内存的接口以及当PageCache层内存多余时,向OS释放内存的接口。PS:以上便是PageCache层的实现代码,重点是思路,提供的代码只作参考作用!大于256KB的内存申请和释放。

2024-05-22 19:58:46 571 1

原创 C++高并发内存池:CentralCache层

且每一个Span用于下标不同,所以指向的分配内存也会不同,当一个Span指向的内存大于一页时,我们还需要定义存储页数的变量,通过这两个变量我们还可以快速定位内存的区间。根据上一小节我们知道,CentralCache层存储的对象是一个一个的哈希桶,而哈希桶内存储的对象是一个类型为Span的双向链表,所以我们也得设计一个类似于ThreadCache的单向链表一样的变量存储这个双向链表,而且这个单向链表的类型还需要具备有进栈,出栈,插入和删除的功能。PS:为方便遍历寻找空闲的地址进行分配,所以设计为双向链表。

2024-05-21 20:44:26 725 1

原创 C++高并发内存池:ThreadCache层

由图可看出,ThreadCache存在一个链表,该链表的每一个元素的指向一个节点(取名为FreeList),该节点存在两个成员类型,一是指向下一个节点的指针,二是指向对应内存大小的指针,故ThreadCache也属于一种哈希桶的结构。为什么哈希桶的大小为208?本篇文章将着重对内存池的ThreadCache层进行讲解,而在了解ThreadCache层之前我会对向内存池申请分配内存以及释放内存的流程进行讲解,直观的感觉到在处理申请和释放内存的请求时内存池的操作,再对其ThreadCache层进行讲解。

2024-05-20 20:39:26 913 1

原创 STL源码刨析:迭代器概念与Traits编程方法

接下来我们将重点对如何判断迭代器类型,判断模板函数返回值的类型,处理模板函数接受元素为原生指针的情况,针对模板函数接受的元素为const的情况进行特化以及针对迭代器类型进行高效率的函数设计,一共五种解决问题都会在该小节进行讲解(迭代器的设计在STL的实现中起到了至关重要且十分基础的作用,本篇文章也皆在对迭代器的设计思想以及迭代器的实现进行分析讲解,其中文章出现的Traits方法就属于迭代器设计的基础,对于迭代器的正确使用有着不可替换的地位,所以本篇文章也将重点对Traits方法进行讲解。

2024-05-19 19:23:37 455 1

原创 C++高并发内存池:初步了解

什么是高并发?前言针对前篇文章《STL源码刨析:空间配置器(allocator)》中所描述的二级配置器小节中关于内存池的讲述,本人将专门对C++高并发内存池的理论以及实现细节进行针对性讲解。本篇文章将简单的对C++高并发内存池的理论以及结构分层进行描述,后续文章将通过分层的方式,对C++高并发内存池的理论以及细节进行讲解,还会配上实现源码方便读者理解。什么是高并发?高并发是指系统能够同时处理大量并行请求或操作的能力。

2024-05-12 20:07:38 946 1

原创 STL源码刨析:空间配置器(allocator)

针对阅读STL源码而言,或许许多人觉得阅读侯捷所著的《STL源码刨析》是过时的,但是我并不觉得,因为这些人往往是阅读过该书,学的更深入才对这本书进行这样的评价,针对入门的为而言,有一本书能带你大致了解STL源码的框架,这是极为便利的。针对最新版本的源码而言,这本书的确是过时的,但是并不影响我们去了解STL源码的框架,去熟悉源码的语法。我觉得一本好书不在于所有人的评价,只要它是让人学习的过程中首先了解到的便是好书。

2024-05-10 21:33:07 585

原创 C++设计模式(下):行为型模式

本篇博客包含11种设计模式,自从学习这么多种设计模式后,我的心态也发生了变化,或许不会存在永远按照设计模式来设计的程序,一个项目也可能存在符合多种设计模式的情况,但是无论正确与否,我觉得可读性强的,利于维护的,方便增加功能的项目就是好项目。(例如有三个对象,调用顺序是A->B->C,把所有的项目都先传递给A,A拿到所有的项目后,把属于自己负责的项目留下来,把剩下的传递给B,然后B把属于自己的留下来,把不属于自己的再传递给C)1.定义抽象元素类:定义访问者可调用的函数,访问者通过该函数实现修改元素内的内容。

2024-05-06 16:38:37 878

原创 C++设计模式(中):结构型模式

继上一篇《C++设计模式(上):创建型模式》博客,本文章将重点讲解结构型模式,也会根据上一篇博客的方式,分别从是什么,为什么,实现步骤,优缺点以及具体的实现代码四步来讲解具体的设计模式

2024-05-04 16:13:05 837 1

原创 C++设计模式(上):创建型模式

本文章将重点讲解创建型模式,在本人分布的《C++设计模式:前传》中曾简单概述了一下创建型模式细分多少种设计模式,本篇文章将讲解这些设计模式的理论,优缺点和代码实现。

2024-05-03 21:52:52 34 1

原创 C++设计模式:前传

这对于之前的我看来,设计模式的存在可有可无,也可以这么说,是我对设计模式的认识太少。俗话说的好:前人种树后人乘凉,在计算机这条道路上,无数前辈总结出来的经验还是有用的,为什么我会有如此想法呢?而这其中多多少少与设计模式有着千丝万缕的联系,在我不断的优化代码的过程中,我也意识到了设计模式的重要性,于是便有了这篇文章

2024-05-02 21:26:42 23

原创 MinGW:从入门到链接库

MinGW是一个在Windows系统上运行的GNU编译器套件,支持C和C++语言的编译。在学习MinGW后,我们将对代码的编译链接有更多的了解,也会对静态链接库和动态链接库有一个清晰的认知。针对编译过程,分为预处理,编译,汇编以及链接四种阶段,在每一个阶段生成的文件都不同,接下来将对每一个阶段执行的命令进行解析,并且分析每一个阶段代码的变化。

2024-04-16 20:40:27 1310

原创 Effective C++(中):Scott Meyers著

本条款主要讨论的是关于swap函数,标准库中的swap函数是由模板实现的,传入的参数必须支持复制构造函数或者赋值重载运算。本条款通俗易懂,了解基础语法的同学都应该知道——对象定义被执行后会调用构造函数,如果该对象被构造后没被调用(例如该对象被调用之前有函数抛出异常的情况,该对象可能就没有被调用),就会造成时间和空间上的浪费,还需要承担该对象的析构成本。本条款涉及C++中的生命周期问题,有一个很有意思的关键字——const,对于书中延长函数中匿名对象的生命周期的代码示例,我觉得有误(经过多种途径了解,

2024-04-09 19:33:48 573

原创 Qt Creator:QThread源码刨析

本篇文章将从源码的角度出发,简单的介绍QThread类从创建到消亡所执行的过程后,将重点分析源码刨析QThread的主要函数,分析在这些函数中都执行了什么操作

2024-03-31 15:22:24 1023 1

原创 Qt Creator:调用API

如果需要文字识别等服务是免费的,但是接入文心一言就需要对其方法使用(听说讯飞星火是免费的,但是本人目前只能使用Python对其调用,Qt提供的编解码函数好像没有)在查阅鉴权认证文档时,我们需要额外注意如何获取access_toKen,请求说明(包含请求地址,请求方式以及请求参数),请求示例以及响应示例(方便我们对返回的数据进行处理)现正则表达式功能,匹配、搜索和替换文本(获取到返回的数据时,往往返回的是JSON中数组的形式,对此我们需要使用正则表达式匹配文本,获取对应键值的数据)表示网络请求响应的类。

2024-03-17 22:20:43 1717 11

原创 Qt Creator:程序调试和界面讲解

学习Qt,学习使用Qt Creator,对于我来说是一个不可跨越的难关。在阅读过《Qt 6 C++开发指南》,《Qt 5 开发实例》以及大多数网站和博客的我来说,发现并没有很多博主对如何在Qt Creator进行程序调试,对异常进行排查进行讲解。故本文章皆在给广大学习Qt开发的同学进行调试和界面方面的讲解,内容可能会存在部分错误,希望各位读者同学在评论区指出,受教了。

2023-12-03 23:51:16 1899 2

原创 Effective C++(上):Scott Meyers著

适合以及了解C++基本语法,清楚类间的关系,virtual,lambda表达式,模板元编程,STL容器,多重继承MI,智能指针以及RTTI等知识点的同学学习

2023-12-02 10:14:19 880

空空如也

空空如也

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

TA关注的人

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