自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 CRTP奇异递归模板模式

CRTP(奇异递归模板模式) 是 静态多态 的一种实现方式。优势:避免虚函数开销,提高性能。可以在基类中调用派生类的方法。模板编程的基础,支持静态计数器、链式调用、策略模式等。劣势:代码可读性较低,不适合过于复杂的继承体系。不支持运行时多态,无法用于 std::unique_ptr< Base>。

2025-03-17 17:26:19 443

原创 自旋锁(Spinlock)

自旋锁(Spinlock)是一种忙等待(busy-waiting)的同步机制,适用于锁的持有时间较短的场景。自旋锁是为了提高资源的使用频率而出现的一种锁,在线程获取锁的时候,如果锁被其他线程持有,则当前线程将循环等待,直到获取到锁。自旋锁在等待期间不会睡眠或者释放自己的线程。自旋锁不适用于长时间持有CPU的情况,这会加剧系统的负担,为了解决这种情况,需要设定自旋周期。在C++中,可以使用std::atomic_flag或std::atomic来实现自旋锁。

2025-03-12 10:21:58 675

原创 C++异步编程(附std::packaged_task实现线程池)

std::shared_future 是 C++11 引入的一个类,它是 std::future 的一个扩展,允许多个线程共享对同一个异步任务的结果或异常。如果任务在超时之前完成,会返回 std::future_status::ready,如果超时则 返回 std::future_status::timeout。get_future():每个 std::packaged_task 都有一个 get_future() 方法,这个方法返回一个 std::future 对象异步获取任务的执行结果。

2024-11-17 14:58:08 1002

原创 vcpkg的安装、使用以及集成

在右上角的 “程序包源” 中选择刚刚设置的 “vcpkg”。” 选择 vcpkg 目录,然后点击右侧的“更新按钮”。导出参数格式:–raw 以不打包的目录格式导出,–nuget 以 nuget 包形式导出,–zip 以 zip 压缩包形式导出,–7zip 以 7z 压缩包形式导出。如果要安装的库依赖别的库,不用担心,vcpkg会进行依赖关系检查(比如编译 libcurl,会自动下载 zlib、openssl 进行编译)。如果要安装编译某一个架构的开源库,在需要安装的库后面指定相应的 triplet 即可。

2024-11-11 18:09:31 4989

原创 FFmpeg在Windows上使用MSYS2编译动态库以及报错解决

然后在同级目录创建build-ffmpeg.txt文本写入以下内容后更改后缀为build-ffmpeg.sh。在安装目录下找到mingw64.exe双击打开shell(如果是32位的就打开mingw32.exe)然后在同级目录创建build-x264.txt文本写入以下内容后更改后缀为build-x264.sh。在FFmpeg源码同级目录创建编译结果输出文件夹FFmpeg_install。然后在mingw64的shell中中cd到脚本目录下。然后在mingw64的shell中cd到脚本目录下。

2024-11-10 16:34:53 2369

原创 C++多线程与线程安全

多线程(Multithreading)是指在同一个程序中并发执行多个线程的技术。线程是程序执行的最小单位,多个线程可以共享同一进程的资源(如内存空间、文件句柄等),并且它们可以并行或交替执行。通过多线程,程序可以实现同时执行多个任务,从而提高程序的执行效率和响应能力。在多线程编程中,每个线程执行程序中的一部分代码,这些线程可以并发执行。它们共享进程的资源,但每个线程有自己的执行路径(程序计数器、堆栈等)。

2024-11-09 19:09:42 1031

原创 一文掌握C++智能指针(unique_ptr、shared_ptr、weak_ptr)附简单实现代码

C++智能指针(unique_ptr、shared_ptr、weak_ptr)附代码实现

2024-11-01 11:10:39 1175

原创 岛屿问题(DFS、网格类问题)

岛屿问题通常是图论中的经典问题,涉及在一个二维网格中识别并计数岛屿。网格中的每个单元格可以是陆地(通常用 1 表示)或水(通常用 0 表示)。岛屿是由相邻的陆地单元格组成的,单元格相邻的定义是上下左右(不包括对角线)。主要通过 DFS、BFS 或并查集等方法解决。

2024-10-25 17:55:57 1229

原创 十大经典排序算法(下)(线性时间、非比较类)

计数排序(Counting Sort)是一种非比较型排序算法,其核心思想是通过统计每个元素出现的次数,来确定每个元素在排序数组中的位置。它适用于范围有限、元素为非负整数的大规模数据集。桶排序(Bucket Sort)是一种基于分布的排序算法,它将元素分散到多个桶中,然后对每个桶中的元素分别进行排序,最后再合并所有桶中的元素。基数排序(Radix Sort)是一种非比较型的整数排序算法,它通过逐位对数字进行排序,最终将所有数字排序完成。它通常适用于整数或可以转化为整数的大量数据集。

2024-10-18 18:17:41 816

原创 十大经典排序算法(上)(非线性时间、比较类算法)

它并不是用计算算法运行的时间得出的,而是用算法的操作次数与输入规模的变化趋势来估量来的,并且时间复杂度并不代表实际的操作次数。它通过选取一个基准元素(pivot),将数组分为两个子数组,使左边的数组元素都比基准小,右边的都比基准大,然后递归的堆两个子数组进行快速排序。2.在未排序部分中选择最小(或最大)元素:从未排序部分中找出最小的元素,将其与未排序部分的第一个元素交换,这样该元素就放在了正确的位置,加入到已排序部分。其优点是减少了数据的移动次数。这样,在一次完整的遍历后,最大的元素就会被移到数组的最后。

2024-10-17 20:14:03 1079

原创 Windows下安装WSL来使用Docker创建容器

Mesa 的 Direct3D12 (D3D12) 驱动,用来指定默认的 GPU 适配器。Setting->Resources->WSL integration下开启Ubuntu-20.04。Devic:D3D12使用的是独立显卡。注意默认是安装在C盘的,可以在 设置-存储-更改新内容的保存位置 修改安装路径。在配置界面第一步Enter,第二步选择zh_CN.UTF-8 UTF-8。注意卸载Ubuntu使用如下命令,不要手动卸载,可能会有问题。Ubuntu默认安装是在c盘的,安装好后也可迁移到别的盘。

2024-10-12 16:23:55 1452

原创 Ubuntu中使用Docker创建容器

使用 --volume /usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu \来将宿主机的 OpenGL 库挂载到容器中。比如软件需要opengl库,而宿主机有opengl库在/usr/lib/x86_64-linux-gnu下,可将/usr/lib/x86_64-linux-gnu挂载到容器中。这个参数将宿主机的 X Server 的 UNIX 套接字文件挂载到容器中,使得容器能够通过 X 套接字与宿主机的 X Server 通信,从而显示图形界面。

2024-10-09 18:57:48 1773

原创 原码、反码、补码、位运算

比如n=8四位二进制表示为(1 0 0 0),取反后是(0 1 1 1),再加1后是(1 0 0 0)。比如8位的有符号整数-4(1 1 1 1 1 1 0 0),右移两位 1 1 1 1 1 1 0 0 >> 2 = 1 1 1 1 1 1 1 1。比如8位无符号整数4(0 0 0 0 0 1 0 0),右移两位 0 0 0 0 0 1 0 0 >> 2 = 0 0 0 0 0 0 0 1。对于0还需要区分+0(8位原码为0 0 0 0 0 0 0 0)和-0(8位原码为1 0 0 0 0 0 0 0)

2024-09-25 18:28:16 1008

原创 最长公共前后缀、next、nextval数组、BF、KMP模式串匹配算法

因为next数组本身存储的就是最长的前缀长度,当i=5时,j=3,pattern[i] 不等于pattern[j],即abab的b不等于abac的c,但是 我们可以先回退到相等子串aba时的最长公共前后缀长度1,即j=next[2]=1,然后再来判断 pattern[i] 还是不等于pattern[j] ,此时对比的是ab的b和ac和c,还需要回退到相等子串a的最长公共前后缀0,即j=next[0]=0,此时的j不大于0,就是说没有公共前后缀所以没有必要回退。思路简单,方便快捷。

2024-09-21 16:44:04 2607 1

原创 康托展开、逆康托展开

2、现在找下一位数5,这时3已经用过了,所以从剩下的 1,2,4 里挑选比5小的数,一共3个,后面还剩三位,也就是3!3、再看第三位数2,这时3,5都用了,所以从剩下的 1,4三个数中找比4小的数的个数,有1个比4小,所以这时候也可以有 1 * 2!= 2,对于[1,2,3,4,5]数组的索引2是3,所以第一位是3。注意我们统计的是比[3,5,2,1,4]小的排列,所以最后 [3,5,2,1,4] 的排序号为 68+1 = 69。假设有个数组[1,2,3,4,5]的其中某个排列为[3,5,2,1,4]。

2024-09-19 22:05:37 980 3

空空如也

空空如也

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

TA关注的人

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