- 博客(56)
- 资源 (1)
- 收藏
- 关注
原创 实现vector类
这样做的好处有,在声明对象的时候只是开辟内存空间,而不进行无意义的默认对象构造;并且在删除资源的时候,先执行对象的析构函数,确保对象指向的外部资源被释放后,才清除当前堆内存,步骤如下。2.实现的vector版本中pop_back是指针回退,但是如果仅是回退的话,若该指针指向的test指向其他外部资源,单纯的回退会导致这一部分资源无法管理,导致空间浪费。1.在初始化的时候,开辟内存和对象构造是一起执行的;但是有些时候只是声明一个变量,这样会带来开销,构造和析构带来的。先看这一段代码运行结果。
2025-06-08 09:58:51
417
原创 C++11线程池实现
同样的对于消费者来说,也只需要关注缓冲区的内容,不需要关注生产者,通过异步的方式支持高并发,将一个耗时的流程拆成生产和消费两个阶段,这样生产者因为执行 put() 的时间比较短,而支持高并发。此时notify_one通知了线程池中等待的线程,通过操作系统的调度,假设唤醒了线程3,线程3拿到了资源锁,线程3就从wait状态中退出,开始工作,首先从任务队列中取出任务,并且释放资源锁(线程3从任务队列取出任务后就不需要锁了),开始执行取出的任务,如下图所示。这里创建了五个线程,用以执行分发的任务,属于。
2025-06-08 09:54:49
1210
原创 C++设计模式 - 单例模式
单例模式指的是,无论怎么获取,单例模式全局只需要创建一个对象,比较常用的就是日志类,在整个项目中,需要打印一些提示信息到控制台或者到日志文件中,对于这个日志打印实现,全局只需要一个日志类对象。这里介绍了的简单概念。
2025-06-07 11:20:32
912
原创 c++11线程安全
在多个线程中共享数据时,需要注意线程安全问题。如果多个线程同时访问同一个变量,并且其中至少有一个线程对该变量进行了写操作,那么就会出现数据竞争问题。数据竞争可能会导致程序崩溃、产生未定义的结果,或者得到错误的结果。代码如下打印的结果如下:按理说,线程t1将shared_data 加100000次,线程t2执行将shared_data 加100000次,执行的结果应该时200000。但是测试了5次,每一次的打印结果都小于200000,这是因为多线程间访问出现了数据竞争问题。
2025-06-07 11:18:39
382
原创 函数与运算符重载
函数重载一组函数函数名相同参数列表的个数或类型不同一组函数,函数名相同,参数列表也相同,仅仅是返回值不同,这个不叫重载。return a>b;return a>b;
2025-06-04 15:56:28
328
原创 C++四种类型转换方式
我们之前也说了static_cast也可以进行基类和派生类的转换,但是这里是不会判断直接进行转换的,不管基类指针是不是指向Dog的派生类,都一律被转换成Dog的派生类;而dynamic_cast会进行判断,只有基类指针指向的是Dog类型的派生类时,才发生转换,否则返回nullptr。当调用showAnimal方法时,如果其指向的时Dog方法,就调用eat方法,就可以通过dynamic_cast实现,如代码所示。这里通过的showAnimal函数通过基类指针指向不同的派生类,从而实现调用其对应的重写方法。
2025-06-01 23:19:39
300
原创 继承与多态
由于派生类的虚析构函数重写了基类的虚析构函数,所以这里调用的是派生类的析构函数。这里pb是Base类型的指针,当调用delete pb的时候,在Base类中找到其对于的析构函数,Base::~Base(),这里发生的是静态绑定。这里派生类的show()方法满足上述条件,发生覆盖(在虚函数中,派生类的Derive::show()覆盖了基类中的Base::show())。指针,但其指向的是派生类对象,由于基类指针的限定,当调用pb->show()方法时,就自动去派生类中的基类部分去找show方法的实现。
2025-06-01 21:53:11
862
原创 new和delete的理解
根据实验结果,可以发现开辟的内存其实地址和返回的首元素对象地址相差8个字节,这是因为当使用new[]的时候,编译器在开辟内存空间的时候会专门开辟8个字节(4或者8字节,根据编译器不同)用以存放数组的个数。而如果在delete的时候,选择delete p,编译器认为这只是一个简单的对象,只是把数组中首元素进行了删除,而不是从p-8的位置开始释放,从而造成了内存泄露。对于自定义的类类型,存在析构函数,为了调用正确的析构函数,在开辟对象数组的时候,会多开辟4或8个字节,以记录对象的个数。
2025-05-30 23:08:33
465
原创 基于c++11重构的muduo核心库项目梳理
本文梳理了muduo网络库的核心机制:1)线程模型采用主从Reactor模式,主线程负责接收连接,子线程处理IO事件;2)通过三种Channel(事件、接收、唤醒)实现事件分发;3)TcpConnection使用shared_ptr管理生命周期,避免悬空指针;4)唤醒机制跨线程执行任务,通过wakeupChannel唤醒目标线程;5)异步执行通过任务队列实现跨线程调用。关键点包括:智能指针管理对象生命周期、一致性哈希分配连接、Channel绑定保护回调执行安全。
2025-05-28 14:16:47
713
原创 pytorch部分函数理解
对于data1,可以理解为按行展开;对于data2,则理解为按列展开。对data1做一个转置即可得到data2。
2025-05-28 13:01:23
1221
1
原创 xv6实验一
这里使用了管道的阻塞特性,子进程关闭通道描述符之后,表示为可从子进程向父进程写,可从父进程读数据;父进程关闭相应通道描述符后,表示为父进程可向子进程写,子进程可向父进程读。当管道中没有数据的时候,子进程的读操作一直会被阻塞,直到父进程向子进程写入数据之后才能被执行。通过输出可以看到,因为先调用pipe为子进程分配读写文件描述符,所以,fd_c2p的读文件描述符为3,写文件描述符为4;转念一想,这是fork的机制,子进程是从父进程复制过来的,但之后就是独立于父进程了。所以,子进程和父进程在这里是独立的。
2025-05-15 09:46:15
270
原创 C++指针的深入解析
/是错误的!!!//是正确的!!!//是错误的!!!//是错误的!!!//在二级指针甚至多级指针中,两边都要有const 才算正确;//是错误的!!!//前面说到,const只负责其右边的类型构造,上面可以简化为//判断错误//是正确的!!!//简化为 int const *<<<=== int *;引用是一种更安全的指针。int a=10;int *p=&a;int &p=a;//如果不会定义引用,可以先写出指针形式,然后用等号右边的&符号覆盖等号左边的*,代码如上。
2025-03-29 22:18:55
391
1
原创 回溯算法总结
这里对nums是已经排过序了,这里i > startIndex是确定这是同一树层,而不是同一树枝的逻辑,如果是同一树枝,那么i一定等于startIndex的。可以这么理解,全排列是要将所有的值重新排列,如果是树枝回溯,那么i-1一定为ture,则说明这个不是树枝回溯,不是树枝回溯,那么一定就是树层了。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!主要不同的是,子集问题是回溯时就开始记录了,达到叶子节点返回;
2025-01-16 14:56:35
631
原创 xv6前置知识
如果我们提高父子进程的代码量,使其执行的时间大于一个时间片,应该就可以看到理想的效果,我将i设置为100,并且为了便于观察,我将遍历次数也打印下来了;一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。根据fork函数返回的参数判断,如果返回0则说明是子进程,而在主进程中fork函数会返回主进程的pid(大于0),就可以根据if语句来执行不同的代码。
2024-11-30 21:25:30
1020
10
原创 Timesformer的代码实现
经过block之后的x的维度大小为x【1,1569,768】,最后返回为x[:,0]为【1,768】根据注意力类型判断是否需要加时间编码,这个时间编码主要是为了后续进行Time Attention;就像加入位置编码后,用以Space Attention一样。,求得每一个类别的概率,取一个最大值,即实现了分类。最后返回的x[1,768为]经过分类头。下面就是一个block所执行的代码。代码主要由两部分组成,特征提取(这一部分就是下图框起来的部分。
2024-04-09 20:03:43
849
1
原创 深度学习中不同学习率调整策略
LinearLR是线性学习率,给定起始factor和最终的factor,LinearLR会在中间阶段做线性插值,比如学习率为0.1,起始factor为1,最终的factor为0.1。那么刚开始迭代时,学习率将为0.1,最终轮学习率为0.01。下面设置的总轮数total_iters为80,所以超过80时,学习率恒为0.01。这里的T_max是以epoch为单位的,T_max对于余弦函数学习率的半周期(下降的半周期)start_factor:起始factor。gamma:调整系数。gamma:调整系数。
2024-03-28 11:22:48
799
原创 深度学习技巧总结
lcd是进入你自己的文件夹,我理解是local cd 命令,如果要操作对方服务器直接用常用的linux命令即可,如果需要对本机服务器操作,一般是。username指的是你要远程连接对方服务器的用户名,remote_ip是要远程连接对方服务器的IP地址。参考:https://www.cnblogs.com/lsr-mark/p/15672002.html。远程连接服务器后不是手动退出ide环境,而是远程连接被中断。这里port感觉可以随便填,我一般都填22。
2024-03-10 10:30:20
655
原创 pvrcnn在openpcdet框架下的实现流程
功能:执行Set Abstration模块以聚合特征通过FPS获得关键点(kitti数据集中设置是2048个)首先对关键点通过SA模块聚合特征,拼接到第一处对BEV视图通过SA模块聚合特征,拼接到第二处对经过不同比例稀疏卷积下采样的voxel分别进行VSA聚合,拼接到后面的位置"""Args:Returns:"""'''通过最远点采样,获取每一帧点云的关键点''''''Extended VSA中对BEV插值SA操作'''
2023-10-24 22:22:06
581
原创 关于gt_sampling的理解
1、按类别在实例库中取一定数目的groud truth标签数据(包括标注框(坐标、大小、偏向)、标注框内的点云数据对应的bin文件路径,当前对应的图片索引等)2、对采样出的groud truth标签进行碰撞检测,选出符合实际情况的有效groud truth标签3、将有效的groud truth标签放入当前数据样本中读取对应的groud truth内的bin文件并转换成numpy格式(点云数据)对局部的groud truth内点云数据加上一个全局的xyz偏移。
2023-10-18 20:02:55
107
2
原创 关于PointHeadBox类的理解
(self.assign_targets--------->self.assign_stack_targets-----> self.box_coder.encode_torch调用了PointResidualCoder类中的encode_torch函数)(self.generate_predicted_boxes--------->self.box_coder.decode_torch调用了PointResidualCoder类中的decode_torch函数)得到了从G_hat到G的1*8维参数。
2023-10-05 10:00:07
1314
原创 安装OpenPCDet跑通PointRCNN
刚开始接触OpenPCDet这个库,配置环境好久都不成功,后面看到这篇博文给我提供了思路,本文主要记录一下安装过程中出现的错误。
2023-10-03 15:09:14
2928
5
原创 dm-vio-ros的安装(详细)
在原来的那个终端,进入dm-vio/caktin_ws/devel/lib文件下,输入。在安装过程中,有些地方提示的不是很清楚,故写一篇记录避免再次犯错。在dm-vio的一个子目录下创建ros工作空间,如图所示。并在src下克隆dm-vio-ros。再新开一个终端,运行下好的数据包。在src下初始化工作空间。返回上一级目录,编译。
2023-04-04 19:57:31
850
原创 JavaScript和TypeScript入门
JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,使用JavaScript可以轻松的实现与HTML的互操作,并且完成丰富的页面交互效果,它是通过嵌入或调入在标准的HTML语言中实现的,它的出现弥补了HTML的缺陷,是java与HTML折衷的选择。.................................
2022-07-09 21:37:17
664
原创 css入门学习
学过前端的人,对HTML语言一定不会感到陌生,因为它是前端设计最基本的工具。然而,随着网站越来越复杂,网站的维护变得越来越重要,对设计师的要求也越来越高。
2022-06-25 16:19:22
4189
原创 Html入门
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、HTML是什么?二、使用步骤1.html文档基本结构2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、HTML是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.ht.
2022-06-09 20:13:20
1432
原创 基于stm32片内Flash数据的DAC输出
stm32片内Flash的提示音播放前言一、DAC简介二、使用DAC输出单周期的正弦波前言使用用Adobe audition音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB),然后编程将其分批次写入Stm32f103芯片内部flash区域。然后将数字音频还原播放,编程读取此段音频,我们这里通过stm32f103自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;.
2021-12-31 04:00:00
704
原创 STM32之Flash读写操作
本例是以读写C8T6最小系统板的Flash,了解其Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。
2021-12-27 21:58:25
6294
原创 基于C8T6核心板的ucOS文件移植
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码
2021-12-04 19:30:00
673
原创 玩转oled屏(基于SPI协议)
玩转OLED屏一、简介(一)SPI协议简介(二)OLED简介二、OLED滚动显示长字符(一)常用OLED滚屏命令1.水平左/右移2.垂直和水平移动(二)取字模(三)OLED屏滑动演示三、OLED显示温湿度总结一、简介(一)SPI协议简介通讯开始/停止标号①处,NSS信号线由高变低,是SPI通讯的起始信号。NSS是每个从机各自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中⑥的标号处,NSS信号由低变高,是SPI通讯的停止信号.
2021-11-22 15:09:59
14726
1
原创 【平衡小车】之PWM驱动电机
STM32产生PWM波控制电机前言一、L298N驱动模块二、STM32生成PWM波(一)初始化代码(二)PWM代码分析(三)预装载器的功能?三、控制电机速度(一)PWM调速原理总结前言我们直到,使用单片机内部处理的是0,1这样的数字信号,而如果我们仅仅使用0,1来控制小车的速度,这肯定是不现实的,工程师们想到了对高电平与整个周期的比例来输出电压的平均值,这样几个单一的电压就变成了多种不同的模拟输出电压,真是无处不AD/DA转换啊!一、L298N驱动模块接线准备这是我使用到的电机的接线原
2021-11-22 00:00:00
12541
1
原创 AHT20温湿度采集(I2C协议)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码
2021-11-20 18:30:00
8519
3
原创 【平衡小车】前言
一直以来,都想自己DIY一个平衡小车,但是由于种种原因,担心自己无法做好、没有时间去做等等,这件事也就一拖再拖。今天恰好看到B站up主天下行走ㅍ_ㅍ手把手交如何制作平衡小车的视频,于是自己也想跟着动手做一个,也算是做个学习总结吧!视频地址1.器件准备2.新建工程模板3.移植所需文件...
2021-11-15 00:00:00
1578
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人