- 博客(21)
- 收藏
- 关注
原创 C++之set和map的运用
map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实现,增删查改效率是 O(logN) ,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的。map底层的红⿊树节点中的数据,使⽤pair<Key, T>存储键值对数据。T1 first;T2 second;{}
2025-05-08 20:01:57
609
原创 C++之红黑树
分析:因为p和u都是红⾊,g是⿊⾊,把p和u变⿊,左边⼦树路径各增加⼀个⿊⾊结点,g再变红,相当于保持g所在⼦树的⿊⾊结点的数量不变,同时解决了c和p连续红⾊结点的问题,需要继续往上更新是因为,g是红⾊,如果g的⽗亲还是红⾊,那么就还需要继续处理;c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。他这⾥所指的叶⼦结点不是传统的意义上的叶⼦结点,⽽是我们说的。
2025-04-20 19:31:58
853
原创 C++之AVL树
在前面学习的二叉搜索树中,我们了解到二叉搜索树节点的成员有数据和它的左右孩子,但今天我们学习到的AVL树不仅有二叉搜索树的成员,还多了两个成员——parent(节点的父亲)和平衡因子。int _bf;//平衡因子:_kv(kv),_bf(0){}
2025-04-16 20:13:46
1097
原创 C++之二叉搜索树
定义一个二叉树节点类,包含节点的值、左子节点指针和右子节点指针。T _data;//初始化节点,定义成有参的,后面新增节点需要调用。
2025-04-14 21:40:53
899
原创 c++的特性——多态
1.基类对象的虚函数表中存放基类所有虚函数的地址。同类型的对象共用一张虚表,不同对象各自有独立的虚表。2.派生类由两部分组成,继承下来的基类和自己的成员,一般情况下,继承下来的基类中有虚函数表指针,自己就不会在生成虚函数表指针。但是继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同一个。3.派生类中重写的基类的虚函数,派生类的虚函数表中对应的虚函数就会被覆盖成派生类重写的虚函数地址。
2025-03-30 20:43:52
820
1
原创 C++之继承
C++有三大特性,分别是封装,继承,多态。在前面的学习中我们已经学习了封装(其实就是把数据(属性)和操作数据的方法(行为)绑定在一起,形成一个独立的对象(类))。今天我们就开始学习C++的另一个特性——继承。
2025-03-24 08:00:00
666
原创 C++之模板进阶
我们常说头文件里面放声明,源文件中放定义。在string类模拟的时候,我们确实发现string类头文件中放声明,而源文件中放定义。但在学习了list类和vector类的模拟实现的时候,我们发现全部内容都放在了一个文件中,而且它们有共同点——都用了类模板。那么到底类模板有什么特别的地方呢?下面我们开始学习今天的内容,在文章中找到答案。一个程序包含若干个源文件,而每个源文件单独编译生成目标文件,最后经过链接把所有目标文件连接起来形成一个单一的可执行文件的过程。
2025-03-21 16:51:45
736
原创 C++之list类及模拟实现
(1)list类其实就是链表,但是它是双向链表。在数据结构中我们了解过双向链表的特点。下面我们回忆一下。1.节点中具有两个指针。一个指针指向该节点的前一个节点,另一个指针指向该节点的下一个节点。2.存在哨兵位。初始化的时候节点里的下一个节点和上一个节点都指向自己。(2)STL中list的底层结构我们先定义双向链表的节点并初始化。T _data;, _data(x)vectorlist底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问。
2025-03-17 20:13:57
826
原创 stack/queue/priority_queue类
1.在数据结构中我们学习过stack(栈),我们知道栈的特点是先进后出的。2.该底层容器至少支持以下操作:push :入栈pop:出栈empty:检测栈是否为空size:返回队列中有效个数top:返回栈顶元素3.STL标准库中stack的底层结构1.在数据结构中我们了解了queue(队列)的特点是先进先出(即在队尾入数据在队头出数据)。2.该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用。
2025-03-14 21:44:14
1007
原创 vector类及模拟实现
是 C++ STL 中最常用的容器之一,而使用STL的三个境界:第一境界是熟用,第二境界是了解泛型技术的内涵与STL的学理乃至实作,第三境界是能扩展STL。那么接下来我们学习vector也需要按照这种方法学习。
2025-03-10 20:12:35
864
1
原创 程序内存管理知多少
new:1.调用operator new函数申请空间2.在申请的空间上调用构造函数delete:1.在空间上执行析构函数,清理对象中的资源。2.调用operator delete函数释放对象空间。new[N]:1.调用operator new[]函数,在operator new[]中实际调用operator new函数实行对N个对象申请空间。2.调用N次构造函数。delete[N]:1.在空间上调用N次析构函数,清理N个对象中的资源。
2025-02-24 15:18:49
1019
原创 类与对象(下)
无论是否写初始化列表,每个构造函数都存在初始化列表。无论是否在初始化列表显示初始化(还没开空间),每个成员变量都要走初始化列表。
2024-12-01 10:00:00
1932
原创 类和成员(中)
如果没有拷贝构造函数,编译器只会值拷贝/浅拷贝,不会进行深拷贝,但是代码中的st1、st都指向同一块空间,当st中尾删了两位时,top=3,但是st1的top还指向之前被尾删掉的5的位置,而且在后面对象st、对象st1调用析构的时候会调用两次,由于重复释放一块内存空间,程序就会崩溃。7.重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,无法很好区分,C++规定,后置++重载时,增加一个int形参,跟前置++构成函数重载,方便区分。但是三个函数有且只有一个存在,不能同时存在。
2024-11-24 21:26:59
1045
1
原创 c++类和对象(上)
1.class为定义类的关键字,注意类定义结束是后面的分号不可省略。class Stack//Stak为类的名字,{}内为类的主体public:void Init(int n = 4)//类中的函数称为类的方法或者成员函数exit(1);top = 0;//类中的变量称为类的属性或成员变量size_t top;st.Init();2.为了区分成员变量,一般习惯上成员变量会加一个特殊标识。
2024-11-18 19:47:25
982
1
原创 C++入门基础知识
要使上面的代码运行成功就要使用到namespace关键字。由上面的代码可以看出(1.namespace的用法:namespace+命名空间的名字,然后再接一对{}即可,{}中即为命名空间中的成员。命名空间中可以定义变量/函数/类型等。(2.namespace本质是定义出另一个域,这个域跟全局变量各自独立,不同的域可以定义同名变量,所以上面代码中rand不冲突了。(3.C++中的域有函数局部域,全局域,空间命名域,类域;
2024-11-16 22:01:35
693
1
原创 【数据结构】顺序表
1.顺序表的底层结构是数组。2.顺序表是线性表(具有相同特性的数据结构的集合)的一种,物理结构并不一定连续,逻辑结构一定连续。
2024-11-02 13:29:06
356
1
原创 用C语言写扫雷,你学会了吗?
(1)遇到雷,游戏结束。(2)剩余没点的格数等于雷的个数,游戏通过。(3)点到不是雷的格子,格子会显示附近(周围八个格子)雷的个数。1.假设弄个9x9且有十个雷的扫雷游戏。2.初始化棋盘(InitBoard)。我们需要建立两个数组:一个棋盘来展示(‘*’),另一个来用来埋雷(‘0’)。注:两个数组不是9x9,而是11x11。3.打印棋盘(DisplayBoard)。运用for循环。为了更好打出准确的坐标,我们可以美化一下棋盘,在棋盘周围加上数字。4.埋雷(SetMine)。
2024-08-01 08:39:23
549
1
原创 关于结构体
(2)其他成员变量要对齐到对齐数(编译器默认的一个对齐数与该成员变量大小的量的最小值)的整数倍,注:vs中对齐数是八,而gcc没有。对于编译器中默认的对齐数是可以被修改的,需要运用#pragma pack(修改后的对齐数)(4)嵌套的结构成员对齐到自己成员中最大对齐数的整数倍。规则:(1)第一个成员对齐偏移量为0的地址处;(3)结构体总大小为最大对齐数的整数倍。1.结构体的创建和初始化。
2024-06-06 22:36:42
280
2
原创 指针的运用
(6)函数指针数组(数组中元素的类型相同,即函数的返回值和函数的参数类型相同),例如int(*pf[4])(int ,int )={add,sub ,mul,div}即pf数组指针中包含四个函数指针。2.void(*single(int ,void(* )(int )))(int)//该式子为single函数的声明,它的参数类型有int ,函数指针类型,返回类型为函数指针类型。(1.书写方式:类型+(*函数指针)(形参 ,形参),例如int (*p)(int ,int )=&add。
2024-05-26 20:39:24
1165
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人