- 博客(46)
- 收藏
- 关注
原创 C++:跳表
skiplist本质上是一种,由William Pugh发明,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key或者key/value的查找模型。skiplist,顾名思义,首先它是一个list。实际上,它是在的基础上发展起来的。如果是一个有序的链表,查找数据的时间复杂度是O(N)。skiplist思路:假如我们,如下图b所示。这样所有新增加的指针连成了一个新的链表。,由于新增加的指针,我们不再需要与链表中每个节点逐个进行比较了,需要比较的节点数大概只有原来的一半。
2026-03-30 10:43:37
87
原创 C++:B树
MySQL是目前非常流行的开源关系型数据库,不仅是免费的,可靠性高,速度也比较快,而且拥有灵活的插件式存储引擎。MySQL中索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。注意:索引是基于表的,而不是基于数据库的。
2026-03-23 10:43:18
361
原创 C++:LRU Cache
LRU是的缩写,意思是,它是一种。什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或网络内容等。Cache的容量有限,因此,而, 就,从而腾出空间来放新内容。。
2026-03-16 10:40:30
166
原创 C++:图
图是一种由顶点集合和边集合组成的数据结构,分为有向图和无向图。有向图的边有方向性,无向图的边是双向的。图的存储方式主要有邻接矩阵和邻接表两种:邻接矩阵用二维数组表示顶点间关系,适合稠密图;邻接表用链表存储边关系,适合稀疏图。关键概念包括顶点的度、路径、连通性等。邻接矩阵能快速判断顶点连通性但空间效率低,邻接表则更节省空间但查询效率较低。根据具体应用场景选择合适的存储结构对图算法效率有重要影响。
2026-03-05 12:04:22
360
原创 C++:并查集
并查集是一种高效处理不相交集合合并与查询的数据结构。它支持查找元素所属集合、合并两个集合、判断元素是否同属一个集合等操作。实现时使用数组存储,负数表示根节点,绝对值表示集合大小。典型应用包括求解朋友圈问题(如省份数量)和方程可满足性验证。并查集通过路径压缩优化查找效率,在解决连通性问题时表现出色。
2026-03-03 15:47:31
630
原创 C++:异常
异常处理机制允许程序中独立开发的部分能够在,异常使得我们能够,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节无须知道问题的处理模块的所有细节。C语言主要通过错误码的形式处理错误,错误码本质就是对错误信息进行分类编号,拿到错误码以后还要去查询错误信息,比较麻烦。C++中,异常时抛出⼀个对象,这个对象可以函数更全面的各种信息。
2026-02-25 14:20:39
650
原创 C++:封装红黑树实现map和set
key参数用K,value参数用V,红黑树中的数据类型使用T。RBTree实现了泛型,但不知道T参数是K,还是pair<K, V>。所以我们在map和set层分别实现⼀个MapOfT和SetOfT的传给RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数,这样才方便比较。
2026-02-14 13:46:25
842
原创 C++:红黑树
红黑树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表示结点的,可以是红色或者黑色。通过对任何⼀条从根到叶子的路径上各个结点的颜色进行约束,,因而是接近平衡的。
2026-02-07 17:11:15
941
原创 C++:AVL树
根据parent与subR/subL(即cur)的平衡因子,决定用什么旋转调整平衡。if (_root == nullptr) //如果是空树//插入节点while (cur) //按搜索树规则找到插入位置elseif (parent->_kv.first < kv.first) //插入节点else//链接父亲节点//控制平衡,更新平衡因子elsebreak;//旋转。
2026-02-03 21:49:39
892
原创 C++:map和set的使用
STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为,因为逻辑结构为的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,比如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的来顺序保存和访问的。也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按来保存和访问的。
2026-01-27 15:09:12
680
原创 C++:二叉搜索树
二叉搜索树又称二叉排序树,具有以下性质:若左子树不为空,则左子树的所有节点的值根节点的值。若右子树不为空,则右子树的所有节点的值根节点的值。左右子树也分别为二叉搜索树。二叉搜索树可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景。map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等值,multimap/multiset⽀持插⼊相等值。若不支持插入相等值,则二叉搜索树时结果是一个有序序列。
2026-01-26 17:54:42
686
原创 C++:string的使用
综上,迭代器有4种:iterator、reverse_iterator、const_iterator、const_reverse_iterator。由上述代码可以看到,iterator是类似指针的东西,但不是指针,所有容器都可以用这种类似的方式访问。C++的字符串的类型是string,是一个类类型,而C语言的字符串是char*类型。在字符串中从头开始找指定字符,返回该字符第一次出现的位置,未找到则返回npos。可以用c_str把C++的字符串转成C格式的字符串,从而适配C。可以反向遍历字符串。
2025-10-29 14:58:42
709
2
原创 C++:模板基础和string基础
实现一个交换函数,我们可以用C++的函数重载,使一个Swap函数可以交换int、double、char…类型的两个变量的值。显然,函数重载在这里用起来并不方便。重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数;同时,代码的可维护性比较低,一个出错可能所有的重载均出错。C++有来作为模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码)。泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
2025-10-21 13:55:27
717
1
原创 C++:内存管理
例题静态区即数据段,数据段存储全局数据、静态数据,所以在静态区的有globalvar、sGlobalvar、svar。栈存储非静态局部变量、函数参数、返回值等,所以局部变量localvar、数组num[10]、字符数组str1、指针str2和p1都在栈上。指针str2指向的是字符串常量,所以str2指向的abcd在常量区即代码段。malloc在堆上动态开辟空间,p1指向的内容在堆上。
2025-10-10 08:54:23
888
1
原创 C++:类的6个知识点
例如:求1+2+3+…+n,不使用乘除,if…else,switch,while,do…while,for,三目运算符?由于每创建一次就调用一次构造函数Sum(),_i从1开始变化到n,所以_ret就加1,加2,加3……vs2022中不能使用变长数组,所以在函数int Sum_Solution(int n)中去掉参数n进行调试。拙作一篇,望诸位同道不吝斧正。
2025-10-06 15:54:14
989
1
原创 C++:运算符重载
取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,yi般这两个函数编译器自动生成的就可以够我们用了,不需要去显式实现。除非一些很特殊的场景,比如我们不想让别人取到当前类对象的地址,就可以自己实现⼀份,胡乱返回一个地址。,表明在const成员函数中不能对类的任何成员函数修改,如const修饰Date的Print,由Print(Date* const this)变为Print(const Date* const this)。const修饰成员函数,const放在成员函数参数列表后。
2025-10-03 10:32:55
1085
1
原创 C++:3个类的默认成员函数
默认成员函数即是用户没有显式实现,编译器会自动生成的成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个。
2025-09-30 11:55:45
881
1
原创 C++:类初步
由上述代码可以看到,类B、C实例化的对象大小是1字节,这是为了占位标识对象而存在,也可以发现对象确实只存储成员变量。注意:this作为函数的参数,一般认为其存在内存的栈区,但在vs中this存在于寄存器。类是对象的一种抽象描述,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员时,需要使用。对象只储存成员变量,C++中类的实例化对象符合C中结构体内存对齐规则。用类类型在物理内存中创建对象的过程,称为。
2025-09-29 09:00:00
570
1
原创 C++:入门基础语法
为解决命名冲突,C++引入了关键字namespace。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。int a=10;//变量int Add(int x,int y) //函数return x+y;struct Student //类型int score;} //不用加分号namespace只能定义在全局,可以嵌套定义。int a=1;return x+y;char ch;
2025-09-05 14:30:48
1600
1
原创 C数据结构:二叉树(上)
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。树有一个特殊的节点,称为根节点,根结点没有前驱节点。如图A节点为根节点。节点的度:一个节点含有的子树的个数,如A的度为3。叶:度为0的节点。如图J、F、K、L、H、I。父节点:含有子节点的节点。如A为B的父节点。子节点:B为A的子节点。树的高度:树中节点最大层次。
2025-08-20 18:11:42
1663
原创 C数据结构:队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,具有的特点。入队列:在队尾一端进行插入数据操作。出队列:在队头一端进行删除数据操作。
2025-08-18 09:30:00
1364
原创 C数据结构:栈
是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为,另一端称为。栈中的数据元素遵守的原则。
2025-08-14 09:30:00
1075
原创 C语言:链表经典题
给单链表的头节点head,返回反转后的链表,节点数目为[0,500]。输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]反转链表的关键就是,让第一个节点的next指针指向NULL,再让第二个节点next指针指向第一个节点,直到尾节点的next指针由指向NULL变为指向倒数第二个节点。
2025-08-13 09:45:00
1577
原创 C语言:详解双向链表
双向链表是带头双向循环链表。双向链表的节点由3个部分组成,分别是数据、指向下一节点的指针next、指向上一节点指针prev。对于单链表,指向第一个节点的指针phead为NULL时,链表为空;对于双向链表,链表只有一个头节点时,为空链表,此时phead->next指向phead,phead->prev指向phead。
2025-08-02 09:00:00
1680
原创 C语言:详解单链表与例题
链表根据带头或不带头、单向或双向、循环或不循环分类为8种,最常用的是单链表和双向链表,单链表是链表。链表由节点组成,节点分为两部分,数据和指向下一节点的指针。链表示意图如下:创建头文件SList.h,包含stdio.h、stdlib.h、assert.h,在文件中定义节点结构,声明函数打印链表、尾/头插、尾/头删、查找、定位前插入、定位后插入、删除pos节点、删除pos后节点、销毁链表。创建SList.c文件,在文件中编写函数。打印链表:定义一个指针pcur指向链表首节点,遍历并打印。
2025-07-31 09:30:00
1493
原创 C语言:顺序表(下)
在通过动态顺序表实现通讯录之前,我们仍需要上期的SeqList.h、SeqList.c文件通讯录要保存联系人的姓名、性别、年龄、电话、住址等信息,同时要编写函数实现增加联系人信息、删除指定联系人、查找指定联系人、修改指定联系人、显示联系人信息。创建头文件Contact.h,进行函数声明,将联系人结构体定义在此文件中,并重命名为peoInfo,为了名称一致,把SeqList.h文件中定义的结构体SeqList重命名为Contact。201020100。
2025-07-28 09:30:00
1535
原创 C语言:顺序表(上)
线性表是n个具有相同特性的数据元素的有限序列。、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以和的形式存储。顺序表的是数组,对数组的封装,实现了常用的增删改查等接口。顺序表分为两类:静态顺序表:使用定长数组存储元素。容易出现空间不够用、空间浪费的问题。动态顺序表:空间可以按需申请。接下来以动态顺序表为例,编程实现顺序表。
2025-07-27 20:29:05
1220
1
原创 C语言:详解文件操作
上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。
2025-07-24 09:30:00
1670
原创 C语言动态内存管理
C语言引入了动态内存开辟,程序员可以通过malloc、calloc、realloc、free来灵活地申请和释放空间。malloc函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。在上述代码中,我们通过malloc函数开辟了20个字节的空间,并返回一个指向该空间起始地址的整型指针p,用for循环访问和使用这段空间。但是,这段代码还缺少释放这段空间,而free函数能够释放开辟的空间。
2025-07-22 14:34:31
1259
原创 C语言自定义类型:联合体和枚举
像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。联合体的特点是所有成员共用同一块内存空间,编译器只为最大的成员分配足够的内存空间,所以联合体又叫“共用体”。
2025-07-21 18:04:24
1378
原创 C语言内存函数
因为参数n表示的是字节,所以如果要把arr1中的内容拷贝到arr2,就要36个字节,arr1的元素个数为len1,每个元素都是int类型,即36个字节也可表示为len1*sizeof(int)。这是src从前往后拷贝,如果src、dest都从后开始,src拷贝到dest,即5拷贝到7,4拷贝到6,3拷贝到5…所以,memset函数要慎用。例如:将arr[]={1,2,3,4,5,6,7,8,9,10}中的后3个元素拷贝到前3个元素。再例如,处理重叠,把“3,4,5,6,7”换为“1,2,3,4,5”。
2025-07-18 21:03:04
1455
原创 C语言字符函数和字符串函数
字符分类函数能判断一个字符是属于什么字符。使用这些函数需包含头文件。例如,islower函数能判断一个字母是否为小写字母,若是小写字母则返回非零整数,若不是则返回0。参数c是int类型,但也可以输入字符,会自动转为ASCII码值。示例:写⼀个代码,将字符串中的小写字母转大写,其他字符不变。其他字符分类函数都与islower相似,可以参照islower使用。
2025-07-17 16:35:01
1217
原创 C语言指针(4):qsort函数
回调函数是指通过函数指针调用的函数。定义一个返回类型为void类型的函数calc,其参数是一个函数指针。当我们想在switch语句中调用Add、Sub、Mul、Div函数时,只要把函数名作为参数输入calc函数中,即可完成调用。
2025-07-14 16:22:33
1841
原创 C语言指针(3)
整型指针变量的类型是int*类型,字符指针变量的类型即是char*,字符指针变量保存的是字符型数据的地址。我们可以设一个字符指针变量,把一个字符串赋给字符指针变量,这里本质上是把字符串首元素的地址赋给了指针变量。这里就是将字符串“abcefg”中的首元素’a’的地址存放到字符指针变量str中。同时,这里的字符串属于,它有一个特点可以从下面的代码中看出来。
2025-07-13 09:17:51
1275
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅