自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(157)
  • 问答 (7)
  • 收藏
  • 关注

原创 使用LoRA(Low-Rank Adaptation)技术对MiniCPM模型进行微调

【代码】使用LoRA(Low-Rank Adaptation)技术对MiniCPM模型进行微调。

2024-03-17 15:25:09 441

原创 【Qt】LINK : error LNK2001: 无法解析的外部符号 WinMainCRTStartup

删除pro文件中的中文注释。

2024-03-05 21:09:35 450 3

原创 基于paddlepaddle的yolo基本实现

在这篇博客中,我们将深入探讨如何使用PaddlePaddle来实现YOLO(You Only Look Once)模型。YOLO是一种流行的实时目标检测算法,它以其速度和准确性而闻名。我们将使用ResNet18作为骨干网络,并一步步构建整个模型。数据集:https://aistudio.baidu.com/datasetdetail/94809。

2024-01-30 00:13:27 1325

原创 使用C++和Crypto++库进行加密解密

Crypto++是一款高度认可的免费C++类库,它包含了广泛的密码学算法实现,包括但不限于AES和SHA-1。我们的讨论将重点放在构建一个强大的AES加密解密类结构上,同时充分利用Crypto++库的强大功能。这种设计遵循了策略模式的思想,它为运行时切换加密和解密的具体实现提供了灵活性。PBKDF2是一种基于密码的密钥导出函数,其核心优势在于其高计算复杂度,这显著增加了抵御暴力破解攻击的难度。这种模式不仅提升了代码的可维护性,还有效地隔离了接口变更对实现的影响,是现代C++设计中的一种常见而有效的实践。

2024-01-25 16:46:26 546

原创 标准库容器概述

应该是您的默认容器!实践中,在现代 CPU 上由于内存和缓存的工作方式,以及对于。,您首先需要迭代到您想要插入或删除元素的位置,所以。的内存可能是碎片化的,因此迭代比。中的插入和删除操作通常比。

2024-01-20 15:26:40 438

原创 掌握C++20的革命性特性:Concepts

标准库定义了一系列预定义的 Concepts,分为多个类别。以下列表给出了每个类别中的一些示例 Concepts,所有这些都在头文件和std核心语言 Conceptssame_asintegral等。比较 Concepts等。对象 Conceptsmovablecopyable等。可调用 Conceptsinvocablepredicate等。此外,头文件定义了与迭代器相关的 Concepts,如等,还定义了算法要求,如mergeablesortable。

2024-01-19 00:33:14 1212

原创 C++函数模板:掌握返回类型推导的艺术

讨论add()函数模板的示例,让编译器推导返回值的类型确实是个好主意。然而,返回类型依赖于模板类型参数,那该如何实现呢?在这个示例中,RetType应该是表达式t1 + t2的类型,但你无法知道这一点,因为你不知道T1和T2是什么。

2024-01-17 22:22:47 401

原创 安卓微信聊天记录的解密

本文旨在指导用户如何获取微信聊天中的语音记录,并将其转换为WAV格式以供后续处理。适用于已经获取Root权限的安卓手机用户。

2024-01-06 21:47:48 1471 1

原创 C++ Module详解,模块化编程终极指南

模块接口文件定义了模块所提供功能的接口。这些文件通常具有.cppm扩展名。模块接口以声明文件定义了某个名称的模块开始,这被称为模块声明。模块的名称可以是任何有效的 C++ 标识符。名称可以包含点,但不能以点开头或结尾,也不能连续包含多个点。有效名称的示例包括datamodel等。:目前,还没有为模块接口文件标准化的扩展名。然而,大多数编译器支持.cppm(C++ 模块)扩展名,这也是本书所使用的。请检查你的编译器文档,了解应使用哪种扩展名。

2023-12-24 18:43:27 1220

原创 C++函数模板详解,轻松实现通用函数

与类模板方法定义一样,函数模板的定义(不仅仅是原型)必须对使用它们的所有源文件可用。因此,如果多个源文件使用它们,您应该将定义放在模块接口文件中并导出它们。最后,函数模板的模板参数可以像类模板一样有默认值。注意:C++ 标准库提供了一个比这里展示的Find()函数模板更强大的函数模板。

2023-12-23 22:22:31 913

原创 C++类模板特化与继承使用说明书,新手也能get

你可以为特定类型提供类模板的替代实现。例如,你可能认为类型(C 风格字符串)的 Grid 行为没有意义。将在中存储其元素。拷贝构造函数和赋值运算符将执行这些指针类型的浅拷贝。对于,进行深拷贝字符串可能更有意义。最简单的解决方案是为编写一个专门的实现,将它们转换为 C++ 字符串,并存储在中。模板的替代实现称为模板特化。你可能会发现其语法初看有些奇怪。当你编写类模板特化时,你必须指定这是模板,并且你正在为特定类型编写模板的版本。以下是Grid的特化的语法。

2023-12-19 22:44:05 854

原创 玩转C++方法模板,编程技能秒提升

C++ 允许对类的单个方法进行模板化。这种方法被称为方法模板,可以存在于普通类或类模板中。编写方法模板实际上就是为许多不同类型编写该方法的不同版本。方法模板对于类模板中的赋值运算符和拷贝构造函数非常有用。:虚方法和析构函数不能是方法模板。考虑仅有一个模板参数的原始 Grid 模板:元素类型。您可以实例化许多不同类型的网格,例如int和double然而,Grid和是两种不同的类型。如果你编写一个接受类型对象的函数,你不能传递Grid。即使你知道int网格的元素可以复制到double。

2023-12-14 18:14:04 961

原创 掌握C++模板的艺术:类型参数、默认值和自动推导

您也可以编写自己的用户定义推导指南来帮助编译器。这些指南允许您编写模板参数如何被推导的规则。这是一个高级主题,所以不会详细讨论,但会给出一个示例来展示它们的强大功能。假设您有以下public:private:使用自动模板参数推导,您可以创建一个类型的" };然而,如果您将传递给构造函数,则类型T被推导为,这不是您想要的!您可以创建以下用户定义的推导指南,当向构造函数传递作为参数时,使其将T推导为这个指南必须在类定义之外但在与类相同的命名空间内定义。通用语法如下。explicit。

2023-12-13 19:08:38 950

原创 字节跳动最新开源AI 视频生成框架「MagicAnimate」,一张照片就能生成跳舞视频

随着人工智能技术的飞速发展,我们目睹了数字图像处理领域的一次次革新。今天,我要向大家介绍由新加坡国立大学和字节跳动联合开发的“MagicAnimate”——一款使用扩散模型实现时间一致人像动画的突破性技术。“MagicAnimate”是一种先进的人像动画技术,它利用了最新的扩散模型来生成时间上连贯且逼真的人物动画。这不仅仅是一项技术上的突破,更是数字娱乐和内容创作领域的一大进步。想象一下,仅凭一张静态图片,我们就能创造出动态、栩栩如生的人物形象。

2023-12-10 19:36:29 1303

原创 C++模板背后的黑箱操作:编译器

你可以将方法定义直接放在定义类模板本身的模块接口文件中。当你在另一个源文件中导入这个模块以使用模板时,编译器将能够访问它所需的所有代码。这种机制用于之前的Grid实现。或者,你可以将类模板方法定义放在一个单独的模块接口分区文件中。然后,你还需要将类模板定义放在自己的分区中。例如,Grid这导入并导出了两个模块分区:定义(definition)和实现(implementation)。方法的实现位于实现分区中,该分区还需要导入定义分区,因为它需要Grid...

2023-12-06 20:38:58 751

原创 C++模板基础及代码实战

类模板定义了一个类,其中一些变量的类型、方法的返回类型和/或方法的参数被指定为模板参数。类模板主要用于容器,即存储对象的数据结构。这一节通过运行示例Grid容器来说明。为了保持示例的合理长度并足够简单以阐明特定要点,本章的不同部分将为Grid容器添加不在后续部分使用的功能。为了理解类模板,检查其语法非常有帮助。以下示例展示了如何将GameBoard类修改为模板化的Grid类。代码后面会详细解释语法。请注意,类名已从GameBoard改为Grid。每个Grid模板的方法定义都必须以说明符开头。注意。

2023-12-05 22:52:06 923

原创 C语言变长参数及其陷阱

这部分解释了旧的 C 风格变长参数列表。了解这些内容很重要,因为你可能会在遗留代码中遇到它们。然而,在新代码中,你应该使用变参模板来实现类型安全的变长参数列表。考虑 C 函数printf(),来自。C/C++ 提供了语法和一些实用宏,用于编写你自己的变长参数函数。这些函数通常看起来很像printf()。尽管你不经常需要这个特性,但偶尔你会遇到它相当有用的情况。

2023-12-04 16:12:06 400

原创 小心处理 C++ 静态变量中的陷阱

static。

2023-12-03 21:36:00 434

原创 MindSpore基础教程:使用 MindCV和 Gradio 创建一个图像分类应用

通过 MindSpore 和 Gradio,我们可以不仅训练强大的深度学习模型,还可以将这些模型转化为交互式应用,使非专业人士也能轻松体验 AI 的魅力。

2023-11-21 19:32:34 210

原创 MindSpore基础教程:LeNet-5 神经网络在MindSpore中的实现与训练

MindSpore 是华为推出的一种新型深度学习框架,旨在为用户提供高效、易用的编程体验。接下来,我们将通过实例来展示如何在 MindSpore 中构建、训练和评估一个经典的 LeNet-5 神经网络。LeNet-5 是一个简单的卷积神经网络,包含两个卷积层和三个全连接层。它经常被用于图像识别任务,特别是在处理像 MNIST 这样的手写数字数据集时表现出色。

2023-11-20 15:31:27 745

原创 DevToys:开发者的多功能瑞士军刀,让编程更高效!

用户可以通过 Microsoft Store 搜索和安装 DevToys,也可以手动下载最新发布版本的 *.msixbundle 文件进行安装,或者通过 PowerShell 命令提示符使用 WinGet 安装。DevToys 是一款专为开发者设计的实用工具,它能够帮助用户完成日常的开发任务,如格式化 JSON、比较文本和测试正则表达式(RegExp)。它的优势在于用户无需使用多个不可靠的网站来处理数据,DevToys 能够智能地检测复制到 Windows 剪贴板的数据,并推荐最佳工具。

2023-11-20 00:45:00 311

原创 探索 C++20 的新领域:深入理解 static关键字和核心语言特性测试宏

在 C++ 中, 关键字有几种看似无关的用途。为该关键字“过载”部分动机是为了避免在语言中引入新的关键字。你可以声明类的 数据成员和方法。与非静态数据成员不同, 数据成员不是每个对象的一部分。相反,数据成员的只有一份副本,存在于该类的任何对象之外。 方法同样处于类级别而不是对象级别。 方法不在特定对象的上下文中执行;因此,它没有隐式的 指针。这也意味着 方法不能被标记为 。在涉及 关键字用于链接之前,需要理解 C++ 中链接的概念。C++ 源文件是独立编译的,编译后的对象文件被链接在一起。C++ 源

2023-11-19 21:25:10 188

原创 C++ 20类型转换指南:使用场景与最佳实践

情境推荐的转换方法说明移除const属性用于移除对象的const属性语言直接支持的显式转换例如,从int转换到double或bool用户定义的构造函数或转换支持的显式转换用于用户定义的转换一个类的对象转换为另一个(无关)类的对象bit_cast()用于无关类之间的对象转换同一继承层次中的类的指针对象转换(推荐) 或用于继承层次中的指针对象转换同一继承层次中的类的引用对象转换(推荐) 或用于继承层次中的引用对象转换不相关类型的指针转换用于完全不相关的指针类型之间的转换不相关类型的引用转换。

2023-11-19 20:33:36 132

原创 C++ 20类型转换指南:使用场景与最佳实践

情境推荐的转换方法说明移除const属性用于移除对象的const属性语言直接支持的显式转换例如,从int转换到double或bool用户定义的构造函数或转换支持的显式转换用于用户定义的转换一个类的对象转换为另一个(无关)类的对象bit_cast()用于无关类之间的对象转换同一继承层次中的类的指针对象转换(推荐) 或用于继承层次中的指针对象转换同一继承层次中的类的引用对象转换(推荐) 或用于继承层次中的引用对象转换不相关类型的指针转换用于完全不相关的指针类型之间的转换不相关类型的引用转换。

2023-11-18 16:25:27 102

原创 C++高级编程:构建高效稳定接口与深入对象设计技巧

类是C++中的主要抽象单位。你应该将抽象原则应用于你的类,尽可能将接口与实现分离。具体来说,你应该使所有数据成员私有,并可选择性地提供getter和setter方法。这就是SpreadsheetCell类的实现方式:m_value是私有的,而公共的set()方法设置值,getValue()和getString()方法检索值。

2023-11-11 21:00:53 303

原创 深入理解C++20:类与对象的高级特性及运算符重载

在你的类中,可以声明const数据成员,这意味着它们在创建和初始化后不能被改变。当常量仅适用于类时,应该使用(或)数据成员来代替全局常量,这也称为类常量。整型和枚举类型的数据成员即使不将它们作为内联变量,也可以在类定义内部定义和初始化。例如,你可能想要为指定一个最大高度和宽度。如果用户尝试构造一个高度或宽度超过最大值的,将使用最大值代替。你可以将最大高度和宽度作为类的注意,你也可以选择在宽度或高度超过最大值时抛出异常,而不是自动将宽度和高度限制在其最大值内。

2023-11-11 21:00:14 380

原创 深入理解C++20:类与对象的高级特性及运算符重载

在你的类中,可以声明const数据成员,这意味着它们在创建和初始化后不能被改变。当常量仅适用于类时,应该使用(或)数据成员来代替全局常量,这也称为类常量。整型和枚举类型的数据成员即使不将它们作为内联变量,也可以在类定义内部定义和初始化。例如,你可能想要为指定一个最大高度和宽度。如果用户尝试构造一个高度或宽度超过最大值的,将使用最大值代替。你可以将最大高度和宽度作为类的注意,你也可以选择在宽度或高度超过最大值时抛出异常,而不是自动将宽度和高度限制在其最大值内。

2023-11-10 14:33:58 157

原创 深入浅出RVO、NRVO以及std::move的策略与影响

在C++编程实践中,理解返回值优化(Return Value Optimization, RVO)和命名返回值优化(Named Return Value Optimization, NRVO)对于编写高效的代码至关重要。这些编译器优化技术可以显著减少不必要的对象拷贝,优化程序的性能。同时,std::move的出现增加了对于对象资源管理的精细控制,但其滥用可能会破坏编译器的优化。本文将深入探讨RVO、NRVO以及std::move之间的关系和影响。

2023-11-07 16:06:55 137

原创 深入理解C++方法重载、内联与高级用法

你可能已经注意到,你可以在一个类中写多个构造函数,所有这些构造函数都有相同的名字。这些构造函数只在参数的数量和/或类型上有所不同。你可以对C++中的任何方法或函数做同样的事情。具体来说,你可以通过为具有不同数量和/或类型的参数的多个函数使用同一个名称来重载一个函数或方法。例如,在SpreadsheetCell类中,你可以将setString()和setValue()都重命名为set()。set()方法的实现保持不变。

2023-11-04 16:24:16 113

原创 函数参数的最佳传递方式与现代C++的规则

在C++中,如何最佳地传递函数参数以及如何处理类的特殊成员函数,一直是优化性能和代码质量的重要话题。下面我将详细解释这些概念。

2023-11-03 17:03:56 128

原创 C++中低级内存操作

在你将遇到的99%(有人可能会说100%)的情况中,C++中的内置内存分配功能是足够的。在幕后,new和delete完成了以适当大小的块分配内存、维护可用内存区域列表以及在删除时将内存块释放回该列表的所有工作。但是,当资源约束非常紧张,或者在非常特殊的条件下,例如管理共享内存,实施自定义内存管理可能是一个可行的选项。不用担心,这并不像听起来那么可怕。基本上,自己管理内存意味着类会分配一大块内存,并根据需要将该内存分配出去。这种方法有什么好处呢?管理自己的内存可能会减少开销。当你使用new。

2023-10-26 20:03:28 178

原创 精通代码复用:设计原则与最佳实践

在你开始设计的所有层次上,从单一函数、类,到整个库和框架,都需要从一开始就考虑到代码复用。在接下来的文本中,所有这些不同的层次都被称为组件。以下策略将帮助你合理地组织你的代码。注意,所有这些策略都专注于使你的代码具有通用性。设计可复用代码的第二个方面,即提供易用性,更多地与你的接口设计相关,将在后面进行讨论。

2023-10-25 23:02:47 431

原创 设计与对象:理解“有一个(Has-a)”与“是一个(Is-a)”关系 参考:Professional C++ (English Edition) 5th Edition

我将讨论对象之间的不同关系类型,包括程序员在构建面向对象程序时常常陷入的陷阱。在思考过程式编程或面向对象编程时,最重要的一点是要记住它们只是不同的方式来理解程序中发生的事情。程序员往往在充分理解什么是对象之前就陷入了面向对象编程的语法和术语中。在面向对象编程(OOP)中,类与类之间的关系是一个基础且关键的概念。主要有两种类型的类关系:一种是“有一个(Has-a)”关系,另一种是“是一个(Is-a)”关系。这两种关系模型在日常应用开发和设计模式中有着广泛的应用。

2023-10-24 15:36:36 71

原创 C++23:多维视图(std::mdspan)

template

2023-10-23 15:46:39 246

原创 【Linux内核】内存映射原理

物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理空间,有些架构的处理器把分配给外围设备的物理地址称为设备内存处理器通过外围设备控制器里面的寄存器来访问外围设备,寄存器分为控制寄存器,状态寄存器和数据寄存器外围设备的寄存器通常被常备连续的编址,处理器对外围设备寄存器的编址方式分为两种:I/O映射方式,内存映射方式ARM64架构分为两种内存类型:正常内存(Norm

2023-10-17 15:20:20 238

原创 OpenCV4 :并行计算cv::parallel_for_

OpenCV提供了并行处理能力,可以显著提高代码的性能。本文将介绍如何利用OpenCV的并行处理能力来优化图像处理任务。

2023-10-17 15:13:15 418

原创 OpenCV4 :基础图像处理与操作(一)

本文详细介绍了使用 OpenCV4 进行图像处理的基础知识和操作。内容包括图像的基础概念、色彩空间理解、以及如何在 C++ 中进行图像读取、显示和基础操作。

2023-10-16 21:05:15 53

原创 windows OpenCV(包含cuda)最简安装教程

vcpkg是一个开源的C++包管理器,它能帮助我们轻松地安装和管理C++库和工具。接下来,导航到vcpkg的目录,并执行bootstrap-vcpkg.bat脚本来构建vcpkg。例如,如果您将vcpkg仓库克隆到如果在运行 bootstrap-vcpkg.bat 时出现权限错误,请以管理员身份运行命令提示符通过上述步骤,您应该已经在Windows上成功安装了vcpkg。现在,您可以使用vcpkg来安装和管理您项目所需的C++库和工具。例如,要安装SFML库,可以运行命令。

2023-10-15 19:39:36 1396

原创 Qt 子线程中无限递归的信号槽导致主线程槽失效的原因和解决办法

在 Qt 的多线程环境中,特别需要注意信号和槽的连接方式和执行顺序。无限递归或事件循环阻塞都可能导致槽函数无法被正确执行。通过适当地设置连接类型,我们可以有效地解决这类问题。希望本文能帮助您更好地理解和解决这类问题。

2023-10-11 20:42:28 355

原创 OpenCV C++ Look Up Table(查找表)

查找表是一种预计算的数组或列表,用于存储特定函数的输出结果。在图像处理中,这个特定函数通常是一个颜色映射函数,用于改变图像的颜色或像素值。通过使用查找表,你可以避免在每次需要时都重新计算函数输出,从而提高效率。除了使用预定义的查找表,你还可以创建自己的自定义查找表。查找表(LUT)是图像处理中一种非常高效的方法,尤其适用于需要高速实时处理的系统。OpenCV 提供了方便的 API 来使用预定义或自定义的查找表。这不仅可以提高代码的执行速度,还可以简化代码结构。

2023-10-06 21:56:17 449

空空如也

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

TA关注的人

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