- 博客(133)
- 收藏
- 关注

原创 C++项目--高并发内存池
目录一、项目介绍二、内存池介绍2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4 malloc三、定长内存池的实现3.1 定长内存池概念3.2 内存池管理释放对象3.3 内存池申请对象3.4 定长内存池整体代码3.5 性能对比四、高并发内存池整体框架设计4.1 该项目解决的问题4.2 整体框架结构4.3 各部分的主要作用五、threadcache5.1 threadcache整体设计5.2 threadcache哈希桶映射对齐规则5.2.1 映射对齐规则5.2.2 空间浪费率5.2.3 对齐和
2024-03-07 20:27:24
777
原创 leetcode141.环形链表,142环形链表ii
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。1圈之内,fast必然追上slow,因为他们之间距离每次缩小1,不会错过,slow走1圈,fast都走了2圈了,肯定追上了。slow进环以后,fast开始追击slow,slow每走1步,fast每走2步,他们之间距离缩小1。slow进环以后,fast开始追击slow,slow每走1步,fast每走3步,他们之间距离缩小2。不一定,fast会先进环,slow会后进环,假设slow进环时,slow和fast之间的距离为N。
2025-03-02 15:41:22
815
原创 leetcode106.相交链表
先分别找listA链表和listB链表的尾,如果尾节点相等,那么就是相交链表,不是就直接返回NULL,然后分别计算链表的长度,让长的链表先走他们的长度差值步,然后再同时走,如果走到节点的地址是一样的话,那么就是相交的节点。遍历listA链表,将listA链表中的每个值与listB链表中每个节点的值进行比较,比较节点地址相等的话就是交点。如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]listA 中节点数目为 m。
2025-03-02 13:53:02
695
原创 leetcode21.合并两个有序链表
遍历两个链表,取小的进行尾插就行,当list1先结束的时候,直接将list2进行尾插,否则直接将list1进行尾插。将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。两个链表的节点数目范围是 [0, 50]l1 和 l2 均按 非递减顺序 排列。
2025-02-20 23:32:18
368
原创 leetcode876.链表的中间结点
定义个slow的慢指针,每次往后面走一个,定义一个fast的快指针,每次往后面走两个。当奇数个数据的时候,fast的next走到空就停止,当偶数个数据的时候,fast走到空就停止。给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链表的结点数范围是 [1, 100]
2025-02-20 23:02:13
331
原创 leetcode203.移除链表元素
通过遍历链表,查找链表中的值等于val就进行删除,将前一个节点(pre)的next指针指向它后一个节点,然后free掉当前节点(cur),然后再将当前节点的指针(cur)指向下一个节点。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。通过查找链表中节点的值不等于val,就在新的链表上进行尾插,不过这种方式实现的时间复杂度也比较高。列表中的节点数目在范围 [0,
2025-02-19 22:22:05
349
原创 leetcode88.合并两个有序数组
在数组1中使用end1指针,数组2中使用end2t指针,两个数组从后往前进行比较,将比较后数组中较小的数进行尾插(放到数组1的最后面),当数组1先结束的时候,需要将数组2中的数依次全部拷贝到数组1中,当数组2先结束的时候,就不需要进行拷贝。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。重新额外开辟一个数组存放合并后的值。给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
2025-02-17 22:51:22
754
原创 leetcode27.删除有序数组中的重复项
使用src1,src2和dst指针,如果src1与src2所指向的内容相等时,那么就src++,如果当src1与src2不相等时,就将a数组中src1中的内容赋值到tmp数组的dst中,让后dst++,然后将src2赋值给src1,最后src2++。在一个数组中使用src和dst两个指针,当src和dst不相等时,那么就++dst,然后将数组a中的src的内容赋值到a数组中的dst中,最后在++src,如果当src和dst相等的时候,那么就直接src++。如果所有断言都通过,那么您的题解将被通过。
2025-02-02 13:45:45
901
原创 leetcode27. 移除元素
采用双指针的方法,定义src和dst的指针,当数组中元素的值等于val的时候,src往后面走,不等于val的时候i,就将src中的值放到dst中算法的时间复杂度为O(N),空间复杂度为O(1)采用时间换空间的方法,另外开辟一个新的数组,将原来数组中不等于val的值放到新的数组中去,最后再拷贝回原来的数组。算法的时间复杂度为O(N),空间复杂度为O(N)。然后返回 nums 中与 val 不同的元素的数量。从前往后进行查找,当数组中的值等于val的时候,将数组后面的值依次往前进行挪动。算法的时间复杂度为O(
2025-01-26 22:45:18
476
原创 leetcode 189.轮转数组
首先将前n-k个数进行逆置,然后将后k个数进行逆置,最后将整个数组进行整体逆置。算法的时间复杂度为O(N),空间复杂度为O(1)。空间换时间,创建一个临时变量的数组,将旋转后的数字依次放在临时变量的数组中,最后再赋值回去。算法的时间复杂度为O(N),空间复杂度为O(N)给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。暴力求解,每次旋转一个数,旋转K次。算法的时间复杂度为O(你可以使用空间复杂度为O(1)的原地算法解决这个问题吗?),空间复杂度为O(1)。
2025-01-19 14:01:38
476
原创 leetcode 面试题 17.04.消失的数字
采用异或的方法,异或的特点是,两个数字进行异或,相同为0不同为1,先将数组中的数字全部异或一遍,再将异或后的结果与0-n中所有的数字异或一遍,最后剩下的那个数字就是消失的数字。算法的时间复杂度为O(N)排序,依次查找,如果下一个数不是上一个数+1,那么上一个数+1就是消失的数字。算法的时间复杂度为0(N*logN)数组nums包含从0到n的所有整数,但其中缺了一个。你有办法在O(n)时间内完成吗?采用0-N等差数列公式进行计算,减去数组中的值,最后剩下的就是那个消失的数字。算法的时间复杂度为O(N)
2025-01-18 22:10:53
569
原创 MFC--基于vs2013入门教程
在我们使用任意一种方法添加了消息处理函数以后,都只能得到一个空的OnBnClickedAddButton()函数的函数体,要实现我们想要的功能,还需要在函数体中加入自定义功能代码。在加法计算器程序中,我们想要“计算”按钮实现的功能是,获取被加数和加数的数值,然后计算它们的和并显示到和的编辑框里。// TODO: 在此添加控件通知处理程序代码// 将各控件中的数据保存到相应的变量// 将被加数和加数的加和赋值给m_editSum// 根据各变量的值更新相应的控件。
2024-06-22 16:02:18
2202
原创 CSV文件的格式规范
金山文档(或类似的办公软件)导出的CSV(Comma-Separated Values,逗号分隔值)文件,遵循CSV文件的标准格式约定。因此,当你在Notepad++中看到用逗号自动分隔,且有多个逗号的数据被双引号包围的情况,这表明金山文档在导出CSV文件时正确遵守了CSV格式的规范,使得数据能够在其他支持CSV格式的软件中正确地导入和解析。如果数据中的双引号也是数据的一部分,则通过在内部双引号前再添加一个双引号进行转义,即 “” 表示一个实际的双引号字符。“这是一个测试,”“带逗号”“的句子。
2024-05-12 10:48:04
2960
原创 C语言-程序环境和预处理
_FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。
2024-05-04 23:22:27
791
1
原创 C语言-文件操作
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是。
2024-05-04 23:22:14
1227
原创 C语言-动态内存管理
C语言提供了一个动态内存开辟的函数//malloc申请到空间后直接返回这块空间的起始地址,不会初始化空间的内容这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
2024-05-04 16:24:30
1089
原创 C语言-自定义类型:结构体,枚举,联合
有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。
2024-05-04 16:23:34
1172
原创 C语言-字符串函数和内存函数
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。参数指向的字符串必须要以 ‘\0’ 结束。注意函数的返回值为size_t,是无符号的( 易错 )while (*s!s++;return 0;= '\0')s++;
2024-05-04 16:22:18
914
原创 C语言-指针详解
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。2.&数组名,这里的数组名表示整个数组,&数组名取出的是整个数组的地址。整型指针–指向整型变量的指针,存放整型变量的地址的指针变量。字符指针–指向字符变量的指针,存放字符变量的地址的指着变量。数组指针–指向数组的指针,存放的是数组的地址的指针变量。类型的指针可以接收任意类型的地址。
2024-05-03 00:32:22
693
原创 C语言-数据在内存中的存储
字节序:是以字节为单位,讨论存储顺序的小端字节序存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处。大端字节序存储把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容,存放在低地址处。
2024-05-03 00:31:48
290
原创 VS(Visual Studio)中查找项目里的中文字符
由于中文字符的Unicode范围大致在 \u4e00 到 \u9fff 之间(这包括了大部分常用的中文字符,但不包括一些扩展区域),你可以使用正则表达式 [\u4e00-\u9fff]+ 来匹配一个或多个连续的中文字符。不过,由于中文字符的范围非常广泛(包括简体中文、繁体中文、日本汉字、韩国汉字等),你可能需要定义一个大致的字符范围来执行查找。(3)如果你想要查找所有可能的中文字符(包括一些不常用的和扩展区域的字符),你可能需要扩大这个范围,但这会增加误报的可能性。打开你想要搜索的源代码文件或项目。
2024-05-02 23:01:17
2105
1
原创 C语言-调试技巧
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。F5:启动调试,经常用来直接跳到下一个断点处。F9:创建断点和取消断点,断点的重要作用,可以在程序的任意位置设置断点,这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句F11。
2024-05-02 22:58:04
1213
原创 C语言-分支和循环语句、函数、数组、操作符、指针、结构体
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。函数的声明一般出现在函数的使用之前。要满足先声明后使用。函数的声明一般要放在头文件中的。函数的定义是指函数的具体实现,交待函数的功能实现。
2024-05-01 22:16:53
1450
原创 C语言-整体内容简单的认识
sizeof是一个操作符,是计算机类型/变量所占内存空间的大小scanf函数返回的是读取到数据的个数,如果scanf函数读取失败会返回EOF(EOF end of file 文件结束标志,#define EOF -1)多组输入:while(scanf(“%d”,&q)==1) 如果读取到一个数就持续输入,否则返回EOFscanf函数每次读取一个字符,跳过所有的空白字符,直到遇到第一个非空白字符的时候才开始读取。并且在读取到第一个空白字符后结束读取,将空白字符之后的所有字符都暂存在缓冲区中。
2024-05-01 22:16:23
1219
原创 Git--项目开发模型
2. 在develop 下开发⼈员⾃测通过后,先确定下 develop 不存在未测试完毕的需求,然后研发⼈员可基于 develop 分⽀创建⼀个 release/xxx 分⽀出来,可交由测试⼈员进⾏测试。可基于 master 创建 hotfix/xxx 分⽀,修复完毕后发布到 master 验证,验证完毕后,将master 代码合并到 develop 分⽀,同时删掉 hotfix/xxx 分⽀。1.develop 为开发分⽀,基于master分⽀创建的只读且唯⼀分⽀,始终保持最新完成以及bug修复后的码。
2024-04-27 23:31:04
1203
原创 Git--多人协作
⾸先,可以试图⽤git push origin branch-name推送⾃⼰的修改;如果推送失败,则因为远程分⽀⽐你的本地更新,需要先⽤git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再⽤git push origin branch-name推送就能成功!功能开发完毕,将分⽀merge进master,最后删除分⽀。
2024-04-27 23:17:59
1844
原创 Git--分布式版本控制系统
这就需要我们重新配置下了,同样要注意需要和gitee上配置的⽤⼾名和邮箱⼀致。顺利的话,可以在⽤⼾主⽬录⾥找到 .ssh ⽬录,⾥⾯有 id_rsa 和 id_rsa.pub 两个⽂件,这两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去, id_rsa.pub 是公钥,可以放⼼地告诉任何⼈。实际情况往往是这样,找⼀台电脑充当服务器的⻆⾊,每天24⼩时开机,其他每个⼈都从这个“服务器”仓库克隆⼀份到⾃⼰的电脑上,并且各⾃把各⾃的提交推送到服务器仓库⾥,也从服务器仓库中拉取别⼈的提交。
2024-04-27 22:38:37
1395
原创 Git--分支的原理与使用
添加⼀个新功能时,你肯定不希望因为⼀些实验性质的代码,把主分⽀搞乱了,所以,每添加⼀个新功能,最好新建⼀个分⽀,我们可以将其称之为feature分⽀,在上⾯开发,完成后,合并,最后,删除该feature 分⽀。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除。⼲活都在dev分⽀上,也就是说,dev分⽀是不稳定的,到某个时候,⽐如1.0版本发布时,再把dev分⽀合并到master上,在master分⽀发布1.0版本;
2024-04-27 22:15:57
1339
原创 SVN--基本原理与使用(超详细)
1.为什么需要SVN版本控制软件我们想开发一个系统,需要张三,李四、王五三个人进行开发,每个人开发一个系统的某几个模块,我们称作协作开发。他们开发之间进行交流称作远程开发。最后合并成几个版本,如v1.0 、v2.0。这时候就需要SVN来进行版本管理,主要是三个功能:版本回退,协作开发,远程开发。2.解决之道SCM:(Software configuration management)软件配置管理,所谓的软件配置管理实际就是对软件源代码进行控制与管理CVS:元老级产品VSS:入门级产品。
2024-04-27 17:18:49
19400
4
原创 Git--原理与使用
需要说明的是,我们看到的⼀⼤串类似 23807c5…⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符,也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。还需要再明确⼀点,所有的版本控制系统,Git也不例外,其实只能跟踪⽂本⽂件的改动,⽐如TXT⽂件,⽹⻚,所有的程序代码等等。注意 git commit后⾯的 -m 选项,要跟上描述本次提交的message,由用户自己完成,这部分内容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。
2024-04-21 10:33:49
1175
原创 Windows下Git的使用(TortoiseGit基本使用)
从信息中可以看到,更新远程仓库的信息被拒绝了,原因是远程仓库中包含了本地不具有的信息,就是远程仓库中的信息没有更新到本地仓库里面。最后想要推送到远程仓库就需要用push操作,点就左下角的push按钮,第一次push可能会让你输入用户名和密码,然后点击push,即可完成推送。出现推送后没有出现绿点的情况,可能是因为,你本地的用户和邮箱和远程仓库的邮箱不一致,需要将远程仓库的邮箱在本地中进行设置。这个问题出现的原因,基本就是别人在你后面又提交了一次,导致你本地的文件信息与远程仓库里的信息不一致。
2024-04-21 09:15:03
2427
原创 Linux--进程的概念(二)
现在说说main函数的前两个参数,main函数的第二个参数是一个字符指针数组,数组当中的第一个字符指针存储的是可执行程序的位置,其余字符指针存储的是所给的若干选项,最后一个字符指针为空,而main函数的第一个参数代表的就是字符指针数组当中的有效元素个数。容易理解的是,要执行一个可执行程序必须要先找到它在哪里,既然不带./就可以执行ls命令,说明系统能够通过ls名称找到ls的位置,而系统是无法找到我们自己的可执行程序的,所以我们必须带上./,以此告诉系统该可执行程序位于当前目录下。
2024-04-09 23:11:56
793
原创 牛客网-替换空格
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。计算出替换后的字符串的长度后,我们可以在原字符串当中,从后往前进行填充。若遇到的不是空格,则将遍历到的字符从后往前进行填充。因为是‘ ’ ->“%20”,是1换3,所以可以先统计原字符串中空格的个数(设为count),然后可以计算出新字符串的长度。因为一个空格字符会被替换为三个字符,所以替换后字符串的新长度new_str=length+2*count。若遇到的是空格,则从后往前填充字符‘0’,‘2’,‘%’
2024-04-06 23:26:48
399
原创 Linux--进程的概念(一)
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库,shell程序等)设计OS的目的(1)与硬件交互,管理所有的软硬件资源(2)为用户程序(应用程序)提供一个良好的执行环境定位一款纯正的“搞管理”的软件如何理解“管理”(1)管理的例子(2)描述被管理对象(3)组织被管理对象先描述,再组织上图就是一个计算机软硬件体系结构,操作系统也是软件(1)描述起来,用struct结构体,软件和硬件都是这样的。
2024-04-06 21:39:44
1358
原创 牛客JZ39-数组中出现次数超过一半的数字
首先需要考虑数组是否为空的情况,然后对数组从前往后进行抵消,如果相同,计数就+1,不同计数就-1,接着计算最后剩下的数字在整个数组中出现的次数,最后判断这个数出现的次数是否大于数组长度的一半,是就返回数值,否则返回0。首先对整个数组进行排序,然后计算中间数组的值,接着遍历整个数组,对目标值进行次数的统计,最后判断目标值出现的次数是否大于数组长度的一半,是则返回数值,否则返回0.例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。如果不存在则输出0。输入:[1,2,3,2,2,2,5,4,2]
2024-04-05 16:53:44
596
原创 软件测试-进阶篇
安全性测试的方法有代码评审,渗透测试,安全运维等,常用的静态安全测试工具有,Coverity,IBM Appscan Source,HPFortify,常用的动态安全测试有OWASP的ZAP,HP WebInspect等。 软件只是一种工具,软件与人的信息交流是通过界面来进行的,界面是软件与用户交流的最直接的一层,界面的设计决定了用户对我们设计的软件的第一印象;但是灵活性的设计要把握好度,不然可能由于太多的用户状态和方式的选择,增加了软件设计的复杂性,和程序实现的难度。我们主要讨论以下几个方面。
2024-04-01 22:59:54
1218
原创 软件测试-用例篇
测试用例对应的功能已删除,不可操作了微信刚出来时与QQ可互发消息,下一个版本后就不可以发消息。执行一条测试用例未发现BUG,实际该处有BUG苹果7手机微信添加了mobile单车小程序,扫码不能开锁,只能使用mobile APP开锁,测试用例未涉及到苹果7微信小程序扫码开锁。执行一条测试用例发现了BUG苹果7手机微信添加了mobile单车小程序,用例已写到了苹果7微信添加moblie小程序扫码开锁,问题被发现。执行一条测试用例未发现BUG,实际该处BUG已修改。
2024-04-01 22:13:16
1209
原创 软件测试-基础篇
bug的定义每个公司都不一致,在定义级别之前需要查看公司规范以下为样例:(1)Blocker(崩溃): 阻碍开发或测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失,基本模块缺失等问题。如:代码错误、死循环、数据库发生死锁、重要的一级菜单功能不能使用等(该问题在测试中较少出现,一旦出现应立即中止当前版本测试)(2)Critical(严重) 系统主要功能部分丧失、数据库保存调用错误、用户数据丢失,一级功能菜单不能使用但是不影响其他功能的测试。
2024-04-01 21:19:03
1154
原创 软件测试-概念篇
(1)需求的定义用户需求:可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端用户使用产品时必须要完成的任务,该需求一般比较简略。软件需求:或者叫功能需求,该需求会详细描述开发人员必须实现的软件功能。大多数公司在进行软件开发的时候会把用户需求转化为软件需求,开发人员和测试人员工作的直接依据就是软件需求。软件需求是谁写?产品经理。开发一个产品,或者测试一个产品,需要拿着软件需求进行测试/开发,还是拿着用户需求进行开发/测试?是软件需求。。
2024-03-31 10:14:10
1028
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人