- 博客(30)
- 收藏
- 关注
原创 C++ map和set的使用
set底层是红黑树key 有序(默认升序)key 不重复(自动去重)迭代器遍历 =中序遍历迭代器不支持修改 key(会破坏树结构)O(logN)class set;存储key-value 键值对key 有序、唯一、不可修改value 可以修改底层红黑树,O(logN)迭代器遍历 = 中序遍历(按 key 升序)class map;
2026-04-03 23:14:17
333
原创 C++ 红黑树
且 cur 是 parent 的左孩子、parent 是 g 的左孩子(或 cur 是 parent 的右孩子、parent 是 g 的右孩子);且 cur 是 parent 的右孩子、parent 是 g 的左孩子(或 cur 是 parent 的左孩子、parent 是 g 的右孩子);:无论 cur 是 parent 的左 / 右孩子,parent 是 g 的左 / 右孩子,处理方式完全相同,:parent 是 g 的左孩子,cur 是 parent 的右孩子 → 先对 parent。
2026-04-03 15:12:18
298
原创 C++ AVL树
严格平衡:任何节点左右高度差 ≤ 1查询极快:O(log n)插入删除代价稍高:需要频繁旋转适合读多写少的场景(如数据库索引、内存缓存)
2026-03-31 21:02:12
338
原创 C++ 二叉搜索树
二叉搜索树是C++数据结构的重点,也是后续高级树形结构的基础,结合PDF思路,核心要点总结如下:概念:二叉搜索树要么是空树,要么满足“左子树≤根,右子树≥根”,左右子树也为BST;是否支持重复值,取决于使用场景。性能:最优情况(完全二叉树)时间复杂度 \(O(log _{2} N)\),最差情况(单支树)退化到 \(O(N)\),后续需学习AVL树、红黑树优化。核心操作: - 插入:按BST性质查找空位置,插入新节点,不支持重复值则返回false;- 查找:按BST性质缩小范围,最多查找树的高度次;
2026-03-26 17:33:24
364
原创 C++ 多态
必须通过基类的指针或引用调用虚函数被调用的函数必须是虚函数,且派生类完成了虚函数重写(覆盖)两个条件缺一不可!同一作用域、参数不同 →重载不同作用域、虚函数、完全相同 →重写不同作用域、不是重写、名字相同 →隐藏多态 =继承 + 虚函数 + 重写 + 基类指针 / 引用重写要求:函数名、参数、返回值相同(协变例外)析构函数建议写成虚函数,防止内存泄漏override检查重写,final禁止重写 / 继承纯虚函数用于抽象类,强制接口规范多态底层靠_vfptr + 虚表实现普通调用是。
2026-03-24 21:09:30
406
原创 C++ 继承
基类成员访问权限公有继承(public)保护继承(protected)私有继承(private)public派生类public派生类protected派生类privateprotected派生类protected派生类protected派生类privateprivate无法访问无法访问无法访问核心记住2点:① 基类private成员,无论哪种继承,子类都无法直接访问;② 实际开发中,90%以上的场景用公有继承(public),其余两种极少用。
2026-03-23 21:47:22
361
原创 C++ Stack_queue的入门使用与模板进阶
stack的介绍queue的介绍仿函数就是一个 “重载了 operator () 的类 / 结构体”,用起来像函数,但本质是对象。一个对象可以像函数一样被调用operator()deque(Double-Ended Queue,双端队列)是 C++ STL 中的一种动态线性容器支持两端快速插入 / 删除(队首和队尾),时间复杂度均为O(1);支持随机访问(像vector一样通过下标访问元素),时间复杂度O(1);内存分配更灵活,避免了vector扩容时的大规模内存拷贝;
2026-03-22 20:55:18
405
原创 C++ Lsit
list 基于双向循环链表实现,核心优势是任意位置插入 / 删除效率 O (1)、迭代器稳定性高,核心劣势是无随机访问、内存开销大;vector 基于连续数组实现,核心优势是随机访问 O (1)、缓存友好,核心劣势是中间 / 头部增删效率低、迭代器易失效;选型核心原则:需随机访问 / 遍历优先选 vector,需频繁任意位置增删优先选 list;list 使用需避坑:不支持 std::sort、注意内存碎片化、优先用 emplace 系列方法。
2026-03-19 19:38:42
388
原创 C++ String
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、 快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。
2026-03-12 15:05:56
367
原创 C/C++内存管理
1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。。3. 堆用于程序运行时动态内存分配,堆是可以上增长的。4. 数据段--存储全局数据和静态数据。5. 代码段--可执行的代码/只读常量。C语言中动态内存管理方式:malloc/calloc/realloc/free。
2026-01-27 21:52:21
425
原创 C++模板
class 类模板名// 类内成员定义// 类模版 写一个栈的模板public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误void Stack<T>::Push(const T& data)//模板声明跟定义分离的写法(在同文件内)// 扩容++_size;int main()// int型栈// double型栈return 0;
2026-01-27 21:51:37
557
原创 C++ 类和对象(中)
和其 他函数⼀样,它也具有其返回类型和参数列表以及函数体。3. 重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。
2026-01-24 15:55:56
1013
原创 C++ 类和对象(上)
C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。
2025-12-16 16:32:12
618
原创 C++入门基础
1. 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2025-12-06 21:45:29
664
原创 C语言--操作符详解
二进制转10进制:每一位2进制的位乘对应权重值再相加。10进制转2进制:一直除2,每次得出的余数依次排列,从右向左开始就是二进制数字。二进制转8进制:8进制通常以0开头,每3个二进制数组成1个8进制数。二进制转16进制:每4个二进制位组成1个16进制位,16进制表示的时候前面加0x。
2025-11-30 12:16:43
958
原创 二叉树--链式结构实现
1.非空二叉树上的叶子结点树等于度为2的结点数加1,即n0=n2+1;2.非空二叉树上第k层上最多有2^(k-1)个结点;3.高度为h的二叉树最多有2^h-1个结点;4.完全二叉树求双亲结点:偶数[i/2];奇数[(i-1)/2];5.具有n(n>0)个结点的完全二叉树的高度为[log2(n+1)]或[log2n]+1。
2025-11-21 17:36:28
947
原创 数据结构--栈和队列
概念与结构栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作 的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。现实中跟弹夹很像,先进后出。‘栈的实现⼀般可以使⽤数组或者链表实现,相对⽽⾔数组的结构实现更优⼀些。因为数组在尾上插⼊ 数据的代价⽐较⼩。
2025-11-14 11:50:07
460
原创 数据结构--时间复杂度和单链表相关习题总结
数据结构(DataStructure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如:线性表、树、图、哈希等。算法(Algorithm):就是定义良好的计算过程,他取⼀个或⼀组的值为输⼊,并产⽣出⼀个或⼀组值作为 输出。简单来说算法就是⼀系列的计算步骤,⽤来将输⼊数据转化成输出结果。算法在编写成可执⾏程序后,运⾏时需要耗费时间资源和空间(内存)资源。
2025-11-12 08:56:13
698
原创 C语言---贪吃蛇项目
贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。这次,我们将使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇。并·对我们之前所学C语言知识进行总结,其中有一部分会用到数据结构当中链表的知识点。
2025-11-09 16:42:59
1260
7
原创 C语言---编译链接
在ANSIC的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。第2种是执⾏环境,它⽤于实际执⾏代码。那翻译环境是怎么将源代码转换为可执⾏的机器指令的呢?这⾥我们就得展开开讲解⼀下翻译环境所 做的事情。其实翻译环境是由编译和链接两个⼤的过程组成的,⽽编译⼜可以分解成:预处理(有些书也叫预编 译)、编译、汇编三个过程。图示:⼀个C语⾔的项⽬中可能有多个⽂件⼀起构建,那多个⽂件如何⽣成可执⾏程序呢?• 多个。
2025-10-24 00:15:00
693
原创 C语言--文件
根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂ 本⽂件。3.
2025-10-21 16:40:07
761
6
原创 C语言浮点数在内存中存储
类型。浮点数表⽰的范围: 在中定义。输出:为什么不是全是9.0呢?说明整数跟浮点数在内存中的存储方式是不一样的。为了解开这道题,我们先来了解浮点数的存储。
2025-10-17 21:34:08
621
7
原创 C语言结构体
⽽对⻬的内存访问仅需要⼀次访问。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下降。4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃 剩余的位还是利⽤,这是不确定的。3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。
2025-10-14 16:05:46
962
1
原创 C语言中的内存函数
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。(也就是上面说的“复制的结果都是未定义的”),所以使用时尽量不要出现内存重叠的情况。• 如果source和destination有任何的重叠,复制的结果都是未定义的。• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。memset是⽤来设置内存的,将内存中的值。返回值是目标函数(ptr)的地址。
2025-10-05 11:39:04
365
3
原创 C语言:指针
指针的核心要点回顾概念说明示例基本指针存储变量地址的变量指针运算对指针进行加减操作p++;p--;数组与指针数组名可视为常量指针int arr[5];函数指针指向函数的指针多级指针指向指针的指针int **pp;动态内存运行时分配内存结构体指针指向结构体的指针推荐大家多练习题目以巩固理解。
2025-09-24 10:59:10
786
5
原创 用C做一款简易版扫雷
如果我们排查(9,7)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三 个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。我们以X,Y来表示我们选中的坐标,把除了自己外(X,Y)附近的坐标全部加起来:(X-1,Y+1)+(X-1,Y)+(X-1,Y-1)+(X,Y-1)+(X,Y+1)+(X+1,Y-1)+(X+1,Y)+(X+1,Y+1),再减去8个字符‘0’。
2025-09-08 16:07:14
856
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅