- 博客(38)
- 收藏
- 关注
原创 解锁规划算法:从原理到实践
在计算机科学和机器人学等众多前沿领域,规划算法都占据着举足轻重的地位,是推动技术进步与创新应用的核心力量。在计算机科学中,从操作系统的资源调度,到复杂的软件项目管理,规划算法无处不在。以操作系统的进程调度为例,它需要根据不同进程的优先级、运行时间等因素,合理安排 CPU 资源,确保各个进程高效运行,避免出现资源冲突和饥饿现象。在任务规划方面,如生产制造流程的安排、物流配送路线的规划,规划算法能够综合考虑成本、时间、资源限制等多方面因素,寻找最优解决方案,从而降低成本、提高效率。
2025-04-18 10:02:49
1769
原创 【C++内存管理】:C++内存分区
在 C++ 编程中,深入理解内存分区是至关重要的,它如同大厦的基石,支撑着程序的高效、稳定运行。合理的内存管理能够显著提升程序的性能,避免诸如内存泄漏、栈溢出等常见错误,这些错误一旦出现,往往会让程序陷入不稳定状态,甚至崩溃。就好比在建造一座高楼时,如果对建筑材料的存放和使用没有合理规划,可能会导致建筑结构不稳,随时有倒塌的风险。而 C++ 内存分区,正是为了更有效地管理和利用系统资源,将内存划分为不同的区域,每个区域都有特定的用途和访问权限,为开发者提供了精细的内存控制手段,有助于构建更加健壮的软件系统。
2025-04-16 09:52:18
185
原创 【C++编程基础】:struct和class的区别
在 C++ 编程的世界里,struct和class就像我们的左膀右臂,各有千秋。struct以其简单直接的数据聚合方式,在处理简单数据结构时游刃有余,为我们提供了高效的数据访问和操作体验;而class凭借强大的封装、继承和多态特性,成为构建复杂对象体系的得力助手,让我们能够编写出高可维护性和可扩展性的代码。回顾它们的区别,struct默认的public成员访问权限和public继承方式,使其更侧重于数据的直接展示和共享;
2025-04-16 09:31:58
111
原创 【C++编程基础】:全局变量、静态局部变量、局部变量详解
在 C++ 中,全局变量是在所有函数外部定义的变量,其作用域是整个程序。它就像是一个公共的资源,被整个程序所共享。例如,在一个游戏开发项目中,可能会定义一个全局变量来表示游戏的当前得分,这样在游戏的各个功能模块(不同函数)中都可以方便地访问和修改这个得分。全局变量的定义非常简单,只需在函数外部指定变量的类型和名称即可,还可以进行初始化。// 定义一个全局变量,用于存储游戏得分,初始值为0// 函数用于增加游戏得分// 直接访问和修改全局变量gameScore。
2025-04-11 13:43:07
54
原创 【C++编程基础-关键字】:atomic
在 C++ 多线程编程的广袤领域中,atomic 关键字宛如一颗璀璨的明星,占据着举足轻重的地位。它所代表的原子操作,为我们解决多线程环境下的数据一致性和线程安全问题提供了强大的支持。从概念层面来看,原子操作具有不可分割、不可中断的特性,这使得对共享数据的操作变得安全可靠。std::atomic 模板类作为实现原子操作的核心工具,如同一个万能的容器,能够封装多种基本数据类型,赋予它们原子操作的能力。在操作函数与运算符方面,std::atomic 类提供了丰富多样的选择。
2025-04-11 13:32:05
93
原创 【C++编程基础-关键字】:extern
externextern关键字在 C++ 中主要用于:在多个源文件间共享全局变量或函数。与 C 语言代码进行互操作,避免名称修饰导致的链接问题。正确理解和使用extern,有助于编写模块化、可维护的 C++ 程序,尤其在涉及多语言混合编程时,extern显得尤为重要。
2025-04-10 17:04:28
61
原创 【C++编程基础-关键字】:constexpr和const
在 C++ 中,constexpr用于定义编译期常量,这些常量的值在编译阶段就已经确定,并且不能被修改。这与普通的const常量有所不同,虽然const常量也表示其值不会改变,但const常量不一定能在编译期求值。// 这里的a虽然是const常量,但值在运行时才确定// b是constexpr常量,值在编译期确定上述代码中,getValue函数返回的值在运行时才能得到,所以const修饰的a的值在运行时才确定;而constexpr修饰的b,由于初始值是编译期常量10,所以b的值在编译期就确定了。
2025-04-08 16:36:04
1076
原创 【C++编程基础-关键字】:new和malloc的区别
在 C++ 编程的领域中,new和malloc作为动态内存分配的重要工具,各自有着独特的特点和适用场景。new操作符紧密贴合 C++ 面向对象的特性,从自由存储区分配内存,自动计算内存大小,返回精准类型指针,具备类型安全性,通过异常处理内存分配失败情况,自动调用构造函数和析构函数,在处理对象时简洁高效。
2025-04-08 13:22:22
34
原创 【C++编程基础-关键字】:define和inline的区别
define和inline作为 C++ 编程中的两个重要工具,各自有着独特的特点和应用场景。define在预处理阶段进行文本替换,能够方便地定义常量和实现简单的宏逻辑,在一些对代码简洁性和修改便利性要求较高的场景中表现出色。然而,它缺乏类型安全检查,容易引发边界效应和命名冲突等问题,使用时需要格外小心。inline函数则在编译阶段发挥作用,通过将函数体嵌入调用处,减少了函数调用的开销,特别适用于小型频繁调用的函数以及类的访问器和设置器等场景,能有效提升程序性能和代码可读性。
2025-04-07 19:23:54
344
原创 【C++编程基础】:CMake详细使用方法
CMake 是一个跨平台的构建系统生成工具 ,它本身并不直接参与软件的实际构建工作,就如同一位幕后的策划者,不亲自上阵表演,却能精心安排一场精彩的演出。它的核心任务是依据用户编写的 CMakeLists.txt 文件中的指令和配置信息,为不同的平台和编译器生成对应的标准构建文件,如在类 Unix 系统中生成 Makefile 文件,在 Windows 系统下生成适用于 Visual Studio 的项目文件 ,这些生成的构建文件才是真正驱动软件编译和链接过程的 “执行者”。
2025-04-07 11:05:53
135
原创 【C++编程基础-关键字】:define和typedef的区别
define是 C++ 中的预处理指令,它的基本语法非常简洁:#define 标识符 替换文本。在编译之前,预处理器会将代码中所有出现的 “标识符” 替换为 “替换文本” ,这种替换是简单而直接的,就像是一场文字的 “变身魔法”。在后续的代码中,只要出现PI,预处理器都会将其替换为3.14159。std::cout << "圆的面积是: " << area << std::endl;return 0;std::cout << "圆的面积是: " << area << std::endl;
2025-04-07 10:24:46
35
原创 【C++编程基础】:头文件保护机制
在 C++ 编程中,头文件保护是一种机制,用于防止同一个头文件在同一个源文件中被多次包含和处理。简单来说,它就像是一个防止重复劳动的 “关卡”,确保头文件中的内容只被编译器处理一次。为了更好地理解这个概念,我们可以用生活中的例子来类比。假设你要为一场聚会准备食物,你列了一张购物清单(类似于头文件),清单上写着你需要购买的食材和数量。当你去超市购物时(编译器编译源文件),如果没有一个有效的机制来管理这张清单,你可能会不小心多次购买清单上的同一种商品,导致浪费和混乱。
2025-04-07 10:00:32
40
原创 【C++编程基础-关键字】:static
static关键字在 C++ 中是一个功能强大且应用广泛的关键字,它在修饰变量、函数和类成员时,都有着独特的作用和特性。通过修饰局部变量,static赋予了局部变量持久的生命周期,使其能够在函数多次调用间保存状态;修饰全局变量时,它将变量的作用域限制在声明文件内部,提高了代码的安全性和模块化程度。在函数方面,静态函数不仅避免了命名冲突,还增强了代码的封装性,使代码结构更加清晰。而静态类成员函数,由于其与类本身相关联,能够在不创建对象的情况下被调用,为处理类级别的数据和操作提供了便利。
2025-04-07 09:47:42
26
原创 【C++编程基础-关键字】:const
在 C++ 中,const和#define都可以用于定义常量,但它们在很多方面存在差异。定义常量:const是一个关键字,用于声明一个常量,它必须指定类型,例如const int num = 10;。而#define是预处理器指令,用于简单的文本替换,比如#define NUM 10 ,它没有类型的概念。生命周期:const常量是在编译阶段进行处理,在程序运行时作为一个只读变量存在。而#define宏是在预处理阶段进行简单的文本替换,在编译阶段之前就已经完成替换工作,其生命周期在编译之前。作用域。
2025-04-07 09:24:51
29
原创 【C++编程基础】:强制类型转换
C++ 中的强制类型转换是一个强大而复杂的工具集,包括 C 风格强制类型转换以及 C++ 特有的static_cast、const_cast、dynamic_cast和reinterpret_cast。C 风格强制类型转换简单直接,但存在诸多安全隐患,如数据截断和内存安全问题。而 C++ 风格的类型转换操作符则针对不同的应用场景,提供了更安全、更精确的转换方式。static_cast适用于基本数据类型转换、指针转换以及类层次结构中的上行转换,在编译时进行,性能开销较小,但下行转换时需谨慎使用。
2025-04-07 09:08:11
28
原创 C++指针与引用:差异、应用及最佳实践
指针,在 C++ 的世界里,是一种特殊的变量,它的使命是存储其他变量在内存中的地址,而非变量的值本身。这就好比一个房间号,它并不代表房间里的物品,却能引领我们找到对应的房间。在 32 位系统中,指针占用 4 个字节(32 位 = 4 字节),而在 64 位系统中,指针占用 8 个字节。在 C++ 中,定义指针的语法简洁明了:数据类型 * 指针变量名。例如,int num = 10;
2025-04-03 14:51:40
50
原创 C++编程:虚函数和虚函数列表
虚函数是 C++ 中实现多态性的关键,它允许在派生类中重新定义与基类同名的函数,从而实现不同的行为。在基类中,使用virtual关键字来声明虚函数。public:// 声明虚函数draw在上述代码中,draw函数被声明为虚函数。需要注意的是,虚函数必须是类的成员函数,不能是全局函数或静态成员函数。而且,虚函数的声明只能出现在类的定义中,不能在类外的函数定义中添加virtual关键字。虚函数和虚函数列表是 C++ 多态性的核心机制,它们在 C++ 编程中扮演着至关重要的角色。
2025-04-03 10:11:07
39
原创 C++ STL:六大组件全解析
STL 标准库中也提供了一些常用的仿函数 ,例如算术仿函数(如std::plus、std::minus、std::multiplies等)、关系仿函数(如std::equal_to、std::not_equal_to、std::greater等)和逻辑仿函数(如std::logical_and、std::logical_or、std::logical_not等)。迭代器的行为类似于指针,它可以指向容器中的某个元素,通过迭代器,我们可以遍历容器中的元素,读取和修改元素的值。
2025-04-03 09:26:21
340
原创 C++编程:指针
指针定义的语法为:数据类型 *指针变量名。例如,int *p;这条语句定义了一个名为 p 的指针变量,它指向的是 int 类型的数据。这里的 * 是指针声明符,表明 p 是一个指针。需要注意的是,指针变量本身也占据一定的内存空间,其大小与操作系统相关,在 32 位系统下通常为 4 个字节,64 位系统下则为 8 个字节,且这一大小与它所指向的数据类型无关。函数指针是指向函数的指针变量,它存储的是函数的入口地址。函数指针的声明需要明确函数的返回类型和参数列表。
2025-04-02 11:20:26
621
原创 C++强制类型转换:从入门到精通
为了更清晰地展示 C++ 中四种强制类型转换运算符(static_cast、const_cast、reinterpret_cast和dynamic_cast)的区别,下面通过表格形式对它们的功能、用法、适用场景和注意事项进行详细对比:转换运算符功能用法适用场景注意事项用于具有明确定义的类型之间的转换,包括基本数据类型转换以及类层次结构中相关类型的转换基本数据类型间转换,如int转float;类层次结构中的上行和下行转换(下行转换需谨慎)下行转换时没有运行时类型检查,可能导致未定义行为;
2025-04-02 11:01:35
407
原创 C++泛型编程:开启代码复用
泛型编程,简单来说,是一种编程范式,它允许我们编写与数据类型无关的代码。在泛型编程中,类型被参数化,使得同一套代码可以适用于多种不同的数据类型。这种编程方式打破了传统编程中对特定数据类型的依赖,极大地提高了代码的通用性和可复用性。这里的typename T声明了一个类型参数T,它可以代表任何数据类型,如int、double、float等。当我们调用这个函数时,编译器会根据传入的实际参数类型,自动生成相应的函数实例。// 编译器自动生成add<int>函数实例。
2025-04-02 10:41:53
548
原创 C++ 编程:左值引用与右值引用
在 C++ 的编程世界里,左值引用和右值引用就像是两把神奇的钥匙,各自开启了不同的大门,为我们带来了高效、灵活的编程体验。左值引用作为传统 C++ 就存在的特性,它就像是一位忠诚的伙伴,紧紧跟随有固定内存地址的左值对象,在函数参数传递和返回值场景中,通过避免对象的拷贝,为程序的高效运行立下了汗马功劳。而右值引用则是 C++11 引入的新成员,它像是一位充满活力的探险家,专门与那些短暂存在的右值对象打交道,为 C++ 带来了移动语义和完美转发这两大强大的特性。
2025-04-02 10:15:43
617
原创 C++11:开启现代C++编程新时代
假设我们正在开发一个网络服务器,该服务器需要处理大量的并发请求,实现用户的登录、注册、数据查询等功能。在项目开发初期,使用的是 C++98/03 标准,随着业务的不断发展和用户量的增加,服务器面临着诸多挑战。在内存管理方面,由于手动管理内存,频繁地使用new和delete操作符,导致代码中出现了一些内存泄漏的问题。例如,在处理用户请求时,为了存储用户的临时数据,分配了一块内存,但在请求处理完成后,由于代码逻辑的复杂性,部分内存没有被正确释放,随着时间的推移,服务器的内存占用不断增加,性能逐渐下降。
2025-04-02 09:50:31
339
原创 C++ 看面向过程与面向对象编程
在编程的广袤天地中,编程范式如同璀璨繁星,照亮着开发者前行的道路。而在 C++ 这门强大的编程语言中,面向过程编程与面向对象编程无疑是最为耀眼的两颗明星,它们各自散发着独特的光芒,为开发者解决问题提供了截然不同却又同样强大的思路。面向过程编程,以其简洁直接、注重步骤流程的特点,在软件开发的早期阶段大放异彩,成为众多简单任务的首选编程方式。而随着软件系统的日益复杂,面向对象编程应运而生,它以模拟现实世界中的对象及其交互为核心思想,赋予了程序更高的灵活性、可维护性和扩展性。
2025-04-02 09:17:00
450
原创 C++重载:让代码“一专多能”
函数重载,简单来说,就是在同一个作用域内,可以定义多个名字相同但参数列表不同的函数。这里的参数列表不同,具体体现在参数的类型、个数或顺序上。这三个函数都名为add,但第一个函数接受两个int类型的参数,第二个函数接受两个double类型的参数,第三个函数则接受三个int类型的参数,它们构成了函数重载。需要特别注意的是,函数重载与返回值类型无关,仅仅返回值不同的同名函数不能构成重载。// 编译错误,仅返回值不同,不能构成函数重载运算符重载,是 C++ 赋予我们的又一项强大能力,它。
2025-04-02 08:55:44
247
原创 C++ 深拷贝与浅拷贝:内存世界的“双胞胎”谜题
浅拷贝,简单来说,就是按位拷贝对象。当进行浅拷贝时,它仅仅复制对象的属性值 ,而不会复制属性所指向的内存空间。假如一个对象里包含指针类型的属性,浅拷贝只会复制这个指针的地址,而非指针所指向的实际数据。这就好比有两份地图,浅拷贝只是复制了地图的纸张,而地图上标记的宝藏地点(实际数据)并没有被真正复制,两份地图指向的是同一个宝藏地点。在 C++ 中,编译器默认生成的拷贝构造函数就是浅拷贝构造函数,它会逐位复制对象的成员变量。深拷贝是一种更为全面的对象复制方式。
2025-04-01 21:59:35
452
原创 C++ STL容器:高效编程的秘密武器
STL 容器是 C++ 编程中极为强大和实用的工具,它为我们提供了丰富的数据结构和高效的操作方法。通过深入了解序列式容器、关联式容器和容器适配器的特点与使用场景,我们能够根据具体的需求选择最合适的容器,从而编写出更高效、更易维护的代码。在实际编程中,不断练习和使用 STL 容器,积累经验,将有助于你更好地掌握它们的特性和使用技巧。同时,多阅读优秀的 C++ 代码,学习他人在容器选择和使用方面的经验,也能进一步提升你的编程能力。
2025-04-01 20:57:53
664
原创 C++智能指针:内存管理的新姿势
智能指针作为 C++ 内存管理的得力助手,凭借其基于 RAII 机制和引用计数等技术,为我们带来了前所未有的便利和安全性。std::unique_ptr的独占式管理,确保了资源的唯一性和高效性,让我们无需担心资源被意外共享而引发的问题;std::shared_ptr的共享式设计,巧妙地解决了资源在多个模块间共享时的生命周期管理难题,通过引用计数机制,精准地控制着资源的释放时机;
2025-04-01 20:30:56
678
原创 高级中学网络规划与设计实现源代码
这个实现提供了一个完整的校园网络模拟系统,涵盖了网络规划、设计、实现和管理的各个方面,可以用于教学演示或网络规划的前期模拟。
2025-03-31 16:45:31
239
原创 C++面试八股文
和静态多态(又称编译期多态,即在系统编译期间就可以确定程序将要执行哪个函数),其中动态多态是通过虚函数实现的,虚函数是类的成员函数,存在存储虚函数指针的表叫做虚函数表,虚函数表是一个存储类成员虚函数的指针,每个指针都指向调用它的地方,当子类调用虚函数时,就会去虚表里面找自己对应的函数指针,从而实现“谁调用、实现谁”从而实现多态。而C++符号表中的符号不是以函数名命名的,称为函数名修饰规则,虽然函数名相同,但是函数参数等其他属性不同,取的符号也不同,所以不会产生查询歧义的问题,使得函数可以重载。
2025-02-14 09:49:00
718
原创 《论文笔记》—— Self-supervised Image-specific Prototype Exploration for Weakly Supervised Semantic Segment
此外,通过特征的质心(粉色星形)激活每个图像上的特征,有助于探索更完整的区域(见图1所示的image-specific CAM (IS-CAM))。一种直接获取种子的方法是经验地为CAM选择阈值,但由于对象和场景的多样性,很难对不同的图像使用固定的阈值。然而,由于图像的对象和场景的多样性,学习每个类的通用类内鉴别器是相当棘手的。图3显示了所选的前景和背景示例所提出的方法。与以分类器权重为类中心计算每个像素相关性的原始CAM相比,提出的IS-CAM利用针对每幅图像量身定制的原型,实现更完整的目标区域。
2022-09-27 08:47:08
2008
2
原创 《论文笔记》——Multi-Miner: Object-Adaptive Region Mining for Weakly-Supervised SemanticSegmentation
即二值区域挖掘,其目的是将同时包含前景和背景的图像的分布映射到只包含背景的图像的分布。执行的对象自适应区域挖掘。(b)我们的方法与以前的方法挖掘的区域与CAM[32]定位的原始种子区域的比较。可以观察到,现有方法的挖掘区域在数量和规模上往往不足,对于较大的物体,对于较小的物体容易受到周围背景的污染。形式上,我们定义了两个原始分布:p0是只包含背景的图像的分布,p1是同时包含前景和背景的图像的分布。它的最后一层通道的数量等于所有可能的类别的数量,这样它就可以为图像中的每个单一类别生成一个区域映射。
2022-09-21 15:05:23
844
原创 分类精度评价中的TP、TN、FP、FN的理解
将样本分为正样本(positive)和负样本(negative)。,用来判断检测框是否为正样本的一个标准。通过与阈值比较来判断是正样本还是负样本。:分类器识别结果错误,分类器认为该样本是正样本;所以实际上该样本是负样本;:分类器识别结果错误,分类器认为该样本是负样本;所以实际上该样本是正样本;,P表示分类器判定为正样本,N表示分类器判定为负样本。:分类器识别正确,分类器认为该样本为正样本;:分类器识别正确,分类器认为该样本为负样本;TP+FP是分类器判定为正样本的总数量。TP、TN、FP、FN中。
2022-09-14 14:23:39
2321
原创 《论文笔记》——PUZZLE-CAM: IMPROVED LOCALIZATION VIA MATCHING PARTIAL AND FULL FEATURES
因此,该模型在生成图像补丁的同类CAM时,只关注对象的部分来寻找该类的关键特征。因此,图像补丁合并后的。然而,为了对语义对象进行有效的分类,所生成的分割模型往往只关注语义对象的一小部分,这就阻碍了分割模型对像素级语义知识的学习。,以最小化单个图像的CAM与图像补丁合并后的CAM之间的差异。的目标是使用像素相关模块来细化cam,该模块捕捉每个像素的上下文外观信息,并通过学习到的亲和力注意图来改变原始cam。此外,我们可以看到,平铺图像中孤立的patch生成的CAMs与原始图像得到的CAMs是不同的。
2022-09-12 14:15:10
1889
原创 《论文笔记》--Non-Salient Region Object Mining for Weakly Supervised SemanticSegmentation
基于显著区域内的目标标签是高概率正确的假设,我们首先在伪标签的引导下对初始预测的目标区域进行扩展。不同于现有的方法主要集中在显著区域的伪标签精炼,我们建议发现更多的对象在非显著区域进行弱监督语义分割。在OAA的基础上,我们生成了具有更多完整区域的在线累计类注意力地图(OA-CAMs),并利用其整体注意力模型对目标对象区域的低注意力值进行强化。对于分割网络来说,利用伪标签只包含显著区域内的物体标签来检测显著区域外的物体仍然是一个挑战。Lij是(i,j)位置的初始标签中的值,表示像素的伪标签。
2022-09-08 10:05:21
1036
转载 softmax函数
softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。
2022-09-07 13:25:29
485
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人