自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 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 392

原创 SVN--基本原理与使用(超详细)

1.为什么需要SVN版本控制软件我们想开发一个系统,需要张三,李四、王五三个人进行开发,每个人开发一个系统的某几个模块,我们称作协作开发。他们开发之间进行交流称作远程开发。最后合并成几个版本,如v1.0 、v2.0。这时候就需要SVN来进行版本管理,主要是三个功能:版本回退,协作开发,远程开发。2.解决之道SCM:(Software configuration management)软件配置管理,所谓的软件配置管理实际就是对软件源代码进行控制与管理CVS:元老级产品VSS:入门级产品。

2024-04-27 17:18:49 411

原创 Git--原理与使用

需要说明的是,我们看到的⼀⼤串类似 23807c5…⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符,也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。还需要再明确⼀点,所有的版本控制系统,Git也不例外,其实只能跟踪⽂本⽂件的改动,⽐如TXT⽂件,⽹⻚,所有的程序代码等等。注意 git commit后⾯的 -m 选项,要跟上描述本次提交的message,由用户自己完成,这部分内容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。

2024-04-21 10:33:49 981

原创 Windows下Git的使用

从信息中可以看到,更新远程仓库的信息被拒绝了,原因是远程仓库中包含了本地不具有的信息,就是远程仓库中的信息没有更新到本地仓库里面。最后想要推送到远程仓库就需要用push操作,点就左下角的push按钮,第一次push可能会让你输入用户名和密码,然后点击push,即可完成推送。出现推送后没有出现绿点的情况,可能是因为,你本地的用户和邮箱和远程仓库的邮箱不一致,需要将远程仓库的邮箱在本地中进行设置。这个问题出现的原因,基本就是别人在你后面又提交了一次,导致你本地的文件信息与远程仓库里的信息不一致。

2024-04-21 09:15:03 535

原创 Linux--进程的概念(二)

现在说说main函数的前两个参数,main函数的第二个参数是一个字符指针数组,数组当中的第一个字符指针存储的是可执行程序的位置,其余字符指针存储的是所给的若干选项,最后一个字符指针为空,而main函数的第一个参数代表的就是字符指针数组当中的有效元素个数。容易理解的是,要执行一个可执行程序必须要先找到它在哪里,既然不带./就可以执行ls命令,说明系统能够通过ls名称找到ls的位置,而系统是无法找到我们自己的可执行程序的,所以我们必须带上./,以此告诉系统该可执行程序位于当前目录下。

2024-04-09 23:11:56 742

原创 牛客网-替换空格

例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。计算出替换后的字符串的长度后,我们可以在原字符串当中,从后往前进行填充。若遇到的不是空格,则将遍历到的字符从后往前进行填充。因为是‘ ’ ->“%20”,是1换3,所以可以先统计原字符串中空格的个数(设为count),然后可以计算出新字符串的长度。因为一个空格字符会被替换为三个字符,所以替换后字符串的新长度new_str=length+2*count。若遇到的是空格,则从后往前填充字符‘0’,‘2’,‘%’

2024-04-06 23:26:48 341

原创 Linux--进程的概念(一)

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库,shell程序等)设计OS的目的(1)与硬件交互,管理所有的软硬件资源(2)为用户程序(应用程序)提供一个良好的执行环境定位一款纯正的“搞管理”的软件如何理解“管理”(1)管理的例子(2)描述被管理对象(3)组织被管理对象先描述,再组织上图就是一个计算机软硬件体系结构,操作系统也是软件(1)描述起来,用struct结构体,软件和硬件都是这样的。

2024-04-06 21:39:44 1260

原创 牛客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 516

原创 软件测试-进阶篇

​  安全性测试的方法有代码评审,渗透测试,安全运维等,常用的静态安全测试工具有,Coverity,IBM Appscan Source,HPFortify,常用的动态安全测试有OWASP的ZAP,HP WebInspect等。​  软件只是一种工具,软件与人的信息交流是通过界面来进行的,界面是软件与用户交流的最直接的一层,界面的设计决定了用户对我们设计的软件的第一印象;但是灵活性的设计要把握好度,不然可能由于太多的用户状态和方式的选择,增加了软件设计的复杂性,和程序实现的难度。我们主要讨论以下几个方面。

2024-04-01 22:59:54 929

原创 软件测试-用例篇

测试用例对应的功能已删除,不可操作了微信刚出来时与QQ可互发消息,下一个版本后就不可以发消息。执行一条测试用例未发现BUG,实际该处有BUG苹果7手机微信添加了mobile单车小程序,扫码不能开锁,只能使用mobile APP开锁,测试用例未涉及到苹果7微信小程序扫码开锁。执行一条测试用例发现了BUG苹果7手机微信添加了mobile单车小程序,用例已写到了苹果7微信添加moblie小程序扫码开锁,问题被发现。执行一条测试用例未发现BUG,实际该处BUG已修改。

2024-04-01 22:13:16 1067

原创 软件测试-基础篇

bug的定义每个公司都不一致,在定义级别之前需要查看公司规范以下为样例:(1)Blocker(崩溃):​  阻碍开发或测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失,基本模块缺失等问题。如:代码错误、死循环、数据库发生死锁、重要的一级菜单功能不能使用等(该问题在测试中较少出现,一旦出现应立即中止当前版本测试)(2)Critical(严重)​  系统主要功能部分丧失、数据库保存调用错误、用户数据丢失,一级功能菜单不能使用但是不影响其他功能的测试。

2024-04-01 21:19:03 1046

原创 软件测试-概念篇

(1)需求的定义​用户需求:可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端用户使用产品时必须要完成的任务,该需求一般比较简略。​软件需求:或者叫功能需求,该需求会详细描述开发人员必须实现的软件功能。大多数公司在进行软件开发的时候会把用户需求转化为软件需求,开发人员和测试人员工作的直接依据就是软件需求。​软件需求是谁写?​产品经理。开发一个产品,或者测试一个产品,需要拿着软件需求进行测试/开发,还是拿着用户需求进行开发/测试?是软件需求。​。

2024-03-31 10:14:10 902

原创 软件测试-答疑篇

外观是否好看,WEB的UI自动化测试,APP的UI自动化,后端的接口进行测试,性能,安全…测试开发工程师:测试工程师的工作内容上加了一些开发工作(开发测试用例,开发测试工具,开发出来的测试工具让测试人员用,提高测试效率)测试:测试+开发执行(通常情况下,黑盒测试由测试人员执行,部分白盒测试、系统测试是由开发人员执行)通常情况下,大厂测试和开发的薪资是一样的,中小厂测试和开发的薪资比起来,测试是略低的。测试工程师、测试开发、测试其他、游戏测试、软件测试、自动化测试、性能测试、安全测试。

2024-03-31 10:01:21 522

原创 牛客JZ21-调整数组顺序使奇数位于偶数前面

可以通过左右下标的方法,left下标找到偶数,right下标找到奇数,然后进行交换,left是奇数就++left,right是偶数就–right,一次类推完成所有数据的交换,但是这种方式是无法保证奇数和奇数,还有偶数和偶数的相对位置不变的。首先遍历整个数组,查找数组中的奇数,找到后将它临时保存起来,然后将该奇数位置之前的所有偶数都向后移动一位,最后将该奇数放到移动后的空闲位置处,依次类推,就可以完成不改变顺序的奇数在前偶数在后的数组排序。输入:[2,4,6,5,7]输入:[1,3,5,6,7]

2024-03-26 14:21:29 794

原创 牛客JZ11-旋转数组的最小数字

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。这个过程会让[left,right]区间缩小,这个过程中,left永远在原数组前半部分,right永远在原数组的后半部分,而范围会一直缩小,当left和right相邻时,right指向的位置,就是最小元素的位置。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。输入:[3,4,5,1,2]

2024-03-25 21:43:22 815

原创 leetcode LCR121.寻找目标值-二维数组

我们可以找到行列的交界处,比如[0][2],即数字3这个位置,通过观察,我们可以发现,该数字是所在行中的最大数字,所在列中的最小数字,可以用目标数target和该交界处数字进行比较,:有一个二维数组,数组的每行从左到右都是递增的,每列从上到下都是递增的,在这样的数组中查找一个数字是否存在。直接对该二维数组进行遍历,但该种方法的时间复杂度为。如果用[2][0]也是可以的,思路则反过来。这个题目和杨氏矩阵是一样的。

2024-03-24 13:44:45 848

原创 C++进阶--C++11智能指针

智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象生命周期结束时,自动调用析构函数释放资源。RAII是resource acquisition is initialization的缩写,意为“资源获取即初始化”。它是 C++ 之父 Bjarne Stroustrup 提出的设计理念,其核心是把资源和对象的生命周期绑定,对象创建获取资源,对象销毁释放资源。

2024-02-07 21:15:28 962

原创 C++进阶--C++11包装器

第一个参数传入函数指针,后面传入绑定的参数列表依次是placeholders::_1和placeholders::_2,表示后续调用新生成的可调用对象时,第一个参数传给placeholders::_1,第二个参数传给placeholders::_2。根本原因就是因为,后续调用新生成的可调用对象时,传入的第一个参数会传给placeholders::_1,传入的第二个参数会传给placeholders::_2,因此可以在绑定时通过控制placeholders::_n的位置,来控制第n个参数的传递位置。

2024-02-07 13:03:21 834

原创 C++进阶--C++11线程库

如果共享数据都是只读的,那么没问题,因为只读操作不会影响到数据,更不会涉及对数据的修改,所以所有线程都会获得同样的数据。调用thread的成员函数get_id可以获取线程的id,但该方法必须通过线程对象来调用get_id函数,如果要在线程对象关联的线程函数中获取线程id,可以调用this_thread命名空间下的get_id函数。线程函数的参数是以值拷贝方式拷贝到线程空间中的,就算线程函数的参数为引用类型,在线程函数中修改后也不会影响到外部实参,因为其实际引用的是线程栈中的拷贝,而不是外部实参。

2024-02-05 00:01:10 842

原创 C++进阶--C++11 lambda表达式

因此每个lambda表达式的类型都是不同的,这也就是lambda表达式之间不能互相赋值的原因,我们通过typeid(变量名).name()的方式获取lambda表达式的类型。[=]**的方式捕获变量时,编译器也不一定会把父作用域中所有的变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,没有必要把用不到的变量也捕获进来。但是由于这里是传值捕捉,lambda函数中对a和b的修改不会影响外面的a、b变量,与函数的传值传参是一个道理,因此这种方法无法完成两个数的交换。

2024-02-02 23:55:02 942

原创 C++进阶--C++11新的类功能和可变参数模板

/ Args是一个模板参数包,args是一个函数形参参数包// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。{}说明模板参数Args前面有省略号,代表它是一个可变模板参数,我们把带省略号的参数称为参数包,参数包里面可以包含0到N(N≥0)个模板参数,而args则是一个函数形参参数包。模板参数包Args和函数形参参数包args的名字可以任意指定,并不是说必须叫做Args和args。

2024-01-30 22:18:03 691

原创 C++进阶--C++11右值引用和移动语义

右值引用和移动语义一、基本概念1.1 左值的概念1.2 右值的概念1.3 左值引用的概念1.4 右值引用的概念二、右值引用使用场景和意义2.1 左值引用的使用场景2.2 左值引用的短板2.3 右值引用和移动语义2.3.1 移动构造2.3.2 移动赋值2.3.3 STL容器2.4 右值引用引用左值2.5 右值引用的其他使用场景三、完美转发3.1 万能引用3.2 完美转发保持值的属性3.3 完美转发的使用场景一、基本概念   传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现

2024-01-29 16:45:59 1026

原创 C++进阶--C++11入门基础

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2024-01-26 16:09:34 803

原创 C++进阶--特殊类设计

在C++类与对象中,C++98中,一个空类中编译器会默认生成六个成员函数,分别是构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、普通对象和const对象取地址重载函数;在C++11中增加了移动构造和移动赋值。而对于一些特殊的类,当用户未显示生成相应的方法时,我们也不希望编译器生成该方法。所以每当设计一个类的时候都得根据用户的需求来进行相应的设计。

2024-01-25 14:35:58 878

原创 C++进阶--哈希的应用之位图和布隆过滤器

相同的IP一定进入相同小文件,读取单个小文件,就可以统计IP出现次数。

2024-01-23 21:18:48 860

原创 C++进阶--哈希表模拟实现unordered_set和unordered_map

哈希表里面具体存的是什么类型的元素,是由模板参数T来决定如果是unordered_set,传给T就是Key如果是unordered_map,传给T的就是pair哈希表结点结构T _data;{}迭代器的结构:注意:哈希表迭代器封装的是结点指针和哈希表指针,因为要在哈希表中找下一个桶,所以要用到哈希表指针在构造正向迭代器时,我们不仅需要对应哈希结点的指针,还需要该哈希结点所在哈希表的地址。

2024-01-21 21:45:24 1009

原创 C++进阶--哈希表的的闭散列和开散列(哈希桶)实现

与闭散列的哈希表不同的是,在实现开散列的哈希表时,我们不用为哈希表中的每个位置设置一个状态字段,因为在开散列哈希表中,我们将哈希地址相同的元素都放到了同一个哈希桶中,并不需要经过探测寻找所谓的“下一个位置”。与闭散列不同的是,这种将相同哈希地址的元素通过单链表链接起来,然后将链表的头结点存储在哈希表中的方式,不会影响与自己哈希地址不同的元素的增删改查的效率,因此开散列的负载因子相比闭散列而言,可以稍微大一点。闭散列解决哈希冲突,采用的是一种报复的方式,”我的位置被占用了我就去占用其他位置“。

2024-01-20 22:01:01 962

原创 Linux编译器--git、yum、gdb的使用

对同一份源代码分别生成其release版本和debug版本的可执行程序,并通过ll指令可以看到,debug版本发布的可执行程序的大小比release版本发布的可执行程序的大小要大一点,其原因就是以debug版本发布的可执行程序当中包含了更多的调试信息。yum是一个在Fedora、RedHat以及CentOS中的前端软件包管理器,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。但是一个人的精力有限。来控制自己的代码,并且也开源了。

2024-01-19 21:10:28 1051

原创 Linux编译器--gcc和g++使用

在我们每次重新生成可执行程序前,都应该将上一次生成可执行程序时生成的一系列文件进行清理,但是如果我们每次都手动执行一系列指令进行清理工作的话,未免有些麻烦,因为每次清理时执行的都是相同的清理指令,这时我们可以将项目清理的指令也加入到Makefile文件当中。5. 当然,你的test.c文件和main.c文件是存在的,于是make会生成test.o文件和main.o文件,然后再用test.o文件和main.o文件生成最终的mytest文件。其次,我们还可以使用ldd指令查看动态链接的可执行文件所依赖的库。

2024-01-18 21:26:06 1043

原创 C++进阶--空间配置器

内存池就是:先申请一块比较大的内存块已做备用,当需要内存时,直接到内存池中去取,当池中空间不够时,再向内存中去取,当用户不用时,直接还回内存池即可。一级空间配置器原理非常简单,直接对malloc与free进行了封装,并增加了C++中set_new_handle思想。虽然在常规使用STL时,可能用不到它,但站在学习研究地角度,学习它地实现原理对我们有很大地帮助。,但没有采用链表的方式对用户已经归还的空间进行管理(因为用户申请空间时在查找合适的小块内存时效率比较低)而是。空间配置器,顾名思义就是。

2024-01-18 14:20:19 846

原创 C++进阶--IO流

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?1.使用itoa()函数2.使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。

2024-01-17 19:37:06 1077

原创 C++进阶--类型转换

而使用dynamic_cast进行向下类型转换则是安全的,如果父类的指针(或引用)指向的是子类对象,那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象,那么dynamic_cast会转换失败并返回一个空指针。2.由于编译器认为const修饰的变量是不会被修改的,因此会将const修饰的变量存放到寄存器当中,当需要读取const变量时就会直接从寄存器中进行读取,而我们修改的实际上是内存中a的值,因此最终打印出a的值是未修改之前的值。

2024-01-17 13:30:18 986

原创 C++进阶--异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。最基础的异常类至少需要包含错误编号和错误描述两个成员变量,甚至还可以包含当前函数栈帧的调用链等信息。该异常类中一般还会提供两个成员函数,分别用来获取错误编号和错误描述。

2024-01-16 22:03:05 796

原创 C++进阶--unordered_set、unordered_map的介绍和使用

1.unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。2.在unordered_set中,元素的值同时也是唯一的标识它的key。3.在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。4.unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。5.它的迭代器至少是前向迭代器。

2024-01-15 21:22:01 1747

原创 C++进阶--红黑树模拟实现STL中的map和set

因此,上层容器map需要向底层红黑树提供一个仿函数,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。但是对于底层红黑树来说,它并不知道上层容器是map还是set,因此需要进行两个结点键值的比较时,底层红黑树都会通过传入的仿函数来获取键值Key,进而进行两个结点键值的比较。这样一来,当底层红黑树需要进行两个结点之间的键值的比较时,都会通过传入的仿函数来获取相应结点的键值,然后再进行比较。

2024-01-15 19:49:53 1150

原创 C++进阶--红黑树

这里直接实现K V模型的红黑树,为了方便后续的旋转操作,将红黑树的结点定义为三叉链结构,除此之外还新加入了一个成员变量,用于表示结点的颜色。,_kv(kv),_col(RED){}这里使用枚举来定义结点的颜色,这样可以增加代码的可读性和可维护性为什么构造结点时,默认将结点的颜色设置为红色?当我们向红黑树插入结点时,若我们插入的是黑色结点,那么插入路径上黑色结点的数目就比其他路径上黑色结点的数目多了一个,即破坏了红黑树的性质4,此时我们就需要对红黑树进行调整。

2024-01-14 15:01:51 851

原创 C++进阶--AVL树

我们这里直接实现KV模型的AVL树,为了方便后续的操作,这里将AVL树中的结点定义为三叉链结构,并在每个结点当中引入平衡因子(右子树高度-左子树高度)。除此之外,还需编写一个构造新结点的构造函数,由于新构造结点的左右子树均为空树,于是将新构造结点的平衡因子初始设置为0即可。//三叉链//存储的键值对int _bf;// 平衡因子(balance factor)//构造函数,_kv(kv),_bf(0){}注意。

2024-01-12 17:27:51 882

原创 Linux系统下gitee使用git提交代码

开发者向 Git 版本库写入最常用到的协议是SSH协议,因为SSH协议使用公钥认证,可以实现无口令访问,而若使用HTTPS协议每次身份认证时都需要提供口令,即要输入GitHub 的账号和密码。登陆gitee官网:https://gitee.com/。设置->安全设置->ssh公钥.在生成公钥中张贴刚刚复制的内容。然后再次执行 ssh-add ~/.ssh/id_rsa 指令。2.读取公钥文件 ~/.ssh/id_rsa.pub。第一行:“” 里面为你的gitee账户关联的邮箱信息;

2024-01-09 22:05:11 1042

原创 C++进阶--map和set的介绍及使用

set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。注意。

2024-01-07 16:29:43 889

原创 C++进阶--二叉树进阶(二叉搜索树)

二叉树进阶(二叉搜索树)一、二叉搜索树1.1 二叉搜索树的概念二、二叉搜索树的结构2.1 结点结构2.2 树结构三、二叉搜索树的操作(非递归)3.1 二叉搜索树的插入3.2 二叉搜索树的查找3.3 二叉搜索树的中序遍历3.4 二叉搜索树的删除四、二叉搜索树的操作(递归)4.1 二叉搜索树的查找4.2 二叉搜索树的插入4.3 二叉搜索树的删除五、其他相关成员函数的实现5.1 析构函数5.2 构造和拷贝构造5.3 赋值重载6、二叉搜索树的应用6.1 K模型6.2 KV模型6.3 KV模型代码实现6.3.1 将二

2023-12-30 20:56:11 880

空空如也

空空如也

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

TA关注的人

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