自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ 构造函数,拷贝构造,拷贝赋值,移动构造,移动赋值相关概念以及注意的存在的问题

在进行类设计的时候,这些之前一直用的不太好,对这些理念理解不够深入,所以该篇主要记录一下。

2024-10-11 10:10:50 1131

原创 数据结构刷题之贪心算法

是一种在每个步骤中都选择当前最优解的算法设计策略。贪心算法的核心思想是:在每一步选择中,都做出局部最优的选择,希望最终能得到全局最优解。分析一下这个问题:这种问题肯定是先使用大的去找,大的找不完采用晓得,典型的局部最优解–>整体最优解。给定不同面额的硬币和一个总金额,要求使用最少数量的硬币凑出该金额。贪心算法通常比动态规划等方法更简单、更高效,但适用范围有限。一个问题的整体最优解可以通过一系列局部最优选择来构造。每次选择只依赖于当前状态,而不考虑未来的影响。一个问题的最优解包含其子问题的最优解。

2025-04-09 16:14:20 881

原创 pytorch+maskRcnn框架训练自己的模型以及模型导出ONXX格式供C++部署推理

maskrcnn用作实例分割时,可以较为精准的定位目标物体,相较于yolo只能定位物体的矩形框而言,优势更大。虽然yolo的计算速度更快。直接开始从0到1使用maskrCNN训练自己的模型并并导出给C++部署(亲测可用)标注完生成后,包含标注的jeson文件,以及.jpg图片文件。torchvision版本: 0.21.0+cu126。PyTorch版本: 2.6.0+cu126。onnxruntime版本。使用labelme标注。

2025-03-27 13:42:03 558

原创 opencv+ONNX模型的推理

如前文我们已经编译出带dnn模块的opencv,如果使用简易版的opencv虽然也可以加载onxx模型但是无法利用GPU进行并行计算,导致推理速度比较慢。(这里为什么使用yolov8),应为我发现使用yolov5训练的模型opencv无法加载,或者报加载错误问题。opencv加载的模型通常是ONXX模型,使用yolov8训练自己的数据集得到的模型为.pt,所以通常需要将.pt转为ONXX模型。当然也可以使用ONXX的API加载ONXX模型,ONXX的api个人感觉比较通用,但是这里我没使用。

2025-03-12 10:55:42 611

原创 opencv编译问题(NVIDIA cuda安装和cudNN)

编译过程参考https://blog.youkuaiyun.com/m0_58326153/article/details/142333462。vs编译OpenCV 4.7.0 无法解析的外部符号 cv::xfeatures2d::VGG::getDefaultName。cudnn-windows-x86_64-8.9.0.131_cuda11-archive下载的文件。官网选择显卡驱动https://www.nvidia.cn/drivers/lookup/我这边安装的时560.94版本。

2025-03-11 14:11:27 605

原创 public private protect的区别

特点:基类的 public 成员在派生类中保持 public,基类的 protected 成员在派生类中保持 protected,而基类的 private 成员不可访问。这是最常用的继承方式,符合“is-a”关系的设计原则。特点:基类的所有成员(无论是 public 还是 protected)在派生类中都变为 private,基类的 private 成员仍然不可访问。特点:基类的 public 和 protected 成员在派生类中都变为 protected,基类的 private 成员仍然不可访问。

2025-02-12 09:16:47 792

原创 C++容易误解地方

但是,您可以选择性地使用 extern 来明确指出函数是外部定义的,尤其是在混合C和C++代码时,extern “C” 非常有用,因为它禁用了C++名称修饰(name mangling),使得C++代码能够调用C语言库中的函数。extern是C和C++的一个储存类说明符,用于声明变量或函数,表明他们在其他地方定义,他告诉编译器不要在此处分配内存,而是在链接的时候查找该变量或函数的实际定义。在这个例子中,PI 被定义为一个常量值,而 SQUARE(x) 定义了一个简单的宏来计算某个数的平方。

2025-02-06 09:39:55 703

原创 ASCII 码十六进制数据详解

ASCII(American Standard Code for Information Interchange) 是一种字符编码标准,用于将文本转换为数字表示形式。每个 ASCII 字符对应一个 7 比特的二进制数,通常使用 8 比特来表示(最高位通常是 0)。十六进制(Hexadecimal) 是一种基于 16 的数制系统,常用于表示二进制数据。每个十六进制字符代表 4 比特的数据(半字节),因此两个十六进制字符可以表示一个完整的字节(8 比特)。

2025-01-21 14:54:10 659

原创 Qt设置布局QVBoxLayout,QHBoxLayout,QGridLayout

要设置 QGridLayout 中的列比例,可以使用 setColumnStretch 方法。该方法接受两个参数:列索引和伸缩因子。较大的伸缩因子意味着该列将占用更多的可用空间。hboxlayout->addWidget(“元素”,伸缩因子);

2025-01-14 17:02:27 191

原创 字节的大小端转换

字节的大小端转换。

2025-01-07 17:06:38 367

原创 const unsigned char* 和 const char*使用

const unsigned char* 和 const char* 是两种不同的 C/C++ 指针类型,它们的主要区别在于指针所指向的数据类型以及这些类型的特性和用途。

2025-01-07 16:13:33 527

原创 设计模式-代理模式

该模式属于结构性设计模式,它提供了一种控制对一个对象的访问的方法。代理模式允许你创建一个代理对象,这个对象可以控制对实际对象的访问,通常用于延迟初始化、添加额外的行为或限制访问权限等场景。引入代理对象的主要目的是可以为客户端增加额外的功能、约束或针对客户端的调用屏蔽一些复杂的细节问题。Proxy (代理): 持有对 RealSubject 的引用,通过实现 Subject 接口来控制对其的访问。RealSubject (真实主题): 实现了主题接口,提供了具体的服务。

2024-12-24 16:28:43 114

原创 CRITICAL_SECTION 同步机制使用

CRITICAL_SECTION 是 Windows API 提供的一种同步机制,用于保护对共享资源的访问,确保在同一时间只有一个线程可以访问该资源。它比互斥量(Mutex)更轻量级,并且只适用于同一进程内的线程同步。

2024-12-19 15:07:57 245

原创 CreateEvent Windows API 中一个事件对象的函数使用

通过调用 CreateEvent,你可以创建一个命名或无名的事件对象,并指定该事件是手动重置还是自动重置,以及初始状态是否为有信号。如果此参数为 NULL,则事件对象不会被子进程继承,并且它将获得默认的安全描述符。这种类型的事件对象非常适合用于通知机制,例如在多线程应用程序中,主线程可以等待一个工作线程完成任务。工作线程完成任务后调用 SetEvent 函数,将事件设置为有信号状态,从而唤醒等待的主线程。如果指定了名称并且该名称对应的事件对象已经存在,则函数会返回现有对象的句柄,而不是创建一个新的对象。

2024-12-19 10:48:23 431

原创 WindowShell脚本打包程序压缩包

在一些需要快速发布软件的场景中,在编译完成发布release后需要快速打包成压缩文件的形式,为保持程序目录干净可能需要排除一些.pdb .exb文件以及其他的可执行文件。这里将.exe和相关的.dll和.lib库复制倒新的输出目录,同时将文件夹相关文件夹复制到新的输出目录,最后压缩该输出目录。%CD%为这个bat的所在目录。我这边使用的是7z压缩程序,安装在系统盘。.bat脚本内容如下。

2024-12-05 16:10:54 235

原创 const char* 指针的生命周期和内存管理

获取的指针在 getString 函数返回后已经失效,访问它会导致未定义行为。在 getString 函数中,std::string s 是一个局部变量。当 getString 函数返回时,s 会被销毁,其内部的内存也会被释放。最简单的方法是直接返回 std::string,而不是 const char*。如果必须返回 const char*,可以使用动态分配内存的方法,并确保在使用完毕后释放内存。因此,返回的 s.c_str() 指针在函数返回后指向的内存是无效的,这会导致未定义行为。

2024-11-22 14:43:43 243

原创 C++指针函数体内部初始化需要注意的地方

问题原因:我们知道p传入时地址是一个nullptr值,想通过函数给p地址赋值,但是忽略了,此时函数调用了一次赋值操作,p在函数体内部的地址确实改变了,但是不会影响外部变化,所以导致外部调用时依旧为nullptr(乍一看貌似什么问题,外部调用p时应该是已经初始化好的指针p,但是发现函数调用后p依然为nullptr。以上代码我们都知道传递指针,函数改变了指针指向地址内的数据,函数体外部调用时p指向地址发生了改变,输出结果由5->4。)这就像值传递和引用传递。

2024-11-21 16:56:34 315

原创 std::condition_variable的使用详解

总结:调用条件变量调用wait的过程,先释放锁,等待其他线程发出notify信号,收到信号后,wait尝试获取锁,拿到锁如果没有参数,则直接往后执行,如果存在参数,则判断参数值是否为真,如果为真则继续执行,如果为加,释放锁,重新等待notify信号。具体使用一般在生产者和消费者线程中,消费者调用wait方法阻塞直到生产者发出notify通知。condition_variable 是std用于线程同步的一个变量。1.加lamba表达式 通常对一个资源列表判断。1.单独不加lamba表达式。

2024-11-21 13:59:40 546

原创 VS 软件crash后生成dump文件定位程序崩溃原因

VS 软件crash后,有时使用日志无法定位问题原因,所以通过生成dump的方式定位程序出错的问题原因,下是使用Dbghelp.lib的方式,样例代码。生成的dump文件直接拖入vs中,本机调试就可以定位故障问题,非常翻方便。

2024-11-20 13:45:38 332

原创 Qt in Visual Studio 设置软件图标方法

2、在工程目录中新建一个文件Icon.rc, 用记事本打开编辑这里的.ico目录为Icon.rc所在的同级目录,否则找不到或者打不开。1、准备一个合适的xxx.ico图标,复制到工程目录中,可以是.vcxproj同级目录。3、右键vs项目,点击添加现有文件,选择"Icon.rc"Qt in Visual Studio 设置软件图标方法。4、重新编译项目即可。

2024-11-20 13:30:21 381

原创 C++中的左右值引用(移动语义和完美转发)

在 C++ 中,左值引用和右值引用是两种不同的引用类型,用于区分对象是左值还是右值。完美转发(Perfect Forwarding)是一种技术,用于在模板函数中保持参数的左值或右值属性,从而避免不必要的拷贝和移动操作。完美转发通常使用 std::forward 和 std::move 来实现。

2024-11-12 16:35:58 687

原创 五种网络IO模型

此外,在这个方案中 recv()更多的是起到检测“操作是否完成”的作用,实际操作系统提供了更为高效的检测“操作是否完成“作用的接口,例如 select()多路复用模式,可以一次检测多个连接是否活跃。同步IO和异步IO是整个read过程,同步IO不管是阻塞还是非阻塞,或者多路复用的情况在从数据从内核拷贝到用户内存中这时候他是被阻塞住的,而异步是直接返回再也不理睬了,直到 内核 发送一个信号,告诉进程说 IO 完成。其次,该模型将事件探测和事件响应夹杂在一起,一旦事件响应的执行体庞大,则对整个模型是灾难性的。

2024-11-12 14:26:39 765

原创 C++ 引用作为返回值:用引用接收和用变量接收的区别

在实际编程中存在一个问题 对于一个列表的修改的 明明返回的是一个引用 用变量去接受和用引用接受原本我一开始都是一样的,内部的列表都是可以被更改的,后面发现不是这样的情况。可以看出来正常使用变量接受的话,修改返回的引用,内部变量未改变,如果使用引用接受函数返回的引用的话,内部变量被修改了。

2024-10-23 15:10:13 152 1

原创 SQLite自己造轮子

SqlLite的一些轮子(github上全都有,但是自己造的,可能存在一些问题)

2024-10-11 15:26:34 275

原创 设计模式-状态模式

*截止日期:**每个任务可以有截止日期,可以用 std::chrono::time_point 或其他日期时间类来表示。状态模式的核心思想是将一个对象的状态表示为一个类,然后根据对象的当前状态来改变它的行为。**任务列表:**一个任务管理器可能需要管理多个任务,可以使用一个向量或列表来保存多个任务对象。**优先级:**每个任务可以有不同的优先级,可以通过一个整数或枚举类型来表示。:这些类实现了抽象状态类定义的方法,并根据特定的状态来改变环境的行为。任务描述:可以包含一个字符串来描述任务的具体内容。

2024-10-10 15:45:37 334

原创 设计模式-工厂模式

抽象工厂模式同样是 GoF 设计模式之一,它提供了一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。抽象工厂模式比工厂方法模式更进一步,它可以创建一组相关的对象,而不是单一的对象。优点当一组相关的对象被设计成一起工作时,它能保证得到一致性的结果。符合开闭原则,增加新的产品族时,只需增加相应的具体工厂类。缺点产品族扩展困难,增加新的产品族需要修改现有代码。public:// 抽象产品类 - TextBoxpublic:// 具体产品类 - WindowsButton。

2024-10-10 15:05:23 252

原创 C++一些优化的写法(个人观点)

/以下代码实现了简单的宏定义用于初始化模块指针管理的map012class A{class B{class C{//以下代码实现了简单的宏定义用于初始化模块指针管理的map # define ID_A 0 # define ID_B 1 # define ID_C 2 class A {class B {class C {\ break;\ break;\ } \ }

2024-10-10 10:28:14 289

原创 Setup factory打包程序和备份数据库文件实现自动导入数据库文件到程序部署电脑的数据中

1.首先你需要使用Navicat备份你所需要的数据库备份 bakup.sql。以及创建.bat文件,以及sql执行语句。其中路径一定需要使用%~dp0这个,表示当前路径,不然后期到打包完之后会有许多麻烦,这路全部使用相对路径。Setup factory打包程序和备份数据库文件实现自动导入数据库文件到程序部署电脑的数据中。4.在执行Setup factory时,执行添加如下代码。

2022-11-25 15:45:10 440 2

空空如也

空空如也

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

TA关注的人

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