- 博客(41)
- 收藏
- 关注
原创 Ubuntu22.04源码安装ffmpeg
的shell脚本,通过该shell脚本可以配置ffmpeg的安装位置以及需要安装的ffmpeg组件,这里选择将ffmpeg安装到。某些情况下可能已经编译好了ffmpeg的依赖包,但是编译ffmpeg时依然找不到对应的包,此时可以尝试执行。执行ffmpeg的安装脚本,如果输出如下,表示依赖安装完成,可以编译并安装ffmpeg。在编译并安装ffmpeg之前,先下载并编译SDL源码,因为ffplay依赖于SDL。解决方案:下载yasm源码并解压,编译yasm源码。解决方案:下载对应的源码包并编译。
2024-07-30 10:55:28
743
原创 C++虚函数调用规则
g++编译器,当引用基类对象时,调用虚函数不涉及到虚函数表指针的访问,引用派生类对象时,调用虚函数涉及到虚函数表指针的访问。通过对象直接调用虚函数,不涉及到虚函数表指针的访问(g++,MSVC,clang++测试结果一致)使用指针调用虚函数时,均涉及到虚函数表指针的访问(在g++和clang编译器下表现相同)clang编译器,不管引用的是基类对象还是派生类对象,调用虚函数都要访问虚函数表指针。clang编译器:涉及到虚函数表指针的访问。g++编译器:不涉及虚函数表指针的访问。:使用派生类的引用调用虚函数。
2024-03-02 15:30:06
518
原创 二进制和位运算
如果数据在内存中二进制表示形式的最高位为0,按照一般正数的逻辑进行解释,如果最高位为1,表示该数据为负数,然后将二进制表示取反后在加1得到数值大小,例如数据在内存中显示为11111111’11111111’11111111’11111101,按照规则将其解释为-3。虽然在计算过程中出现了溢出,但是因为负数巧妙的设计,计算结果依然是正确的,使用正数加上负数时也有这样的效果,虽然计算过程中可能出现溢出,但是只要保证自己的调用得到的结果不溢出,计算机依旧可以正确的计算出来。&、&&、|、||的区别。
2024-01-11 12:17:07
657
原创 IO多路转接
系统调用selectpollepoll事件集合通过fd_set设置关心事件,返回时也是通过fd_set获取就绪事件,fd_set不可重用通过events和revents分别表示关心事件和就绪事件,pollfd结构可重用通过epoll_ctl设置关心事件,通过epoll_wait检测eventpoll的rdllist是否为空,从而获取就绪事件索引就绪文件描述符的时间复杂度O(N)O(N)O(1)最大支持的文件描述符个数1024使用ulimit -a查看使用ulimit -a查看。
2023-10-05 19:46:28
895
原创 计数排序与基数排序
按照个位进行排序,对于数字7,个位为7,由于个位数<=7的数据数量是4,所以7直接放到help数组中下标为3的位置,此时原序列中的7已经放到help数组中,原序列中个位数<=7的数据数量减少一个,变为3,以此类推,直到原序列中的数据全部按照规则转移到help数组中,此时help数组中的数据就是按照位排序好的数据。若需要排序的数字不是10进制,只需要修改BASE即可,其它思路一致,例如需要排序的数字是16进制,那么counts数组的大小定为16即可,统计每一位在0~f的数量,依然使用前缀分区技巧。
2023-09-18 21:47:19
340
原创 动态规划-货币问题
有重复子过程的递归可以尝试将其改写为动态规划,这样会使得解决问题的时间复杂度大大减小,动态规划的状态转移方程其实就是递归的尝试过程,dp表的初始化就是递归的出口,dp表的填表顺序取决于尝试策略,在填表时,若确定dp表的一个位置需要使用for循环,应该尝试分析递归过程和位置依赖,以确定是否可以做进一步的优化。
2023-09-17 18:29:37
1006
原创 哈夫曼树与哈夫曼编码
在构建哈夫曼树的过程中,使用了堆,因为我们每一次都需要选择最小的2个节点进行合并,并且这2个节点不能是已经选择过的,如果采用遍历操作,时间复杂度为O(N),使用堆可以加速这一过程。可以看出,出现频率越高的字符对应的哈夫曼编码越短,并且不存在任意一个字符的编码为另外一个字符的编码前缀,因为这些字符都是对应的叶子节点,因此哈夫曼编码在进行编码与解码时不存在歧义。规定向左的边码值为0,向右的边码值为1,那么’D’的哈夫曼编码为0,'A’的哈夫曼编码为100,'B’的哈夫曼编码为101,'C’的哈夫曼编码为11。
2023-09-01 14:53:11
315
原创 C语言memcpy与memmove
memmove函数与memcpy函数功能类似,不过memmove函数在数据拷贝这件事情上考虑的更加周全,当src>dst时,memmove的拷贝策略是从前往后,当src<dst时,memmove的拷贝策略是从后往前。若memcpy的实现方式如上,在从前向后进行拷贝的时候会存在数据覆盖的问题,那么系统的memcpy函数是否解决了数据覆盖的问题呢?在比较新的C语言标准中,memcpy函数解决了数据覆盖的问题,不过在早期C语言标准中,解决类似的问题需要使用memmove函数。memcpy函数原型。
2023-08-31 22:15:23
263
原创 高阶数据结构-图
使用并查集实现Kruskal算法时,返回值为所有选中的边,根据边即可获取最小生成树的所有信息,需要注意的是,虽然Kruskal算法适用于无向图,但返回值为有向边,这并不影响最小生成树的结构,因为有向边中包含from点、to点、权值。二维数组中每一个一维数组的第一个元素表示from点,第二个元素表示to点,最后一个元素表示边的权值,二维数组可以表示图,但是在实现图的相关算法不具备通用性,可以将其转化已知结构。图中A到B的最短路径是5,A到C的最短路径是先通过B在达到C,为15。
2023-08-16 21:16:57
362
原创 c语言malloc,calloc,realloc函数介绍
malloc,calloc,realloc动态内存管理函数的出现解决了在某些c语言标准中不能使用变长数组的问题这三个函数的使用需要头文件stdlib.h,这些函数开辟的空间在堆区,系统不会自动释放,需要手动管理释放。malloc:向内存申请一块空间,不初始化该空间参数:想要开辟的空间的大小返回值:返回该空间的起始地址使用举例:int main(){ int* p = (int*)malloc(5 * sizeof(int)); if (p == NULL) retur..
2022-05-01 20:25:20
1380
原创 vim的基本快捷键及其基本配置
vim一键配置链接:curl -sLfhttps://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh-o ./install.sh && bash ./install.sh在命令行直接输入链接按回车即可自动下载配置后的效果如图:vim命令模式的快捷键:1.shift+4:定位到行尾2shift+6:定位到行首3.shift+g:定位到最后一行4.gg:定位到第一行5.n+shift+g:定位到第n行..
2022-04-01 22:47:34
1244
2
原创 Linux基本命令
Linux基本命令前言本文章主要讲解Linux基础知识及其指令,富有多张配图帮助理解一、Linux中的用户Linux中有2类用户,一种是普通用户,一种是root用户,普通用户可以有多个,但是root用户只有一个,root用户和普通用户最大的区别在于权限,root用户拥有比普通用户更高的权限,如图,图中普通用户slowst
2022-04-01 21:21:17
2936
原创 strcpy函数的实现
1.实现思路strcpy函数是字符串拷贝函数,参数为2个字符串的首地址即strcpy(char* destination,const char* source),我们要把源头的字符串拷贝到目的地里面去,目的地字符串要被源头字符串替换,所以目的地字符串应该是可以修改的,而源头的字符串我们不希望被修改,所以用const修饰。这样的好处是如果我们操作失误导致源头字符串被修改,编译器会直接报错实现这个函数的思路是把源头的字符一个个的去替换目的地的字符,包括源头字符的’\0’也拷贝过去,注意目的地要有足够的空间
2022-03-10 13:33:49
13586
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人