- 博客(55)
- 收藏
- 关注
原创 C++中的内存管理(二)
某些应用需要一次性为很多对象分配内存的功能。newallocator,其中后者允许将分配和初始化分离,提供更好的性能和更灵活的内存管理能力。大多数应用应该使用标准库容器而不是动态分配的数组。使用容器更为简单,更不容易出现内存管理错误并且可能拥有更好的性能。使用容器的类可以使用默认的拷贝、赋值和析构操作。分配动态数组的类必须定义自己版本的操作,在拷贝、复制以及摧毁对象时管理所管理的内存。
2025-08-21 17:29:05
457
原创 C++中的内存管理(一)
值得注意的是,传统构造初始化,若不加参数,则进行值初始化。但是对于内置类型:值初始化有着良好定义的值,而默认初始化的对象的值则是未定义的。类似的,对于类中的内置类型成员,如果没有显示初始化,而是仅使用默认构造函数的话,则它们的值也是未定义的。默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型对象的值将是未定义的,而类类型对象将用默认构造函数初始化。值得注意的是,使用这两个指针的类通常不能依赖于默认的拷贝、赋值、析构函数。分配的内存,或者将相同的指针释放多次,其行为是未定义的。
2025-08-14 17:17:16
242
原创 C++中的关联容器
/初始化一个map时,必须提供key, value并包含在花括号中。//定义一个包含20个元素的vec,保持0-9每个整数的两个拷贝i < 10;++i)
2025-08-06 17:06:39
924
原创 C++中的泛型算法(三)
反向迭代器就是在容器中从尾元素反向移动的迭代器。其递增递减操作的含义会颠倒过来,++it会移动到前一个元素,–iter会移动到后一个元素。与其他容器不同,list和forward_list因为是链表实现的,应该优先使用成员函数版本得算法而不是通用算法。值得注意的是,反向迭代器需要支持递增和递减运算符,因此forward_list和流迭代器不能创建反向迭代器。插入迭代器绑定一个容器。当创建一个流迭代器时,必须指定迭代器将要读写的对象类型。并不是指向一个位置,而是指向相邻的位置。指向相同的元素的元素位置。
2025-08-05 17:40:39
857
原创 C++中的泛型算法(二)
其中,newCallable是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定callable的参数。如果我们采用引用捕获的方式捕获一个变量,就必须保障被引用的对象在lambda执行期间是存在的。值捕获[a]:与传值参类似,采用值捕获的前提是变量可以拷贝,不同的是,被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝。arg_list的参数可能包含形如_n的名字,表示占位符,_1表示newCallable的第一个参数,_2表示第二个参数,以此类推。要想使用占位符,还得使用。
2025-08-02 17:14:05
732
原创 OpenGL实现鼠标控制绕着指定轴旋转
有这么一个开发场景,选定指定轴,操作鼠标控制模型绕着着指定轴旋转。代码仅供参考,可根据实际应用场景进行调整。
2025-07-21 16:49:42
325
原创 Qt 实现新手引导
对于一个新安装的软件或者一个新的功能,提供一个新手引导步骤,能够让用户快速熟悉。这是最终效果,每一个按钮都会有一个简单引导,通过点击上一步、下一步来切换不同的指导。当前引导的功能,会有一个高光区,该高光区可点击,其他区域不可点击。引导结束后回归主界面。
2025-07-11 17:22:52
247
原创 如何避免QGraphicsItem鼠标样式污染QGraphicsView鼠标样式
在开发的过程中难免会遇到根据不同应用场景设置鼠标样式的需求,当我们同时在view和item中设置不同的样式后,通常会出现item鼠标样式污染view鼠标样式的情况。如果在非hover的时候,通过setCursor恢复正常样式,那么就会出现污染view鼠标样式的情况。值得注意的是,如果先item也相应view的拖动,可以先调用基类的hoverMoveEvent。可以通过this->unsetCursor();
2025-07-02 10:01:00
137
原创 C++中的泛型算法(一)
标准库容器定义的操作集合很小。标准库并未给每个容器添加大量功能,而是提供了一组算法,这些算法大多数都独立于任何特定的类型。这些算法是通用的(泛型的),可以适用于不同类型的容器和元素。大多数算法都定义在algorithm中,numeric中也定义一组数值泛型算法。由于find操作的迭代器,因此我们可以用同样的find函数在任何容器中查找值。值得注意的是,虽然迭代器令算法不依赖于容器,但算法依赖于元素类型的操作。大多数算法都使用了一个或多个元素类型上的操作。例如,find使用了==完成每个元素和给定值的比较。
2025-02-18 16:05:02
693
原创 C++中的顺序容器(二)
适配器是标准库中一个通用的概念。添加一个新元素时,如果没有空间容纳新元素,就必须分配新的空间来保存已有元素和新的元素。对于一个给定的适配器,可以使用哪些容器是有限制的,所有适配器都要求容器具有添加和删除元素的能力(array不能)以及访问尾元素的能力(forward_list不能)。为了避免这种代价,vector和string的实现通常会分配比新的空间需求更大的内存空间。例如,stack适配器接受一个顺序容器(array、forward_list除外),使其操作看起来像一个stack一样。
2025-02-17 17:47:41
1924
原创 C++中的顺序容器(一)
元素在顺序容器中顺序与其加入容器时的位置相对应。除非有很好的理由选择其他容器,否则使用vector;程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list;要求随机访问,vector、deque;要求在容器的中间插入或删除,list或forward_list;只在头尾插入或删除,deque;输入时要求在中间插入元素,随后要求随机访问:如果在中间插入只是为了排序的话,可以在vector尾部添加元素之后在使用sort排序;
2025-02-17 11:41:18
687
原创 C++中的IO库
由于不能拷贝IO对象,因此不能将形参或者返回类型设置为IO类型。进行IO操作的函数通常以引用方式传递和返回。读写一个IO对象会改变其状态,因此传递和返回的引用不能设置为const。每个输出流都管理一个缓冲区,用来保存程序读写的数据。文本串可能被立即打印出来,但也有可能被操作系统保存在缓冲区,随后在打印。每种文件流都定义了默认的文件模式,当未指定文件模式时,就使用默认模式。还有一点值得注意,如果程序崩溃,输出缓冲区不会被刷新。其中,宽字符版本的类型和函数的名字以w开始。
2025-02-14 11:43:38
890
原创 C++中的类
类的作者通常需要定义一些辅助函数,比如read、print、add等。尽管这些函数定义的操作与类相关,但它们实际并不属于类本身。这些函数的声明应该和类的声明在同一个头文件中。return is;//print应该减少对格式的控制,这样可以确保用户可以正确控制格式return os;
2025-02-10 15:09:28
630
原创 c++中的变量和基本类型(二)
字符型划分为三种:char、signed char、unsigned char。值得注意的是,前两种类型并不一样。char类型会根据编译器的表现为signed活unsigned。变量变量提供一个具名的、可供程序操作的存储空间。对于C++程序员来说,变量和对象一般可以互换使用。作为C++11中的新标准,用花括号初始化得到了全面的应用。这种初始化形式被称为列表初始化。现在不论是初始化对象还是某些时候为对象赋值,都可以使用这样一组由花括号括起来的初始值了。如果定义变量时没有指定初始值,那么会被默认初始化。
2025-02-05 17:54:20
738
原创 C++中的表达式
C++中的表达式由一个或多个操作数通过操作符组合而成。最简单的表达式仅包含一个字面值常量或变量。每个表达式都会产生一个结果。如果表达式中没有操作符,则其计算结果就是操作数本身。除了特殊的用法外,表达式的结果是,可以读取该结果值,但是不允许对它进行赋值。
2025-01-09 17:40:57
761
原创 C++中的数组和指针
/ 一般存在两种声明指针的方式,这两种效果是相同的, 重要的是统一自己的编码风格// *号靠近标识符// *号靠近类型名// 当在一条语句中声明多个指针时,一般使用第一种方式在c++中,指针和数组有着非常紧密的联系。// 等价于 string *p = &nums[0]// 使用auto 推断数组得到也是指针类型// string*p2 = p;// ok, 都是string*// 使用decltype可以得到数组类型newNum = p;
2025-01-06 17:57:26
436
原创 多标签的不平衡
在对目标 bag 生成新数据的同时,不仅会影响目标 bag 的 IRlbl(IRperLabel),还会影响其它 bag 的值,因此在每一个周期开始之前,都要重新计算该值,如果超过 MeanIR,则不在为该 bag 生成新数据。整个式子想表达的意思就是拥有最多正标签的标签与目标标签的一个比值,加入目标标签就是拥有最多正标签的标签则比值为 1,目标标签拥有的正标签越少则不平衡度越大。为每一个少数类标签生成一个 bag,里面的样本都拥有该标签。对每一种标签进行一次判断,找到所有的少数类。
2025-01-03 14:19:21
519
原创 Learning from imbalanced data: open challenges and future directions
imbalanced data
2022-06-09 20:19:44
72
原创 GPU中值、均值滤波效果
GPU的应用均值滤波中值滤波时间对比均值滤波如上图所示,从左到右分别是原图,以及通过均值滤波33,55处理后的图片,55的效果比33的好。中值滤波如上图所示,从左到右分别是原图,以及通过中值滤波33,55处理后的图片,55的效果比33的好。时间对比中值滤波比均值滤波效果好。无论是中值还是均值滤波,55滤波器的的效果都比33的好。当使用中值滤波时,利用gpu比利用cpu可以节约大量的时间,因为中值滤波需要进行排序处理,使用cpu的多重循环较为耗时,gpu则可以少两重循环。...
2022-05-30 21:32:23
579
1
原创 不平衡问题相关讨论
2022/05/26类别不平衡的分类问题类别不平衡的分类问题重采样(re-sampling):这是解决数据类别不平衡的非常简单而暴力的方法,更具体可以分为两种,对少样本的过采样,或是对多样本的欠采样。当然,这类比较经典的方法一般效果都会欠佳,因为过采样容易overfit到minor classes,无法学到更鲁棒易泛化的特征,往往在非常不平衡的数据上泛化性能会更差;而欠采样则会直接造成major class严重的信息损失,甚至会导致欠拟合的现象发生。数据合成(synthetic samples):若
2022-05-26 18:52:24
678
原创 Spectral–spatial hyperspectral image classification
2022/05/18-遥感影像的全色、多光谱、高光谱图像高光谱图像分类Spectral–spatial hyperspectral image classification based on KNN遥感影像的全色、多光谱、高光谱图像遥感成像原理: 光进入相机镜头,光电感应装置将光信号转换为电信号,量化电脉冲信号,记录为一个像素值。传感器响应函数设计为,要使光电感应装置产生这个电脉冲信号,光子强度必须达到一个阈值。进入镜头的光子数量取决于相机的感受野大小,镜头能通过的光子。多光谱图像要分出多个波段,镜头会
2022-05-18 15:55:33
863
原创 每日总结(2022/05/17-)
2022/05/17-线程配置实验设备实现2个矩阵(Width=2048, Height=1024)的相加,输入的矩阵A,B按照以下要求初始化,矩阵A的初始值全为本人学号的最后1位数字,矩阵B的初始值全为本人学号的倒数第2位数字。同时用CPU代码实现,比较两个代码的运行时间。用二维线程结构来计算矩阵加法,每一个线程对应一个矩阵元素线程配置从上图得出我的计算机在每个Block有128,256,512个线程时,资源利用率最大。int nx = 2048;int ny = 1024;dim3
2022-05-17 21:15:17
616
1
原创 CUDA进行矩阵相乘的两种方式
2022/05/16(一)目的掌握利用CUDA进行矩阵相乘的两种方式(全局内存和共享内存)(二)内容完成矩阵乘法的并行程序的实现任务描述:考虑计算两个大规模的矩阵乘法: C=A*B。其中A的大小为1000×800,B矩阵大小为800×1200,C矩阵大小为1000×1200。矩阵初始化要求如下:(1)A矩阵的初始化:每一行第1个位置为学号最后1位,以后位置为第1个位置依次加1。例如张三同学学号:20210001123,A[0][0] =3,A[0][1] =4,A[0][2] =5…(2)B
2022-05-16 21:06:04
77
原创 CUDA 程序架构
2022/05/13目的内容(一)(二)(三)目的熟悉基本的 CUDA 程序架构以及如何调用相应的 API 进行 CUDA 编程。内容实现 2 个矢量(长度 50000)的相加,输入的矢量 A,B 按照以下要求初始化,矢量A的初始值全为本人学号的最后 1 位数字,矢量 B 的初始值全为本人学号的倒数第 2 位数字。同时用CPU代码实现,比较两个代码的运行时间。完成以下三个版本的 CUDA 核函数。(一)用每个线程来计算矢量加法的一个输出元素。/** * Vector addition:
2022-05-13 22:57:27
74
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人