- 博客(56)
- 收藏
- 关注
原创 C++ STL中迭代器学习笔记
摘要: STL迭代器本质是封装指针行为的对象,通过重载运算符实现容器的统一遍历。STL将迭代器分为五类(输入、输出、前向、双向、随机访问),通过iterator_traits技术动态提取类型信息,利用标签分发(如input_iterator_tag)为不同迭代器选择最优算法(如advance的O(1)或O(n)实现)。迭代器适配器(如反向迭代器、插入迭代器)扩展了功能,而__normal_iterator则是对原生指针的封装,保持接口统一。理解迭代器机制是掌握STL泛型编程的核心,涉及模板、类型萃取和标签分
2025-07-20 21:36:06
898
原创 C++ 并发 future, promise和async
本文系统介绍了同步与异步编程的核心概念及C++11中的异步编程工具。同步编程按顺序执行任务并阻塞当前线程,而异步编程允许任务并发执行并通过回调、Promise等方式通知结果。文章重点讲解了C++11中的异步编程组件:std::async用于异步执行函数并返回future对象,支持不同的启动策略;std::promise/future机制则实现了线程间值或异常的传递。最后通过代码示例展示了这些工具的使用方法,并指出了promise生命周期管理的重要性。这些工具为C++开发者提供了强大的异步编程能力,能有效提升
2025-07-20 21:09:40
724
原创 ProtoBuf学习笔记
文章摘要: Protobuf是Google开发的跨平台、高效的数据序列化工具,支持多种编程语言。文章详细介绍了Windows平台下使用VS2019编译和配置Protobuf库的步骤,包括源码下载、CMake编译、环境变量设置及VS项目集成。通过示例展示了如何定义.proto文件并生成C++类,实现数据的序列化与反序列化。此外,还探讨了Protobuf在网络通信中的应用,包括消息定义和数据解析。全文提供了从安装到实际开发的完整流程,适合开发者快速上手Protobuf。
2025-07-07 15:47:49
793
原创 CPP线程池设计与分析实现
本文探讨了并发与并行的区别、多线程应用场景及线程池实现。并发指单核CPU通过时间片轮转模拟多线程执行,而并行是多核/多CPU真正同时执行线程。多线程适用性取决于程序类型:单核CPU中IO密集型程序适合多线程,CPU密集型则因上下文切换开销而不适合;多核CPU中并行可提升利用率。线程池通过预先创建线程减少创建销毁开销,分为固定数量(fixed)和动态增长(cached)两种模式。线程同步涉及互斥锁(mutex)和条件变量(condition_variable)实现线程安全。最后通过生产者消费者模型和信号量机制
2025-07-07 15:46:51
743
原创 字节序与TCP粘包问题处理分析
TCP作为流式传输协议,数据包边界不明确可能导致"粘包"问题。本文分析了粘包现象的成因,主要包括发送缓冲区延迟发送和接收端处理不及时两种情况。针对此问题,文章提出了三种解决方案:使用标准应用层协议、尾部添加特殊字符分隔、以及添加固定大小的数据头。其中数据头方案最为实用,通过在数据块前添加包含包长度的数据头,接收端可准确拆包。文章详细介绍了基于Qt的封包拆包实现方法,包括QDataStream的用法和缓冲区处理逻辑,并强调了残留数据与下一包组合的必要性。最后指出,TCP粘包并非协议缺陷,而是程序设计需解决的问
2025-06-18 22:21:45
544
原创 QTableView为例:Qt模型视图委托(MVD)(Model-View-Delegate)
QT中的MVD(模型-视图-委托)模式是一种类似于MVC的设计模式,将数据、界面和交互逻辑分离。模型负责数据管理,视图负责显示界面,而委托则嵌入在视图中处理数据的显示和编辑。QT提供了多种视图组件(如QListView、QTreeView、QTableView)和模型类(如QStandardItemModel、QAbstractItemModel),支持数据的多样化呈现。委托(Delegate)通过定制显示和编辑行为增强了视图的灵活性。该模式适用于各类数据结构展示(列表、表格、树形),能够高效处理数据与界面
2025-06-18 14:43:59
1280
原创 struct的内存对齐学习笔记
内存对齐是指数据在内存中的存储起始地址是某个值的倍数,在C语言中,结构体是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构体、联合体等)的数据单元。在结构体中,编译器为结构体的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构体的地址相同。
2025-06-16 20:28:15
839
原创 字符集与字符编码学习笔记+CPPQT开发中字符串转化乱码问题
文章摘要:本文探讨了Qt开发中遇到的字符串乱码问题及其解决方案。当代码移植到不同主机时,由于Qt默认使用Unicode编码而Windows系统采用GBK系列编码,导致中文字符显示异常。通过将QString::fromStdString()替换为QString::fromLocal8Bit()实现编码转换,解决了乱码问题。文中还系统梳理了字符集与编码的核心概念:字符集定义字符集合(如ASCII、Unicode),编码则决定存储规则(如UTF-8、GBK)。重点解析了Unicode与UTF-8的关系,指出UT
2025-06-16 20:25:13
758
原创 QT5中的QGraphics图形视图框架学习笔记(Item、Scene和View)
Qt图形视图框架提供了一套完整的图形处理工具,主要由三元素构成:QGraphicsView(视图)、QGraphicsScene(场景)和QGraphicsItem(图形项)。视图负责渲染场景内容并处理用户交互,场景管理图形项的布局和事件分发,图形项则是场景中的可视化对象。该框架支持缩放、旋转、平移等操作,通过坐标系转换函数实现不同层级间的映射,并允许自定义交互行为,如橡皮筋选择和拖拽模式。开发者可以高效地创建复杂的交互式图形应用,处理大量图形元素的显示与操作。
2025-06-12 16:58:44
1543
原创 进程与线程学习笔记
进程是操作系统资源分配的基本单位,拥有独立地址空间;线程是CPU调度的基本单位,共享进程资源。线程私有栈区、程序计数器和寄存器等上下文信息,共享进程的代码区、数据区和堆区。单核CPU通过时间片轮转实现并发,多核CPU可实现真正的并行。进程上下文保存了执行状态以便切换恢复,线程切换开销更小但稳定性较弱。全局变量和堆内存为线程间共享资源,需要同步机制避免冲突。
2025-06-12 16:58:08
1090
原创 yolov8自带的predict函数相关参数说明
YOLOv8 是一种先进的目标检测模型。predict 函数是 YOLOv8 中用于进行预测的主要接口。在使用这个函数时,可以通过不同的参数来控制预测过程的行为。
2025-05-29 15:32:29
446
原创 CPP中CAS std::chrono 信号量与Any类的手动实现
本文摘要:C++多线程编程核心概念解析:原子操作与CAS:介绍了std::atomic实现原子操作的方法,包括计数器、标志位和自定义类型的原子操作,以及CAS(Compare and Swap)原理。时间处理:讲解了std::chrono库的时间段(duration)、时钟(clock)和时间点(time point)概念,演示了精确延时和算术运算的使用方法。信号量:说明信号量在C++20中的标准实现,并给出自行实现的计数信号量和二元信号量方案,展示了线程同步的实际应用。Any类型
2025-05-29 15:12:41
1353
原创 C语言经典笔试题目分析(持续更新)
本文主要讨论了C语言中的几个关键概念和代码实现。首先,解释了static关键字在函数和局部变量中的不同含义:用于函数时限制其作用域为当前文件,用于局部变量时延长其生命周期。接着,通过代码示例分析了全局变量的初始化和函数调用对变量的影响,指出a的值最终为3。然后,详细说明了32位单片机系统中结构体的内存对齐规则,并计算了两个结构体的长度分别为8字节和12字节。此外,介绍了如何使用typedef定义函数指针类型,并通过指针调用函数。最后,提供了宏定义实现位操作和数组元素个数计算的方法,并实现了一个将十六进制数转
2025-05-15 21:20:03
936
原创 Linux通信开发muduo网络库学习笔记
muduo库是一个基于非阻塞IO和IO多路复用的C++高并发TCP网络编程库,采用Reactor模式实现,支持多线程并发处理。其核心架构为“one loop per thread”,每个线程拥有独立的事件循环(EventLoop),主线程负责监听新连接,子线程处理具体连接事件。muduo库的主要组件包括TCPServer、EventLoop、TcpConnection、TcpClient和Buffer类,分别用于管理服务器、事件循环、连接、客户端和数据缓冲区。通过muduo库,开发者可以将业务逻辑与网络层解
2025-05-15 16:44:00
818
原创 c++ std库中的文件操作学习笔记
C++标准库中的 <fstream> 头文件提供了 std::ifstream、std::ofstream 和 std::fstream 类,分别用于文件读取、写入及同时读写操作。这些类继承自 std::istream、std::ostream 和 std::iostream,提供了类型安全的文件操作接口。std::ifstream 用于读取文件,std::ofstream 用于写入文件,std::fstream 支持同时读写。文件可以通过构造函数或 open() 函数打开,并支持多种打开模式组合
2025-05-13 23:05:09
1797
原创 Redis学习笔记
Redis是一种高性能的内存数据结构存储系统,广泛应用于缓存、会话存储、消息队列、实时分析等场景。它支持多种数据结构如字符串、哈希、列表、集合等,并提供丰富的操作命令。Redis基于内存存储,具有极高的读写速度,同时也支持持久化机制(RDB和AOF)来确保数据安全。其单线程架构简化了并发控制,提升了效率。此外,Redis通过哨兵和集群机制实现了高可用性和水平扩展。在实际应用中,Redis常被用作消息队列,开发者在使用时需注意发布与订阅命令需在不同的上下文中执行,以确保消息的跨服务器通信。通过合理配置和使用,
2025-05-13 22:20:21
1002
原创 YOLOv8训练过程与结果评价指标分析
训练完成后产生的文件如下首先我们需要明确精确率与召回率,即分别反映预测准确性和正类覆盖能力。精确率关注预测结果中正确识别的比例,召回率侧重真实正类中被正确找出的比例。两者常需权衡,具体应用场景决定侧重方向。**精确率(Precision)**衡量模型预测为正类的样本中真实正类的比例。其计算公式为:精确率=TP/(TP+FP),其中TP为真正例(预测正确且实际为正类的样本),FP为假正例(预测错误但实际为负类的样本)。
2025-05-09 22:05:20
1643
原创 OPCUA,OPCDA与MODBUS学习笔记
OPC协议(OLE for Process Control,即过程控制的OLE)是一种标准化的通信协议,旨在帮助不同厂商的设备、控制系统和软件之间进行数据交换。OPC协议的目标是提供一种统一的接口,使得各种不同品牌、类型的硬件设备可以方便地与上层软件(如SCADA系统、HMI界面、监控系统等)进行无缝对接。OPC协议最初由Microsoft和一批工业自动化厂商合作开发,基于Windows平台,目的是为了解决传统工业控制系统中不同硬件和软件之间的兼容性问题。OPC协议如今已经发展出了多个版本
2025-05-08 22:54:32
1164
原创 Lua学习笔记
Lua是一种轻量级的、高效的、可扩展的脚本语言,由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的一个小团队开发。Lua的设计目标是成为一种嵌入式的脚本语言,因此它的语法简单、易于学习、易于嵌入其他程序中,并且运行速度非常快。所以Lua是一种上手成本很低的脚本语言。这里放下Lua代码与注释,方便快速上手,下再详细介绍--注释方式--[[多行注释--]]
2025-05-08 21:40:29
980
原创 nginx配置集群服务器中的tcp负载均衡器
假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机器的性能毕竟是有限的。这个时候我们就可以增加服务器的数量,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。那我们就需要有一个第三方组件充当负载均衡器,由它负责将不同的请求分发到不同的服务器上。这里介绍Nginx的负载均衡功能。Nginx作为tcp把client的请求按照负载算法分发到具体的业务服务器ChatServer上能够。
2025-04-29 17:28:34
887
原创 Linux开发中的线程管理(C++11 std::thread)
std::thread 是 C++11 引入的一个类,是 C++11 标准库中的一个关键特性,它提供了一种在 C++ 程序中创建和管理线程的方法。通过使用 std::thread,可以很容易地在你的 C++ 程序中创建多线程应用程序。每个 std::thread 对象都代表了一个独立的执行线程,这些线程可以并行地执行不同的任务。
2025-04-29 15:40:09
1046
原创 Linux环境变量配置与std访问环境变量
首先介绍一下Linux下各目录操作符的含义:~/.bashrc-~” :表示主目录,也就是当前登录用户的用户目录。“/” :是指根目录:就是所有目录最顶层的目录。“./” :表示当前目录,./ 一般需要和其他文件夹或者文件结合使用,指代当前目录下的东西。“. .” :表示上级目录“/.” :隐藏文件前会带.如.bashrc作用域与类型类型生效范围配置文件生命周期临时变量当前Shell会话 无(命令行设置)终端关闭失效用户变量单用户所有会话用户登录加载系统变量。
2025-04-28 21:31:50
1002
原创 池类设计的常客,单例模式
单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
2025-04-28 15:29:24
1064
原创 C++11线程间通信同步与Linux中MySQL连接池实现
适用场景生产者-消费者队列:队列空/满时的线程同步。任务调度:线程池中任务的分发与执行。资源池管理:如数据库连接池的分配与回收。与信号量的区别特性条件变量信号量C++标准支持C++11C++20灵活性需手动管理条件,更底层直接通过计数器控制资源访问适用场景复杂条件判断(如队列空/满)简单资源计数限制协作机制需结合互斥锁和条件检查独立的计数操作(acquire/release)条件变量是 C++11 多线程编程中实现复杂同步逻辑的核心工具。
2025-04-27 18:43:53
1018
原创 c/c++中常用循环的执行逻辑
在C++(以及C、Java等类似的语言)中,和虽然在表面上看起来相似,但它们在循环执行和条件判断方面有着显著的不同。这种差异主要体现在循环的起始条件和循环体执行后索引值的变化上。
2025-04-21 20:24:17
595
原创 JSON学习笔记
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。(2)父子节点的形式,这种方法可以定义更为复杂的形式,缺点就是定义起来较为麻烦。在一级对象后直接跟不同的二级对象作为区分,并针对二级对象进行赋值或添加的操作。定义的JSON数据结构如下。
2025-04-19 16:45:30
360
原创 GNU,GDB,GCC,G++是什么?与其他编译器又有什么关系?
首先GNU是什么呢,GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。因为当时1969年在贝尔实验室诞生的Unix是商业操作系统。
2025-04-19 15:08:53
840
原创 C++学习:std::function与std::bind
在C++工程实践中,bind绑定器和function函数对象非常的重要,依靠他们可以便捷的实现松耦合。
2025-04-18 18:07:58
990
原创 CMake的配置使用
gcc或g++的编译指令如下1即为生成的文件可以是可执行文件或.a静态库.so动态库,2为生成的命令,生成什么文件,3要编译的文件名,4为头文件包含目录,5为库目录路径,6为库文件名-lmuduo_net即为-l muduo_net实际上稍微大一些的项目用g++编译还是比较麻烦的,用cmake的来进行构建会便捷一些使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。
2025-04-16 21:18:44
1099
原创 【Yolov8部署】 VS2019 + opencv + onnxruntime 环境下部署目标检测模型
本文主要研究场景为工业场景下,在工控机与工业相机环境中运行的视觉缺陷检测系统,因此本文主要目的为实现c++环境下,将yolov8已训练好的检测模型使用onnxruntime 部署通过cpu或gpu cuda加速进行检测运算。
2025-03-31 21:01:04
1209
原创 【Yolov8部署】 VS2019 + opencv - dnn CPU环境下部署目标检测模型
本文主要研究场景为工业场景下,在工控机与工业相机环境中运行的视觉缺陷检测系统,因此本文主要目的为实现c++环境下,将yolov8已训练好的检测模型部署在opencv中通过cpu进行检测运算如下为成功运行例程,检测图像涉及科研项目,此处不便展示。
2025-03-27 21:48:43
969
2
原创 QT网络通信的接口与使用
在Qt中实现TCP通信主要依赖 QTcpServer(服务端)和 QTcpSocket(客户端和服务端通信)类。TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯。控制器可以设置为服务器端或客户端。服务端(简化版)Q_OBJECTpublic:private:客户端(简化版)Q_OBJECTpublic:private:运行效果。
2025-03-24 20:40:47
857
原创 c++中的四种cast转换
C++继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险)C++11之后,C++中就有四种类型转换,分别是,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。如这个表达式将expression转换为一个type-id类型的对象。Type-id必须是一个指针、指向一个已经定义类的类型或一个指向 VOID 的指针。Expression的类型必须是一个指针,如果type-id是一个指针;当type-id是一个引用的时候必须是一个左值。
2025-03-24 17:02:46
1047
原创 MySQL学习笔记(四)
介绍视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的S0L逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条5QL查询语句上。全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
2025-03-24 16:19:57
1083
原创 MySQL学习笔记(三)
连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层:第二层架构主要完成大多数的核心服务功能,如QL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如 过程、函数等。引擎层:存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过AP!和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。存储层。
2025-03-24 15:00:49
1041
原创 QT线程同步
多线程编程的一个主要挑战是避免数据竞争和条件竞争。数据竞争发生在多个线程同时读写共享数据,而没有适当的同步机制时。条件竞争是指多个线程以特定的时序执行特定的操作,导致不期望的结果。同步策略在保护线程安全的同时,也可能会引入额外的性能开销。例如,锁的不当使用可能导致线程争用,从而降低效率。锁的粒度:选择合适的锁粒度,以减少争用和上下文切换的开销。锁的类型:根据应用场景选择互斥锁、读写锁(QReadWriteLock)、递归锁(QRecursiveMutex)等。
2025-02-25 21:50:09
1126
原创 cpp智能指针的原理与使用
智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏和空悬指针等等问题。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。智能指针的历史历程:C++ 98 中产生了第一个智能指针auto_ptr。C++boost给出了更加实用的scoped_ptr(防止拷贝) 和 shared_ptr(引进引用计数) 和 weak_ptr。
2025-02-25 21:49:24
1001
原创 QT控件与提升(自定义类)
在Qt开发中,控件提升是一个实用但常被低估的概念。它通过将标准的基础控件(Base Widget)升级为功能更强大、更定制化的自定义控件(Custom Widget),从而允许开发者在设计界面时突破Qt基础控件的限制,实现更复杂的功能和更优化的用户体验。这一概念与C++编程中“接口与实现分离”的原则不谋而合。正如Scott Meyers在《Effective C++》中所强调的,这种分离能够增强代码的灵活性和可维护性。
2025-02-19 20:14:27
1393
原创 QT线程池介绍与接口使用
在并发编程中,当我们使用线程时,通常的做法是在需要时创建一个新的线程。这种方法实现起来较为简便,但存在一个显著问题:如果并发线程数量较多,且每个线程仅执行一个耗时较短的任务,频繁地创建和销毁线程将显著降低系统效率,因为线程的创建和销毁本身需要消耗一定的时间。那么,是否存在一种机制可以使线程在执行完一个任务后不被销毁,而是能够继续执行其他任务,从而实现线程的复用呢?线程池(Thread Pool)正是这样一种多线程处理模式。在线程池中,任务被添加到队列中,线程池在创建线程后会自动启动这些任务。
2025-01-30 23:19:38
1532
原创 QThread的使用流程与事件循环
事件循环:事件循环的作用:在run()函数中添加事件循环后,run()函数中的内容执行完后,线程还会运作,启动事件循环后,主线程还可以和子线程通过信号与槽的方式继续使用。1.使用exec()来启动事件循环2.exec()后面的内容将不会运行,直到退出事件循环3.使用quit()退出事件循环4.只有槽函数所在线程开启了事件循环,它才能在对应信号发射后被调用5.无论事件循环是否开启,信号发送后会直接进入槽函数所依附的线程的事件队列。
2025-01-10 12:53:28
1048
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人