- 博客(67)
- 收藏
- 关注
原创 C++进阶——封装哈希表实现unordered_map/set
与红黑树封装map/set基本相似,只是unordered_map/set是单向迭代器,模板多传一个HashFunc。
2025-03-29 12:03:06
950
43
原创 C++进阶——哈希表的实现
乘法散列法对哈希表大小 M 是没有要求的,假设 M 为 1024,key 为 1234,A = 0.6180339887,A * key = 762.6539420558,取小数部分为 0.6539420558,M × ((A × key) % 1.0) = 0.6539420558 * 1024 = 669.6366651392,那么 h(1234) = 669。假设 P=17,M=6,a=3,b=4,则 h_34(8) = ((3 × 8 + 4) % 17) % 6 = 5。
2025-03-25 22:28:21
852
37
原创 C++进阶——封装红黑树实现map和set
(整个子树已经访问完了,如果这个子树是外面的右子树,那么外面一层的子树也访问完了,直到子树是外面子树的左子树,左子树访问完了,访问中),就访问,2. 源码中的pair的<比较,比较了key和value,但是。MySet是为了兼容MyMap,所以也要实现。),相当于外层左边的子树访问完了,然后访问中。然后更新迭代器中的节点指针,返回*this。修改RBtree中的insert返回值为。,在右子树中进行,左中右,访问。1. 这里相比源码调整一下,当左为空,表示左访问完了,就是走右中左,基本相同。
2025-03-22 16:48:26
1058
27
原创 C++进阶——红黑树的实现
红黑树是一种自平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对从根节点到叶子节点的路径上的节点颜色进行约束,红黑树确保没有一条路径会比其他路径长出两倍,因此它是近似平衡的。
2025-03-20 18:31:55
664
32
原创 C++进阶——AVL树的实现
AVL 树是一种自平衡二叉搜索树,满足以下性质:它是一棵空树,或者:它的左右子树都是 AVL 树。左右子树的高度差(平衡因子)的绝对值 <= 1。
2025-03-17 21:36:14
934
19
原创 C++进阶——map和set的使用
1. set的声明如下,T就是set底层关键字key的类型。2.set默认要求key支持小于比较(升序),如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数。3. set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参 数。4. 一般情况下,我们都不需要传后两个模版参数。5.set底层是用红黑树实现,增删查效率是O(logN)。迭代器遍历走的是搜索树的中序,所以是有序。
2025-03-15 23:37:53
934
2
原创 C++进阶——二叉树OJ题
因为递归空间上使用的是栈,所以,我也用数据结构的栈(satck)模拟。因为递归空间上使用的是栈,所以,我也用数据结构的栈(satck)模拟。因为递归空间上使用的是栈,所以,我也用数据结构的栈(satck)模拟。:然后转向当前节点的右子树,重复同样的过程。(所以nullptr不允许插入)。(所以nullptr不允许插入)。(所以nullptr不允许插入)。2. 如何获取path?二叉树的层序遍历,一般使用。,那么就是最近的公共祖先,,找到了,就直接返回了。后序,左右中,如果先访问。,将其值加入结果中。
2025-03-14 11:49:55
1001
1
原创 C++进阶——二叉搜索树
在我写BinarySearchTree的拷贝构造时,发现为什么,_root明明是私有的。这种设计是为了支持类的封装性和实现细节的隐藏,同时。例如:拷贝构造函数需要访问被拷贝对象的内部状态。赋值运算符需要访问右操作数的内部状态。比较运算符可能需要访问两个对象的内部状态。
2025-03-09 17:58:25
659
2
原创 C++进阶——多态
1. 必须是基类的指针 或引用调用虚函数,因为只有基类的指针或引用才能既指向基类对象又指向派生类对象。2.被调用的函数必须是虚函数,一般要完成虚函数重写/覆盖,因为重写或者覆盖了,基类和派生类之间才能有不同的函数,多态的不同形态效果才能达到。注意:派生类没有完成虚函数的重写,那么多态性仍然可以工作,但仅限于使用基类的实现。public:// show 函数没有被重写// 调用 Base::showreturn 0;
2025-03-07 12:25:32
716
1
原创 C++进阶——继承
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。没有继承之前public:// ...// ...protected:int _stuid;public:// ...//...protected:string _name = "张三";
2025-03-04 20:24:02
687
1
原创 C++初阶——模板进阶
【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2.增强了代码的灵活性。【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长。2. 出现模板编译错误时,错误信息非常凌乱不易定位错误。
2025-02-26 20:56:37
490
1
原创 C++初阶——简单实现stack和queue
stack,queue,priority_queue是(container adaptor) ,封装一个容器,按照某种规则使用,一般不实现迭代器。
2025-02-25 17:10:46
782
1
原创 C++初阶——简单实现list
1. 简单实现std::list,重点:迭代器,模板类,运算符重载。2. 并不是,所有的类,都需要深拷贝,像迭代器类模板,只是用别的类的资源,不需要深拷贝。3. 高度相似 -> 模板。4.迭代器的种类按功能按结构(性质决定可以使用什么算法单向(Forward)双向(Bidirectional)随机(Random Access)
2025-02-23 20:01:43
351
1
原创 C++初阶——简单实现vector
简单实现std::vector类模板。相较于前面的string,vector要注意深拷贝,因为vector的元素可能是类类型,类类型元素可以通过赋值重载自己实现深拷贝。迭代器失效,其实无非是两种(现在认为):1. 迭代器更新了,但是认为用的是之前的迭代器,可以先保存值。2. 迭代器没有更新,但是认为是用更新后的迭代器,那就更新迭代器。
2025-02-20 20:30:11
417
1
原创 存储过程和触发器
存储过程是一组在数据库系统中为了完成特定功能的T-SQL语句的集合,经编译后独立存储在数据库中。当需要其功能时,只需要通过存储过程名并给出参数(如果存储过程有参数的情况)调用即可,且存储过程只在首次执行时进行编译,而不需要每次执行时重新编译,所以比单个T-SQL语句块的运行速度快。存储过程是SQL Server中一个非常有用的工具。SQL Server支持存储过程和系统过程。存储过程是独立存在于表之外的数据对象。可以由客户调用,也可以从另一个过程或触发器调用参数可以被传递和返回出错代码也可以被检验到。
2025-01-14 18:16:52
789
2
原创 T-SQL编程
目录1、T-SQL的元素1.1 标识符1. 常规标识符2. 分隔标识符1.2 变量1. 全局变量2. 局部变量1.3 运算符1. 算数运算符2. 赋值运算符3. 位运算符4. 比较运算符5. 逻辑运算符6. 字符串连接运算符7. 一元运算符8. 运算符的优先级和结合性1.4 批处理1.5 注释2、流程控制语句2.1 BEGIN…AND2.2 IF…ELSE2.3 CASE2.4 WHILE…CONTINUE…BREA
2025-01-13 17:23:27
1105
1
原创 视图和索引
视图所对应的数据不是以视图结构存储在数据库中,而是存储在视图所引用的表中。可以通过视图修改基本表。索引包含由表或视图中的一列或多列生成的键,这些键存储在一个B树中,使用索引可以快速、高效地查找与键值关联的行。
2024-12-31 21:13:15
1238
6
原创 SELECT的使用
接下来查询,我们用,在teaching数据库里的,三张表:student(sno(主码),sname,gender,sage,specialty(专业),grade(年级)),course(cno(主码),cname,credit),sc(sno(外码),cno(外码),score),(sno,cno)为主码。
2024-12-29 23:58:25
1040
3
原创 表
目录1、常用系统数据类型1. int或integer2. tinyint3. decimal[(p[,s])]或numeric[(p[,s])]4. char(n)5. varchar(n|max)6. datetime2、T-SQL创建表3、T-SQL修改表4、T-SQL表数据的操作4.1 插入数据4.2 修改数据4.3 删除数据四字节,-2^31~2^31-1的整数。1字节,0~255的整数。p:最多可以存储的十进制数字的总位数,1~38,默认18。s:小数点后面可以存储的十进制数字的最大位数,默认0。
2024-12-28 20:33:47
1007
2
原创 关系数据库
1.关系是从笛卡尔积中取出有实际意义的元组来构造的。关系是笛卡尔积的子集。2.关系中的每个元素是关系中的元组,通常用t表示。关系是元组的集合。3.n个属性称为关系的n目(度)n元关系,其元组为n元组。对于X的每一个值,都有Y唯一的具体的值与之对应,称X决定Y,或者Y依赖X,记作X→Y。
2024-12-27 14:49:11
1095
2
原创 数据库概论
DBMS提供数据定义语言(data definition language,DDL定义数据库的结构createalterdrop对于这些关键字不区分大小写。
2024-12-26 16:29:40
1323
2
原创 C++初阶——模板初阶
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演, 将T确定为double类型,然后产生一份专门处理double类型的代码,对于整型、字符类型也是如此。那能否告诉编译器一个模板,让编译器根据不同的类型利用该模板来生成代码呢。2、为什么模板的形参类型,好像都是const T& x,因为。,只要有新类型出现时,就需要用户自己增加对应的函数。好像typedef也可以达到类模板的效果,但是,的通用代码,是代码复用的一种手段。是内置类型无所谓,若是自定义类型,,对于函数模板的使用,
2024-12-07 17:14:23
562
5
原创 C++初阶——动态内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间//还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;1、在申请自定义类型的空间时,
2024-12-01 17:06:57
1319
4
原创 C++初阶——类和对象(下)
目录1、再探构造函数——初始化列表2、类型转换3、static成员4、友元5、内部类6、匿名对象7、对象拷贝时编译器的优化(了解)1. 构造函数初始化除了使用函数体内赋值,还有一种方式——初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个(初始值或表达式)。2. 每个成员变量在都要走初始化列表,并且在初始化列表中只能出现一次。3. C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的。4. C++规
2024-11-23 12:14:32
974
4
原创 C++初阶——类和对象(上)
•class为定义类的关键字Stack为类的名字{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。•为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量 前面或者后面加_ 或者m_ 开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。•C++中struct也可以定义类C++兼容C中struct的用法,同时struct升级成了类,明显的变化是 struct中可以定义函数,一般。
2024-11-02 22:08:42
1101
2
原创 Linux的环境搭建
linux操作系统为部分汇编 + C语言编写的操作系统源代码公开(开源),官网为一般使用老版本(大部分的bug已经知道怎么解决)因为使用的用户不同,衍生出不同的商业版本,如:ubuntu,kail,centos等认识linux的内核版本名称,如:3.10.0-1160.119.1.el7.x86_64linux的应用场景服务器领域,桌面领域,移动嵌入式领域,云计算/大数据领域。
2024-10-27 11:32:16
409
3
原创 C++初阶——入门
• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义 变量 / 函数 / 类型 等。• namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。• C++中域有 函数局部域,全局域,命名空间域,类域。域影响的是编译时语法查找一个 变量 / 函数 / 类型 出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。
2024-10-19 16:02:16
1069
3
原创 常见排序详解(历时四天,哭了,必须释放一下)
目录1、插入排序1.1 基本思想1.2 直接插入排序1.2.1 思路1.2.2 代码实现1.2.3 性质1.3 希尔排序1.3.1 思路1.3.2 代码实践1.3.3 性质2、选择排序2.1 基本思想2.2 直接选择排序2.2.1 思路2.2.2 代码实践2.2.3 性质2.3 堆排序2.3.1 思路2.3.2 代码实践2.3.3 性质3、交换排序3.1 基本思想3.2 冒泡排序3.2.1 思路3.2.2 代码实践3.2.3 性质3.3 快速排序3.3.1 思路3.3.2 代码实践3.3.2.1 hoare
2024-10-06 17:44:13
1089
2
原创 数据结构——二叉树
由于现在对二叉树结构掌握还不够深入,为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,待二叉树结构了解的差不多时,再回来研究二叉树真正的创建方式。队列为空(节点都free了),不需要destroy,只有节点开了堆上的空间,Queue q是开在栈上的空间。普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。pop,是pop链式队列的一个节点(里面存的是指向二叉树节点的指针)
2024-09-22 16:34:19
1269
6
原创 经典栈和队列OJ题
栈顶元素,把非空队列的元素转移到空队列,当非空队列只有一个元素时,跳出循环,保存栈顶元素,pop掉栈顶元素。实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(将左括号存入栈中,后进入的左括号先出来,与右括号进行匹配。(当pop没有元素时,push的全部元素转移到pop),队列应当支持一般队列支持的所有操作(栈顶元素,调用非空队列的queueback(),pop的栈顶元素就是队头元素(因为已逆置),判断字符串是否有效。
2024-09-08 17:31:22
481
3
原创 栈和队列
规范,不容易出错,如:stack.arr[top],不一定是栈顶元素,因为不知道top是哪种指向。LIFO(Last In First Out)的原则。1.1 n个元素 依次进栈出栈的情况有多少种?栈的插入操作叫做进栈/压栈/入栈,栈的删除操作叫做出栈。栈的实现一般可以使用。两种指向没什么区别,
2024-09-02 20:49:04
561
6
原创 C语言 动态内存管理
C/C++程序内存分配的几个区域:1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时 这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
2024-07-24 23:18:56
771
3
Python程序设计练习题突击
2024-07-03
Python程序设计知识点突击
2024-06-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人