- 博客(180)
- 资源 (3)
- 收藏
- 关注
原创 python | setup.py里有什么?
对于C或C++ 代码,当我们在编译的时候,需要指定 包含的头文件目录,源代码目录,引用的库文件名称,引用的库文件的目录,这样编译器才能找到 我们自己编写的头文件及源文件的对应关系,主要是其中函数的对应关系,也能找到我们引用的外部库的头文件和库的对应符号关系。说白了,库就是打包后的源文件。如果没有指定某些库的库目录,编译器会默认从系统目录下查找。
2024-07-12 23:33:53
701
1
原创 Leetcode | 560. 和为 K 的子数组
我们可以基于方法一利用数据结构进行进一步的优化,我们知道方法一的瓶颈在于对每个 iii,我们需要枚举所有的 jjj 来判断是否符合条件,这一步是否可以优化呢?所以我们考虑以 i 结尾的和为 k 的连续子数组个数时只要统计有多少个前缀和为。的计算只与前一项的答案有关,因此我们可以不用建立$ pre$ 数组,直接用。最后的答案即为所有下标结尾的和为 k的子数组个数之和。需要注意的是,从左往右边更新边计算的时候已经保证了。里记录的$ pre[j]$的下标范围是。,以和为键,出现次数为对应的值,记录。
2023-09-24 20:20:43
302
原创 git | 合并merge、衍合rebase与同步更新cherry-pick
合代码到公共分支上时用git merge,保证当前分支功能合并到公共分支,同时又不改变公共分支历史提交合代码到个人分支时用git rebase,保证个人分支形成线性提交历史记录,方便查看历史提交和修改。
2023-09-24 20:18:59
785
原创 多进程编程通信——消息队列
管道的通信方式是效率低的,因此管道不适合进程间频繁地交换数据。而的通信模式则高效许多。消息队列提供了异步的通信协议,是内核中的一个优先级队列,多个进程通过访问同一个队列,进行添加结点或者获取结点实现通信。
2023-09-15 10:48:08
386
原创 多进程编程通信(1)
对于匿名管道,通信范围是父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。另外,对于命名管道,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。
2023-09-15 10:47:18
84
原创 Mysql | 新增用户无法连接服务器
将bind-address 和 mysqlx-bind-address 改为 0.0.0.0,原始的 127.0.0.1表示mysql只监听本地请求。如果显示如下,说明MySQL端口目前只监听本地连接127.0.0.1。然后需要修改MySQL的配置文件。主机可以设置用户的IP,限制登录的IP,也可以输入。表示没有输入密码,不表示密码输入是否正确。navicat上简单操作下,当然,通过。,于是修改密码为大小写加数字。命令也可以添加用户,操作。,表示任何IP均可登录。表示是否输入了密码,
2023-09-15 10:45:12
368
原创 优雅地打印堆栈跟踪信息——Backward-cpp
而 Backward 会将堆栈信息打印出来,帮助定位。有点像gdb时的backtrace只有当源文件可访问时,它才能显示代码片段。所有以管道“|”为前缀的“源”行和代码片段都是内联下一帧的帧。项目源码本质上只有文件,集成到自己的程序中非常方便,如果加入文件一起编译,则自己代码中不需要调用Backward-cpp中的函数,非常方便。
2023-09-15 10:43:38
1847
1
原创 C++ | 负数比0大?
这句,判断左边是int类型,判断右边是 unsigned int 类型, 有符号和无符号进行比较的时候,会统一转换为无符号数进行比较,所以当负数和无符号比较时,负数会转换为无符号的数,当待比较的无符号数是0的时候,等式恒成立。上述代码,在int 和 unsigned int 比较的时候,将左侧k 转换为 unsigned int 了,所以即便k是负数,转换为无符号后仍然符合。因此如果左侧类型的等级大于右侧的,编译器会将右边数据类型转换为左边变量的类型,然后赋值,这样不会丢失数据精度;
2023-09-05 11:03:19
624
原创 OS | 第5章 插叙:进程API
UNXI 系统采用了一种非常有趣的创建新进程的方式,通过一对系统调用:fork()和exec(),还可以通过第3个系统调用wait(),来等待其创建的子进程执行完成。
2023-09-05 11:02:31
132
原创 《西方美学史》分享1
这本书是岭南大学中文系教授许子东老师推荐的,而且这本书名气也非常大。刚读完绪论和第一章。这本书可以带领我们去思考,现实社会中“美”是什么,什么是美的。我们总在说“真善美”,“真”和“善”就是美吗?我们除了追求物质生活的不断丰富,也在不断追求精神生活的品质提升。这是我们人类思维进步的地方。我们是有追求的。肉体之内,是不断向上的灵魂。小时候,夏天夜晚办一张凉床放在外面的水泥地上,仰望头顶的星空,那时候,认为满天繁星是美的;上小学时,认为英语老师是美的;长大后,认为一个人勇敢的灵魂是美的;
2023-09-05 11:00:55
216
原创 C++ | 程序暂停功能
回到问题本身,根本就是我通过终端,发送一个信号给程序,程序接收到了,然后改变运行的代码;我再次发送时,程序又接收到了,再恢复代码。使用opencv 的waitKey函数是可以在有限的时间内,监听键盘按键,如果没有按下键盘,则继续,如果按下键盘则特殊处理。函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,此处作为延时函数使用。播包一样的功能,按下空格键,程序就暂停了,可以根据三维界面进行观察。就是获取字符串,如果获取到空格,则暂停。命令给程序发送信号,可以自定义。,这样程序就可以随时接收到信号了。
2023-09-04 13:34:37
398
原创 Effective STL | 条款4:用empty来代替检查size()是否为0
不同的list实现用不同的方式解决这个矛盾,依赖于他们的作者选择的是让size或splice的区间形式达到最高效率。如果你去掉了splice的区间形式要更新它所修改的list的大小的需求,splice就可以是常数时间,但。如果你碰巧使用了一个常数时间的splice的区间形式比常数时间的size优先级更高的list实现,如果你碰巧使用了一个常数时间的splice的区间形式比常数时间的size优先级更高的list实现,**A:**对于list特有的splice有很多要处理的东西。算出接合进来的元素的个数。
2023-09-04 13:16:14
103
原创 Effetive STL | 条款3:使容器里对象的拷贝操作轻量而正确
即使只使用其中的一些或者我们立刻使用从某个地方获取(比如,一个文件)的值覆盖每个默认构造的值,这也得构造maxNumWidgets个Widget对象。STL进行了大量拷贝,但它通常设计为避免不必要的对象拷贝,实际上,它也被实现为避免不必要的对象拷贝。(insert或push_back等)的那个对象了,进入容器的是你指定的对象的拷贝;如果你希望结果对象表现为派生类对象,比如,调用派生类的虚函数等,总是错的。也就是说,不是建立一个Widget的容器,建立一个Widget*的容器。等,对象会移动(拷贝)
2023-09-04 13:15:15
85
原创 OS | 4 抽象:进程
进程就是运行中的程序。程序本身没有生命周期的,它只是存在磁盘上的一些指令(也可能是一些静态数据)。是操作系统让这些字节运行起来,让程序发挥作用所以“字节跳动”就是一个进程?!操作系统为正在运行的程序提供的抽象,就是所谓的进程(progress)。在任何时刻,我们都可以清点程序在执行过程中访问或影响的系统的不同部分,从而概括一个进程。
2023-09-01 17:08:47
136
原创 Effetive STL | 条款2 : 小心对“容器无关代码”的幻想
typedef只是其它类型的同义字,所以它提供的的封装是纯的词法(译注:不像#define是在预编译阶段替换的)。不同的容器是不同的,而且它们的优点和缺点有重大不同。如果使用过程中,你发现从列表的中部插入和删除客户并不像你想象的那么频繁,仅仅需要快速确定客户列表顶部的20%——一个为nth_element算法量身定做的任务。要限制如果用一个容器类型替换了另一个容器可能需要修改的代码,就需要在类中隐藏那个容器,而且要通过类的接口限制容器特殊信息可见性的数量。很多人会试图在他们的软件中泛化容器的不同,而。
2023-09-01 17:07:19
106
原创 Effective STL 1.仔细选择你的容器
当面对容器时,STL给了你很多选项。如果你的视线超越了STL的范围,那就会有更多的选项。在选择一个容器前,要保证考虑了所有你的选项。
2023-09-01 17:04:50
130
原创 MEC | 条款6 区别累加累减操作符的前置和后置形式
函数必须产生1个临时对象,用作返回值,该临时对象需要构造,也需要析构。后置式操作符并未调用其入参,该入参唯一的作用就是区别前置式和后置式。但从效率而言,前置式 不需要多创建1个对象,就能完成自身数值变化。当我们故意省略入参的名称时,编译器就不会对未使用的入参发出警告。的第二个调用动作施行于第一个调用动作的返回对象,而。返回1个对象,因为该对象存储的是累加之前的旧值。自变量,并且在它被调用时,编译器默默地为该。操作符,它们都是将某个值累加。是允许的,改变的都是原对象。,则可以进行2次累加,但是。
2023-08-29 10:44:25
114
原创 MEC | 条款5 对定制的“类型转换函数”保持警觉
能够以单一自变量成功调用的 constructors如此 constructors 可能声明拥有单一参数,也可能声明拥有多个参数,并且除了第1个参数之外都有默认值class Namepublic:// 可以把 string 转换为 Name...public:// 可以把 int 转换为 Rational隐式类型转换操作符 :是一个 member function,关键词 operator 之后加上1个类型名称。因为已经有了类型名称,因此不能为此函数指定返回值类型。public:...
2023-08-20 10:22:48
114
原创 gdb调试core dump
管理好内存分配和释放避免缓冲区溢出不适用线程不安全函数多线程读写的数据没有加锁保护不调用已经释放的资源不使用非法指针使用空指针随意使用指针转换;确保代码不会导致堆栈溢出:不要使用大的局部变量(因为局部变量都分配在栈上)通过gdb能从core文件找出core dump的直观原因,更根本的原因还是需要结合代码一起分析进程的运行上下文场景,才能定位出程序真正的问题所在。
2023-08-20 10:19:51
928
原创 GDB: The GNU Project Debugger
GDB,GNU 项目调试器,通常以其命令 gdb 而闻名,允许查看另一个程序在执行时“内部”发生了什么,或者另一个程序在崩溃时正在做什么。gdb是一个交互式控制台,可逐步浏览源代码,分析执行的内容,并基本上对错误应用程序中出现的问题进行逆向工程。启动的程序,指定任何可能影响其行为的内容。让程序在指定条件下停止。当程序停止时检查发生了什么。更改程序中的某些内容,以便可以尝试纠正一个错误的影响并继续了解另一个错误。这些程序可能在与 GDB 相同的机器(本机)、另一台机器(远程)或模拟器上执行。
2023-08-20 10:16:37
304
原创 MEC | 条款4 非必要不提供 default constructor
如果谨慎设计 template, 可以消除对default constructor 的需求,例如标准库中的 vector template 会产生出行为类似的“可扩展数组”的各种 classes,不要求其类型参数拥有一个 default constructor.当我们定义1个类,如果没有定义构造函数,C++会默认提供1个构造函数(Constructors),用来将对象初始化,因此,一般来说,“合理地从无到有生成对象”的 classes,都应该内含 default constructors,而。
2023-08-13 21:45:31
125
原创 MEC | 条款3 绝对不要以多态(polymorphically)方式处理数组
因此,编译器为PrintBSTArray 函数所产生的指针算术表达式,对于 BalancedBST objects 所组成的数组而言就是错误的。所以删除 derived class 的时候,会调用基类的析构函数,解决这种办法需要将基类的析构函数设为虚函数。编译器假设数组中每个元素的大小是 BST 的大小,但其实每个元素大小是 BalancedBST 的大小。当数组被删除,数组中每1个元素的 destructor 都必须被调用,编译器其实看到的这样的句子。是个指针,指向数组起始处。所指内存两者相距多远?
2023-08-13 21:44:10
149
原创 MEC | 条款2 最好使用C++转型操作符
转换函数指针的代码是不可移植的, C++不保证所有的函数指针都被用一样的方法表示,在一些情况下这样的转换会产生不正确的结果,所以应该避免转换函数指针类型。这个操作符的转换结果几乎总是与编译平台息息相关,所以 reinterpret_cast 不具有移植性。static_cast 拥有与C旧事转型相同的威力和意义,以及相同的限制。reinterpret_cast 最常用的用途是转换“函数指针”类型。显然,const_cast 最常见的用途就是。要从C的旧事转型,改为新的转型方法。用来执行继承体系中的“
2023-08-13 21:42:47
125
原创 gcc/g++ 编译选项详解
它打开 -ffast-math、-fallow-store-data-races 和176 Using the GNU Compiler Collection (GCC) Fortran 特定的 -fstack-arrays,除非指定 -fmax-stack-var-size,和-fno-protect-parens。-fold-unroll-loops 意味着 -fstrength-reduce 和 -frerun-cse-after-loop。这是使用旧的循环展开器完成的,其循环识别基于前端的注释。
2023-08-13 21:41:05
4275
原创 论文阅读 | BEVFormer
三维视觉感知任务,包括基于多摄像头图像的三维检测和地图分割,是自动驾驶系统的关键。BEVFormer 框架学习了具有时空 Transformer 的统一 BEV 表征,以支持多个自动驾驶感知任务。BEVFormer 利用空间和时间信息,通过预定的网格状 BEV 查询向量与空间和时间域交互。关键点为了聚合空间信息,设计了一个空间交叉注意力,每个 BEV 查询向量从跨相机视图的感兴趣区域提取空间特征。对于时间信息,我们提出了一种时间自注意力来递归融合历史 BEV 信息。
2023-08-07 09:18:42
281
原创 Leetcode | 42.接雨水 Trapping Rain Water
这种方法是,只要柱子比前面高,就能计算一波,后面柱子更高时,再在此基础上继续计算积水量,这样边界就非常明显了。只有当前高度值比左右柱子最大高度小,才能接到雨水,如果当前柱子高度与左右最大高度柱子其中之一一样高,则跳过,说明当前柱子是后面低洼处的一个边界。只要2个蓝色的小方块中间有空白,就表示此处可以积水,积水量 +1,每一行计算完后,行数 + 1,继续遍历。还是注意一点,如果当前柱子高度同最大高度柱子高度一样,则不进行计算,或增加量为0。将所有的柱子,划分为2维空间里面,蓝色的为柱子,其他彩色为积水量。
2023-08-07 09:17:41
155
转载 Ubuntu 传输文件方法
因为 SSH 在网络中从一台电脑到另一台电脑传输文件的时候使用数据加密通道,并且 SSHFS 内置在 FUSE(用户空间的文件系统)内核模块,允许任何非特权用户在不修改内核代码的情况下创建他们自己的文件系统。SSH(Secure Shell)使用 rsync,我们可以使用 SSH(安全外壳)进行数据传输,在传输数据时使用 SSH 协议,可以确保数据在加密的安全连接中传输,以便没有人可以在通过互联网上的线路传输数据时读取数据。作为最后的手段,您可以使用 FTP 客户端在远程和本地系统之间传输文件。
2023-08-07 09:16:09
778
原创 mmdet3d预处理(上)
我们将在下图中展示一个最经典的数据集预处理流程,其中蓝色框表示预处理流程中的各项操作。随着预处理的进行,每一个操作都会添加新的键值(图中标记为绿色)到输出字典中,或者更新当前存在的键值(图中标记为橙色)。预处理流程中的各项操作主要分为、测试时的。接下来将展示一个用于 PointPillars 模型的数据集预处理流程的例子。对于每项操作,我们将列出相关的被添加/更新/移除的字典项。
2023-07-18 09:09:52
1203
2
原创 CUDA并行归约算法(二)
由于GPU的硬件设计,每次调度都会以1个线程束为单位进行,所以,1个线程束里只要有1个线程需要活跃,当前线程束内的线程全部都会活跃起来,即便很多线程不参与计算,这就非常影响程序的执行效率。而在原来的代码中,第一轮是线程id为偶数的线程参与计算,第二轮是线程id是4的倍数的线程参与计算,但是其他线程仍然是活跃的。,实际参与计算的线程id 为 0,2,4,6,12, 14, 256。,也就是实际参与计算的也就前16个线程束,后16个线程束在。)个线程被32个线程束管理着,每个线程束管理32个线程。
2023-07-18 09:06:27
179
原创 C++ | How C++ Linker works?
当我们调用头文件时,引用了函数声明,函数实现放在了单独的 translate unit中,保证多文件调用时,只有1个具体的实现,从而避免了函数重复。技术上说,我们可能在其他文件中调用Multiply函数,就像这里声明Log函数一样,因此链接器需要链接它。编译时还会报错,因为链接时,程序找不到和Main.cpp中声明的 Log 函数返回值及入参一致的函数。因此如果1个程序包含多个C++文件,需要1种方法将这些文件链接到1个程序,这就是链接器的主要作用。就是程序得从哪里开始执行,一般就是。
2023-07-11 08:55:25
194
原创 C++ | vector 用 insert 批量插入效率高还是emplace_back效率高
:now;::now;可以看出insert批量插入效率更高如果将tar1,提前申请好内存空间,再看下。
2023-07-11 08:53:55
810
原创 CUDA并行归约算法(一)
并行归约(Reduction)是一种并行算法,对于符合结合律的二元操作符,将输入的数组划分为更小的数据库,每个线程计算1个数据块的部分结果,最后把所有部分结果再计算,得出最终结果。二元操作符可以是求和、取最大、取最小、平方、逻辑与或等。
2023-07-11 08:53:05
1035
原创 C++ | 延时函数
include <time.h> /* 调用时务必加上该头文件 */ // 自定义的一个延时函数delay() void delay(int seconds) // 参数必须为整型,表示延时多少秒 {} void delay(double seconds) // 参数为双精度浮点型。这个函数是我修改的上面那个函数,重载一下。
2023-07-10 11:10:41
1874
原创 论文阅读 | UniFormer
Bird’s eye view (BEV) 表达自动驾驶中的一种新的感知构想,基于空间融合。BEV表达中引入时序融合,也取得了巨大成功。本篇文章,介绍了一种新的方法统一时空融合,并融合到一个统一的数学表达。因为有了时空融合,所以可以支持远距离融合,这是传统BEV方法做不到的。此外,BEV融合有时间自适应性且时间融合的权重也是可以学习的。而传统时间融合使用固定和相同的权重。此外,统一融合能够避免传统BEV融合中的信息丢失,且充分利用特征数据。BEV表示是将多个相机特征映射到自车坐标系空间内。
2023-07-10 11:09:46
409
C#ArcGIS二次开发帮助类库QArcGISLib
2021-02-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人