自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 堆的实现【C++】

每次插入数据都是插入到数组的最后面,也就是二叉树的最下一层的最右边,此时需要维护大堆的规则,也就是父节点的值大于子节点的值,由于每次插入时都是在最下面,所以如果不符合规则,当前插入的值大于父节点,我们就利用。来判断左右节点哪一个更大一些,然后用较大值和父节点的值进行比较,如果父节点的值小于子节点的值,那么就要向下调整,也就是需要交换,之后更新当前的父节点和左节点,再次进行判断。可以看到堆顶的数据3,数组下标0处的数据是3,可以我们在插入的时候,0处一开始插入的是1,但是结果是3,这就说明没有问题。

2025-01-15 23:00:53 877

原创 处理继承自QWidget类的自定义类背景样式不生效问题【Qt】

总结就是:Qt中,如果是给QWidget的子类通过qss设置背景色,默认情况下是不生效的,需要加上官方文  这是运行后的表现,其中每一份测试人物,头像,签名的组成来自于我们自定义的SessionFriendItem类。我们要实现鼠标移动到控件上面时,控件的背景颜色变化,下面是代码实现:运行后:  运行后发现我们命名更改的是整个SessionFriendItem的背景颜色(在设置样式表的时候,当SessionFriendItem继承于QWidget,可以将SessionFriendItem看作Q

2024-11-12 17:02:16 764

原创 String模拟实现【C++】【STL】

STL中有两个属性capacity和size,capacity是真正STL容器的真正内存大小,size是STL容器中数据的大小,实现内存变长这个特性的时候,判断当size大小达到capacity时,进行扩容即可,就像水缸一样,capacity就是水缸能装的最大水容量,size就是水缸中水的多少。

2024-11-07 11:07:58 1127

原创 QChart中柱形图的简单使用并实现【Qt】

如果是qmake的话是前面这个步骤,如果是cmake,可以自行去查找,没有添加就会报错,不要忘记这块就好。可以将QChart视为场景,不可见,使用来装载和管理柱形,折线等图表元素,但不可将其完全视为场景。一个二维图表的基础是轴,x,y轴,我们用QValueAxis类得到轴,并且可以对轴进行一些处理。参数跟C语言的printf里面的参数格式一样:%d,%f…

2024-10-30 17:31:32 1039

原创 QGraphics类型学习使用【Qt】【C++】

首先已知,QGraphicsView,QGraphicsScene, QGraphicsItem,分别称为:视图,场景,图元,图表就是各种各样的元素,图片元素,线条元素,等等,场景就是容纳图元的一个容器,,这句话很关键。若是想将其显示到屏幕上,需要将场景设置到视图中,由视图负责显示。

2024-10-15 23:36:05 1400

原创 frp部署

上面代码实现了运行frpc命令,使得启动项目就可使frpc连接frps,并且让其后台运行。目前下载的是frp5.9版本,(6.0使用的时候有问题)。此时让A主机frpc.toml里面的name为:test-tcp1。之后监听端口22,并将收到的数据打印出来,且回复一段消息。发送数据,并接受响应,将响应的数据回显到终端面板。下面代码主要测试为主,后面在根据需求具体修改。主要为了测试,向frps服务器ip。frps和frpc成功连接。

2024-10-01 10:36:31 1541

原创 【Qt】PushButton控件

Qt套件是指Qt程序从编译链接到运⾏环境的全部⼯具和Qt类库的集合,对于MinGW版本Qt程序⽣成和调试,⾄少需要MinGW中的编译器g++(⾃动调⽤链接器)、g++配套的基础库、调试器gdb还有使⽤MinGW环境编译⽽成的Qt类库⾃⾝。我们需要明确需要做什么:也就是创建5个按钮,代表上下左右和目标被控制的对象,按下以后可以使得标签上下左右移动。之后我们访问图片资源的时候的目录就是。不要忘记头文件QIcon。如上图创建了5个按钮。

2024-08-11 12:40:22 1152 1

原创 【C++】protobuf的简单使用(通讯录例子)

  如上可以看到,定义了保留字段,编译后如下:  表示保留字段不可继续使用。  另外,字段唯一编号范围为:1 ~ 536870911(2^29-1),其中19000 ~ 19999不可用。如果使用了就会告警。  指定字段唯一编号时,对于使用频繁的字段,将其唯一编号设置为1 ~ 15, 因为1 ~ 15的字段编号只需要一个字节进行编码,16~2047以内的需要2个字节。  .proto Type字段是.proto文件中的字段类型, C++ Type是.proto文件编译后形成的*.pb.h和 *.pb.

2024-08-10 20:56:04 1341

原创 希尔排序, 插入排序, 冒泡排序, 选择排序【C++】

较大的 gap 可以让元素跨越较长的距离进行移动,从而更快地使数组逐渐趋向有序,减少最终的移动次数。如果 gap 过小,排序过程可能会退化为类似于插入排序的方式,此时性能优势可能不再明显。对于gap,gap越小,预排序出来的数组越有序, 当gap = 1时, 就是插入排序。上图中不同颜色的线将数组分成了gap组,,也就是3组。因此选择的是gap慢慢减小,通常使用Knuth提出的。越有序,插入的时候移动的次数就越少,效率就越高。上面这段代码可以将红色线的组进行排序;

2024-08-04 20:28:12 472

原创 malloc实现原理【Liunx】

malloc分配的是虚拟内存上的空间,一开始并不会在物理内存上面分配内存,当我们使用这个空间的时候,拿到这个虚拟地址,去页表查询,会发现没有对应的页表项,就会触发缺页中断,然后操作系统在物理内存分配相应大小的空间,更新页表,再重新查询,这时候,才会真正的在物理内存上分配内存。因为brk在内存池中的释放空间和申请空间都会造成许多内存碎片,如果我们频繁申请很多大空间的内存,如果都使用brk,就会造成内存池中出现许多空间大的内存碎片,造成了空间浪费。指针,说明可以通过强转,返回一个任意类型的指针。

2024-07-10 11:25:58 1267 2

原创 虚拟内存【Linux】

如果没有虚拟内存,我们在编码一个程序的时候将数据写在了编号为1000的物理内存上,当我们编码另外一个程序的时候,就需要注意,避免写入或修改上一个程序在编号为1000的物理内存处的数据,当已经有了几百个程序对物理内存进行过读写时,我们在进行内存读写的时候就会变得格外困难(因为需要避免覆写已经有数据的物理内存空间)。进入内核态的时候使用内核空间,进入用户态的时候使用用户空间,比如使用系统调用的时候就会进入内核态,发生缺页中断也会进入内核态。不同进程的内核空间都是统一的,不同进程的用户空间都是独立的。

2024-07-09 17:50:50 1192 8

原创 HTTP的强制缓存和协商缓存

由于协商缓存每次都需要向服务端询问资源是否过期,所以协商缓存适合资源经常修改的情况来使用。强制缓存设置了一个过期时间,过期时间内强制使用本地缓存的内容,过期了在作其他处理,因此强制缓存适合长时间不变化的资源。有人会有疑问?强制缓存和协商缓存是有关联性的,只有强制缓存过期了才会考虑协商缓存,那么经常修改的资源怎么实现呢?可以将max-age=xxx中的xxx设置为0,且使用 no-cache字段即可实现。

2024-04-07 16:23:09 1089 1

原创 浮点数在内存中的存储【详解】

IEEE 754规定: 对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。所以这里是float类型,E=-1,存储时加上127,也就是真正存入内存的是:-1+127=126。我们会发现一个特别的现象,E=-1,前面说过,E是一个无符号整数,那这个-1该怎么存储呢?对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

2024-04-07 12:44:20 975 12

原创 HTTP详解及代码实现

HTTP超文本传输协议URL简述状态码常见的状态码请求方法请求报文他们两个的作用都是为了获取指定资源或是对指定的资源做出处理,如果请求方法为POST,则参数在Body中,如果请求方法为GET,则参数在URL中,具体细节本文不做展开解释。对于HTTP/3.0(基于QUIC),虽然它是基于UDP的,但它主要是为了解决传统TCP在性能上的一些限制而设计的,并不是为了直接支持多点传输。在计算机发展初期,计算机只能传输使用文本数据,随着技术发展,出现了图片,视频,音频,超链接等,这些数据就可以统称为。

2024-04-06 21:16:44 2230 6

原创 动态规划之解码方法【LeetCode】

这个代码不能让dp[i]也就是dp[2]有任何变化,因为dp[i-2]也就是dp[0]被初始化为0了,但是应该使得dp[i]也就是dp[2]加上1的。如果s[i]和s[i-1]合并为一个字符形成为一个数字,那么dp[i]的值就是dp[i-2]的值。因为s[i]和s[i-1]都形成一个数字了,再dp[i]往前就是就是dp[i-2]了。我们可以可以将解法1中的dp数组整体向右移动一个元素的位置, 解题思路和解法1一样,如此一来我们只需要初始化新增加的dp[0]和dp[1](解法1中dp数组的dp[0])。

2024-02-28 20:55:16 1225 12

原创 动态规划之使用最小花费爬楼梯【LeetCode】

根据题意,我们需要知道到达第1层和第2层台阶的最低花费,第1层和第2层台阶的最低花费为0,并且vector会自动将所有元素初始化为0,所以可以忽略这一步。:当我们求解当前问题时,需要知道所需较小子问题的解,这就需要我们先求解得到较小子问题的解,这就是填表顺序。:当我们求解当前问题时,需要知道所需较小子问题的解,这就需要我们先求解得到较小子问题的解,这就是填表顺序。):dp[i]表示以第i级台阶为楼层顶部,到达第i层台阶的最低花费。):dp[i]表示从第i级台阶开始,到达楼层顶部的最低花费。

2024-02-28 20:54:58 587 7

原创 动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】

第 N 个泰波那契数/三步问题【leetCode】通过上图我们容易看出来,每次求解的时候,我们只需要知道前面的三个值即可,但是求解1中我们使用了一个数组,这就浪费了我们得空间,我们优化就可以从这方面入手。状态表示为:dp[i]表示到达第i个台阶的方式数量。将三种方式相加,就是总的到达第4个台阶的方式数7种。则我们经过第3个台阶到达第4个台阶的方式数有4种。经过第2个台阶到达第4个台阶的方式数有2种。经过

2024-02-26 23:30:53 1161 15

原创 进程间通信之共享内存及其shm函数的使用【Linux】

共享内存区是最快的IPC(Inter-Process Communication,进程间通信)形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据.匿名管道和命名管道都需要通过系统调用接口来实现进程间通信,因为管道属于文件,属于内核中的一种特殊数据结构,由OSweihu,所以只能使用系统调用。而共享内存存在堆栈之间,可以直接读写。双方进程若要进行通信,直接进行内存级的读写即可。共享内存的提供者是操作系统。

2024-01-07 15:23:52 2199 12

原创 进程间通信之匿名管道和命名管道的理解和实现【Linux】

管道是进程通信的其中一种,管道分为两种:fill:#333;color:#333;color:#333;fill:none;管道匿名管道pipe命名管道管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。管道只能单向通信。父进程fork之后,父进程会copy一份files_struct给子进程,但是父子进程的文件描述符依旧是指向同一份文件,而这个文件就叫做管道。

2024-01-06 23:49:55 2766 1

原创 【详解】静态库和动态库的认识和使用【Linux】

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

2024-01-06 11:59:18 1959 13

原创 硬链接和软链接以及inode的简述【Linux】

里面有一部分叫做inode Table.里面存放着一个个的inode,一个inode里面包含一个文件的属性,每一个inode都有一个inode编号。创建硬链接是在文件系统中创建一个指向目标文件的硬链接,硬链接与目标文件共享相同的 inode 和数据块,它们在文件系统中被视为同一实体,即使使用不同的文件名。通过inode中的指针或引用,操作系统可以定位到文件的数据块。答:因为inode和Data blocks的空间是固定的,不能保证两个同时有空间,若inode满了,Data blocks有空间,还是会失败。

2024-01-05 22:08:54 1469 1

原创 FILE* 和文件描述符及其相互转换【系统编程】

开始之前先来介绍使用系统接口open来打开一个文件的流程:open -> 从PCB也就是task_struct中找到files指针 -> file指针指向结构体files_struct -> files_struct中有一个重要的部分是fd_array[]数组,里面包含一个file指针 -> 通过这个file指针就可以指向一个file结构体 -> 这个file结构体中含有文件的所以信息,于是就找到了相应的文件。,当使用FILE是就能通过文件描述符找到底层的file结构体,获取文件信息。

2024-01-05 13:52:38 1164 4

原创 进程的程序替换(exec函数)【Linux】

进程的程序替换详解exec函数【Linux】程序替换的原理exec系列函数函数理解命令理解(助记)关于程序替换中环境变量的解释exec函数之间的关系数时,该进程的用户空间代码数据完全被新程序替换,从新程序的启动例程开始执行。所以我们需要添加环境变量,使用putenv()函数,使用这个函数需要注意的是,会将原来的PATH内容全部清除,然后再添加新的PATH。进程的程序替换就是让子进程执行新程序, 执行全新的代码和数据,不再和父进程有瓜葛。以下函数的参数末尾都一定需要带上一个==“NULL”==。

2024-01-04 21:43:10 1418 12

原创 在排序数组中查找元素的第一个和最后一个位置

就会导致left一直指向1,right一直指向不变,没有left

2024-01-04 14:14:57 963

原创 进程等待(wait和wait函数)【Linux】

进程等待的概念进程等待的必要性进程等待的方法wait函数waitpid函数非阻塞等待和阻塞等待的对比阻塞等进程等待的2. 由于一般来说,子进程的出现是为了协助父进程完成一些任务,子进程就像是父进程的手下小兵一样,因此子进程完成父进程交给的任务,退出后也一定要给父进程一个答复(子进程是否完成,是否出现异常等)。1. 因为父子进程的执行顺序是不确定的,可能父进程会比子进程先一步退出,此时就会让子进程成为僵尸进程,子进程已经退出,但是依旧占用着内存空间,造成内存泄漏。输出型参数,获取子进程退出状态,不

2024-01-03 17:41:04 1974 14

原创 fork函数详解【Linux】

fork函数的概念 深拷贝的策略 fork调用后的底层细节解释 fork学习中的一些笔记所以真实情况是:子进程的创建确实以父进程为模板将其内容拷贝到了子进程的内核数据结构中,但是当数据有所变化时,就以深拷贝的方式父子进程各自私有一份。看完上面这份代码,为什么明明父子进程的a是同一块地址空间的,按理来说子进程修改了a为3,父进程的a为什么还是8呢?由于虚拟内存地址和页表以及页表和物理地址空间的映射关系,父子进程此时都是一模一样的。调用fork函数可以在已存在的进程中创建一个子进程,此时,新进程。

2023-12-28 15:50:31 2368 13

原创 Linux下的环境变量【详解】

环境变量一般指的是在操作系统中用于指定操作系统运行环境的一些参数。在链接C/C++程序的代码时,会用到动静态库,但是动静态库我们并没有显示的去指定过让系统去那个路径下寻找它,但是每次都可以链接成功,这是因为有了环境变量的帮助。环境变量还会有一些特殊的用途,比如可以用作身份验证。

2023-11-10 13:01:48 15534 20

原创 哈希的开放定址法的实现【C++】

开放定址法也叫闭散列,是解决哈希冲突的一种方法,当发生哈希冲突之后,如果哈希表没有被装满(正常情况哈希表不会被装满的),那就向后移动,寻找一个没有元素的地址,然后插入。线性探测。

2023-11-03 12:32:49 421 23

原创 C++之函数重载【详解】

1. 函数重载的概念 C++支持函数重载的原理(名字修饰) 前言2.2 函数名修饰规则2.3 VS下的命名修饰规则预编译,编译,汇编,链接。C语言链接时得到的函数地址没有经过修饰,C++链接时需要经过特定的规则来修饰,函数名经过修饰后再去寻找相应函数的文件。由于Windows下的VS的函数名修饰规则复杂,重点了解下LINUX下 g++的函数名命名规则。

2023-10-23 22:40:36 450 21

原创 C++之继承<2>【详解】

1. 派生类的默认成员函数1.1 1. 构造成员函数1.2 拷贝复制1.3 构造函数和析构函数的执行顺序2. 继承和友元3. 继承与静态成员1. 派生类的默认成员函数1.1 1. 构造成员函数  派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。

2023-10-20 23:21:37 400 25

原创 C++之继承<1>【详解】

继承方式public继承protected继承private继承访问限定符public访问protected访问private访问。

2023-10-15 14:37:24 320 19

原创 词法分析中的“贪心法”

编译器分辨符号的方法是:从左到右一个字符一个字符的读入如果这个字符可能组成一个符号,那么再读入下一个字符,判断已经读入的字符组成的字符串是否可能组成一个符号,如果可能,继续读入下一个字符,重复上述判断,直到读入的字符已经不再可能组成一个有意义的符号,才停止判断。需要注意的是,除了字符串与字符常量,符号的中间不能有空白(空格符,制表符和换行符)。

2023-09-26 21:21:06 243 22

原创 两种解法解决LCR 008. 长度最小的子数组【C++】

LCR 008. 长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

2023-09-08 23:09:08 551 20

原创 两种解法解决 LeetCode 27. 移除元素【C++】

27. 移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

2023-09-06 15:54:31 1110 19

原创 C++ 之命名空间namespace【详解】

命名空间(英语:Namespace),也称命名空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。

2023-07-21 16:25:00 16591 26

原创 【详解】C语言冷门知识点之--位段

位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的大家有没有发现,我们在声明位段的时候,如果定义的是int,那么冒号后面跟上的数字不能超过32,如果定义的是char,那么冒号后面跟上的数字不能超过8。而位域这种数据结构的缺点在于,其内存分配与内存对齐的实现方式依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可移植的。以上也证明了, 在VS2022上,位段分配的内存中的比特位是从右向左使用的,分配剩余的比特位不够使用时,浪费掉剩余内存,重新开辟新的空间。

2023-07-14 14:01:03 3406 41

原创 经典指针与数组笔试题——C语言

学习这片文章中的知识点,可以加深大家对指针应用的理解,让大家更能轻松知道指针在各种情况下指向那个内存地址。提个问题:loudspeaker: :`int arr[5] = {1,2,3,4,5};`我们知道数组名arr是指针,指向一块地址,只有在一下两种情况下,arr表示整个数组:* sizeof(arr); 当出现sizeof的时候arr代表整个数组,计算的是整个数组的大小,所以`sizeof(arr);`运行的结果是20.* &arr; 这里的arr表示的也是整个数组,所以取出来的是整

2023-07-11 21:52:52 1295 26

原创 【C语言】结构体大小的计算

计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,计算机并非逐字节大小读写内存,而是以2,4,或8的 倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2,4或8的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。这就是字节对齐。

2023-05-22 09:36:34 1577 7

原创 详解【C语言】类型转换--整型提升,算术

C语言中整型运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换成普通整型,这种转换称为整型提升。> 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换成另一个操作数的类型,否则操作就无法进行。下面的层次体系成为寻常算术转换。

2023-05-14 10:25:04 3143 18

原创 二分查找法的区间判断【C语言】

📢 :当我们在写二分查找的题目的时候(这里以leetcode的,为例),常常会因为区间的选择而疑惑,是应该选择,还是,应该写成l,还是答案是都可以,这分别是区间的还是。

2023-05-01 10:07:50 1418 14

空空如也

空空如也

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

TA关注的人

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