- 博客(37)
- 收藏
- 关注
原创 C++11详解 (右值引用、可变参数模板、emplace_back、lambda表达式、function、bind)
右值引用、move、完美转发(forward)、可变参数模板、emplace_back、lambda表达式、function、bind
2024-08-26 23:17:45 859 2
原创 【STL】哈希表(概念讲解、底层实现、unordered_map/set封装)
首先我们需要明白的是,哈希是一种思想正常情况下,我们在面对一些算法题的时候,如果数据范围较小,比如英文26个字母小写,这种情况下我们就可以直接开一个简单数据,让每一个字母代表一个位置,这叫做映射而我们的哈希表,是一种数据结构,是用来处理那些数据范围很大但是数据量不一定大的情况假设我们存了一组数:1,331,200000,630我们能看到,这只有四个数,但是范围却是1~2000000,所以我们就会用到哈希表。
2024-08-22 00:30:51 1074
原创 【STL】红黑树(插入、删除底层实现)
首先我们来聊一聊红黑树是什么在之前的学习中,我们了解到了二叉搜索树,AVL树二叉搜索树的特性是左子树 < 根 < 右子树,但是二叉搜索树也有缺点,就是如果处在极端情况下,那么二叉搜索树的效率就和链表差不多为了解决这个问题,我们学习了AVL树,这棵树是通过旋转来控制树的高度,以此来达到绝对平衡的目的,也就是任何一棵子树,左右高度差都不会超过1但是这也伴随着一个问题就是,如果我们每一次插入,都判断、旋转,这样子的效率固然是高,但是有没有更好的办法,让其在保持高度平衡的同时,尽量减少旋转的次数。
2024-08-18 00:11:39 1047
原创 【STL】AVL树(插入、删除逻辑,旋转的引入)
我们在前面的学习中会知道,二叉搜索树有一个弊端,就是可能会一直插入在一条线上,如下:当我们遇到这种情况的时候,其实就和链表差不多了,效率就会从logN变成O(N)换句话说就是,100万个数据从搜索20次变成100万次所以就有了AVL树,这个树有一个规定就是:左右节点的高度差不超过1如上,这就是一棵AVL树,我们看到节点3,左子树高度为1,右子树为2,高度差为1我们看到节点8,左子树高3,右子树为2,高度差为1并且,AVL树我们可以理解成是一棵增加了AVL特性的二叉搜索树。
2024-08-14 00:57:48 914
原创 【STL】二叉搜索树 BSTree(底层讲解 + key_value(KV)的引入)
二叉搜索树和普通二叉树的区别就在于:二叉搜索树规定:左子树必须比根小,右子树比如比根大(如果相等就不插入该数据)中序遍历二叉搜索树是从小到大的有序序列(中序就是左、根、右子树,刚好左<根<右,所以中序就是从小到大)可以用于去重,因为相同的数据并不会重复插入用来查找数据效率很高(一般情况下)如上是一棵典型的二叉搜索树如果我们要给二叉搜索树起名的话,我们需要注意一个点,二叉的英文是binary,搜索是search我们叫二叉搜索就是BS,叫搜索二叉就是。。
2024-08-12 18:48:13 746 3
原创 【C++】面向对象三大特性之—— 多态(从底层带你理解多态)
多态的学习,对继承的掌握有着一定要求,特别是切割赋值,继承后默认成员函数中的析构函数的相关问题如果有想复习或者学习一下继承相关知识点的友友,可以看一看下面的这篇继承博客╰(*°▽°*)╯【C++】面向对象三大特性之—— 继承 | 详解现实世界中有很多例子都属于多态的范畴比如,小猫叫是喵喵、小狗叫是汪汪;再比如备胎给女生发消息,和男神给女生发消息,结果是不一样的所以我们由此可以引出多态的概念:多态就是不同的对象,做同一件事,结果不同你看猫和狗,都是叫,一个是喵喵,一个是汪汪,结果不同。
2024-08-11 17:03:48 1072 6
原创 【C++】面向对象三大特性之—— 继承 | 详解
到这里,我们有关继承的相关内容就讲完啦~( ̄▽ ̄)~*如果觉得对你有帮助的话,希望可以多多支持博主喔(○` 3′○)
2024-08-10 18:33:03 1176 16
原创 【C++】模板(相关知识点讲解 + STL底层涉及的模板应用)
如上这就是我们的函数模板,我们写的模板参数T在函数里面可以直接当成类型去传到时候我们传了什么参数给编译器,编译器就将T实例化成什么但是这时我们会遇到一个问题,如果我模板参数只写了一个T按理来说,我们传的应该就是两个一样的对象是吧但是这时我就不,我就要传两个不一样的,我传一个int,一个double,那在编译器看来,就不知道你这个T想变成什么了int main()return 0;到这里,我们这篇博客就结束啦!~( ̄▽ ̄)~*如果感觉对你有帮助的话,希望可以多多支持博主喔!
2024-08-09 18:53:55 884 1
原创 【C++】STL | priority_queue 堆(优先级队列)详解(使用+底层实现)、仿函数的引入、容器适配器的使用
本篇博客主要讲解的重点在于仿函数和容器适配器如果有希望了解堆是什么东西的,可以看一下下方链接的博客,里面对堆的相关知识讲解非常详细,当然下文也会进行相关的讲解堆-时间复杂度讲解-topk问题而堆的函数使用并不困难,如下:也就不到10个函数,我们在下文都有所讲解堆是一个树状结构,如果是小堆的话,其遵循的规则就是父节点 < 子节点,如下:如果是大堆的话,那么就是父节点 > 子节点而我们的堆其实是存储在一个数组上的,我们找一个节点的父节点或子节点都遵循着一定的数学规律。
2024-08-08 17:29:54 684
原创 【STL】| C++ 栈和队列(详解、deque(双端队列)介绍、容器适配器的初步引入)
今天我们要讲解的结构是栈和队列这两个的具体实现相比于前面我们学的string、vector、list都要简单得多(因为容器适配器的引入)如果有需要了解这两个数据结构的具体函数用法的话,也可以在较为官方的网站上进行查阅,如下kw=stack栈符合的原理是后进先出,图示如下:栈最常用的就是入栈、出栈,如果要将全部数据取出来的话,就写一个while循环判断栈是否为空(empty),然后挨个取 top(),出栈s1.push(1);s1.push(2);s1.push(3);s1.push(4)
2024-08-08 00:15:11 820 3
原创 【C++】STL | list (链表)详解及重要函数的实现
相比于vector和string,list这个迭代器可就开始上强度了其主要的强度在于:vector和string都是开辟的一段连续的空间,所以这两个的迭代器用原生指针就可以实现但是list不一样,list的空间是分散的,只有通过每个节点里的next指针才能找到下一个节点,还有就是实现const迭代器于普通迭代器两个版本的时候,需要在模板参数上动点手脚,这也是一个相对晦涩的地方kw=list到这里我们的list底层实现相关内容就结束啦(~ ̄▽ ̄)~
2024-08-07 18:38:58 1681 4
原创 【C++】STL | vector (顺序表)详解及重要函数的实现
vector在STL中属于较为简单的知识点,学习难度相对较低,但是相比于string,本篇博客的底层实现会添加一些很有意思且很实用的东西,比如:initializer_list、一段迭代器区间初始化等等kw=vector本篇文章关于vector的讲解到这里就结束啦(~ ̄▽ ̄)~如果觉得对你有帮助的话,希望能多多关注喔(○` 3′○)
2024-08-06 17:42:22 1063 4
原创 【C++】STL | string 详解及重要函数的实现
string的实现较为简单,属于奖励课的知识点,但是string的知识点比较冗余,没有后面STL的其他结构那样简洁,很多是日常中不会用到的,所以我们今天就实现一些日常中特别常见且重要的kw=string这篇文章到这里,就结束啦 ╰(*°▽°*)╯如果觉得对你有帮助的话,希望可以多多支持作者喔(〃 ̄︶ ̄)人( ̄︶ ̄〃)
2024-08-05 23:15:32 775 2
原创 C++ | 动态内存管理 new、delete (用法、底层)详解
我们先来写一个类,在该类的构造函数和析构函数里面分别打印一些内容方便我们检查结果struct AA()~A()int main()delete a1;return 0;我们可以看到,当我们使用了new来开辟一块A类型的空间的时候,他会在开辟空间的同时,还会调用对应的构造函数如果是开辟了一段空间比如10个的话,就会连续调用10次构造函数并开辟对应大小的空间而我们的delete就相反,他会调用对应的析构,如果是连续的就连续调用多次析构并销毁相应空间。
2024-08-03 21:59:12 1093 2
原创 C++ | 类和对象(下)(static成员、友元、内部类、匿名对象)
static成员在类里面是非常独特的,因为这个成员并不存在于类里面,就像是函数一样class Apublic:int _a;return 0;我们能看到,这段程序的目的就是看这个类的大小,我们的类里面有一个普通的int成员和一个static成员,但是结果为 4,这说明static成员是不存在于类中的因为是static成员,所以是不能在构造函数中进行初始化的那我们可以按如下方式赋值吗?
2024-08-03 16:02:54 653 4
原创 C++ | Date 日期类详解
日期类Date实现的本质就是运算符重载和赋值运算符重载我们要实现自定义类型像内置类型一样相加减,肯定会用到operator关键字+操作符比较类,如、
2024-05-03 16:37:40 1375 5
原创 C++ | 类和对象(中) (构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载 | 取地址 | const取地址)
构造函数、析构函数、拷贝构造函数、赋值运算符重载、取地址、const取地址
2024-05-01 23:42:29 1341
原创 从C语言到C++过渡篇(快速入门C++)
C语言->C++的过渡(快速入门C++)命名空间、C++输入与输出(cout && cin)、缺省参数、函数重载引用、内联函数、auto 关键字、区别于C语言的空指针(nullptr)
2024-04-27 00:43:41 916
原创 常见七大排序(汇总)
快速排序(快排)(递归&非递归) 、 归并排序(递归&非递归) 、 希尔排序 、 堆排序 、 直接插入排序 、 选择排序 、冒泡排序 汇总
2024-04-24 20:47:51 643
原创 数据结构——二叉树链式结构(递归实现)
二叉树的遍历分为前序 —— 根 左子树 右子树中序 —— 左子树 根 右子树后序 —— 右子树 左子树 根层序 —— 一层一层往下遍历我们在看二叉树时应该这样看:如下这是一棵二叉树最上面的节点是根,下面是两大棵树,左节点以下的是左子树,右边的则是右子树接下来假设我们先遍历左,那么我们就该这么看:这一个整个左子树里面接着分成——根、左子树、右子树再往下分:根、左子树、右子树。
2024-03-20 01:29:22 1041 1
原创 数据结构——树(二叉树)的基础知识 & 堆 & 堆排序 & 时间复杂度讲解 & topk问题(详解)
由于堆的本质是满二叉树,且堆实现的底层结构也和二叉树有关,所以在这里我们需要先介绍一下树的相关知识如上是一棵树之所以叫做树,是因为他看起来像是一棵倒挂的树,根朝上,叶子朝下,如上,我们的 1 号节点就是这棵树的根,而 2、3、4 号都是 1 的子树但是有一个点需要注意:子树之间是不能相连的,或者说是不能成环的,如下:这样就不是一棵树了,因为子树之间相连了如上,这也不是一棵树每个节点的度不大于 2 的树,就是二叉树。
2024-03-14 00:01:13 951
原创 数据结构——栈和队列(详解)
栈,一种仅允许在一端进,一端出的结构如上图所示,进数据和出数据的一端叫做栈顶,而相反的一段则叫做栈底数据从栈顶入,从栈顶出我们可以以吃货的视角打开栈:栈就像一个肉串,串肉要从尖的一段串进去,同时也是从尖的一端被吃掉我们还能发现,先被串进去的肉,会最后被吃掉栈也是如此,符合FILO原则,FILO就是 first in last out,翻译过来就是先进后出就像我们日常生活中的排队一样,队列就是从一端进,从另一端出。
2024-03-09 20:38:00 923 2
原创 初阶数据结构——链表专题——单链表详解
我们设想一个场景:假如现在有一排连在一起的房间,而我们现在在第一个房间里,每个房间都有一扇通往下一个房间的门,但是上了锁,每个锁都不一样,如下:问:我们如何从第一间房间走到最后一间房间呢?答:在每一间房间里都放上通往下一间房间的钥匙就可以了链表的核心原理就是如此我们的链表里面不仅存着其应该带的数值,还存放着指向下一个节点的地址,地址连着地址,就像一根链子一样把数据都串起来,所以才叫链表至此,我们单链表的相关知识就讲完啦!!接下来为各位带来的是双链表的相关知识。
2024-03-01 12:17:28 947 1
原创 初阶数据结构——通讯录项目(顺序表的应用)
/通讯录数据类型int age;}Info;我们的通讯录包含了 姓名,年龄,性别,电话号码,地址因为每次都写 struct PersonInfo 会很麻烦,所以我们就用 typedef 对该结构体进行了重命名——Info,后续要引用该结构体时,我们只需要写 Info 就可以了至此,我们的通讯录实现,就讲完啦如果觉得对你有帮助的,希望可以多多支持喔!!!
2024-02-28 16:14:17 1198 1
原创 初阶数据结构——顺序表(详解)
数据结构,就是数据和结构我们平常看到的各种页面,每个人的身份信息等等,这些都是数据而结构,就是我们用不同的方式管理数据,看个例子:我们看到百度热搜部分,数据以 1、2、3、4、5 的方式被管理了起来,这是一种结构再比如我们去饭店吃饭,我们有时可能需要拿号等位置,因为饭店需要以这种方式管理顾客,才能防止场面过于混乱,这也是一种结构而我们的数据在我们的电脑里也需要被管理起来,所以才有了数据结构至此,我们初阶数据结构里,顺序表的相关知识就讲完啦接下来会给大家带来顺序表的应用——通讯录的相关讲解。
2024-02-26 23:48:19 1332 2
原创 C语言——动态内存管理
C语言还提供了另一种开辟内存空间的函数——calloc参数 1 是需开辟的元素个数参数 2 是每个元素的大小(如:int 的大小是4个字节)if (!p)return 1;realloc的出现,使得动态内存管理变得更加灵活当我们用malloc或calloc开辟的空间用完了时,我们就可以使用realloc函数对空间进行扩容参数 1 是指向要扩容空间的指针参数 2 是扩容之后新的空间的总大小如果申请失败,那么realloc函数会返回一个空指针(NULL)
2024-02-22 22:21:38 1015 1
原创 C语言——贪吃蛇(详解)
背景音乐播放贪吃蛇地图的打印吃食物边长贪吃蛇的移动计算得分撞墙与撞自身结束游戏并打开原神相关网站贪吃蛇的加速减速暂停游戏Win32 API 中有许多函数,我们今天将会学习里面的几种函数以帮助我们实现贪吃蛇小游戏//蛇身结点的定义int x;int y;到这里,我们的贪吃蛇就完结,撒花啦!各位如果要看总代码的话,可以点开下方我的gitee如果各位喜欢的话,希望可以多多支持!!!
2024-02-10 20:55:21 3467 3
原创 函数栈帧的创建与销毁(汇编代码角度详解)
我们在调用函数的时候,都会在内存里的栈区上开辟一块空间,而这块空间,我们就称之为是该函数的函数栈帧。如下,假设我们有一个函数叫Add,那么如图所示的空间就叫做Add函数的函数栈帧而在正式开始介绍之前,我们还需了解两个主要的寄存器:esp 和 ebp,这两个寄存器中放的是地址,而这两个地址是用来维护函数栈帧的。我们这么来理解,一个函数的创建需要在内存上面开辟空间,而这块空间就是由esp和ebp来共同维护的,两者中间的那块空间就是正在执行的函数的函数栈帧。而esp又被称为栈顶指针,ebp又被称为栈底指针。
2023-11-17 08:05:25 107
原创 C语言——分支与循环(全)
在C语言中共有三种结构:顺序结构,选择结构,循环结构我们都知道 if 的意思为如果,那么我们在C语言该怎么使用他呢?我们先来看一看下面这一串代码int main()printf("可以谈恋爱了\n");return 0;我们可以知道,当我们输入的结果为 18 的时候,则屏幕上会告诉你 你可以谈恋爱了。如果 age 不为 18 的时候,则不会有任何结果。那么问题来了,我们如果真的要进行判断的话,仅仅只是一个if真的够吗?我们能否有办法实现如果未成年,就执行不给谈恋爱的方法呢?
2023-11-01 12:48:09 169
原创 C语言,冒泡排序(含qsort函数的使用与实现(回调函数))
cmp_float 将两个元素的地址用void* 接收,并分别命名为a b,既然是void*,我们就将其强制类型转换成float* ,又因为是地址,所以我们需要将其解引用一下,就得到了 * ( flaot* ) a,同理,我们也可以得到 * ( flaot* ) b,又因为要返回一个整数,那我们就将两个相减之后的值强制类型转换为int再 return 回去不就可以啦!我们且看,我们传过去的是一个char类型的地址,那swap函数就应该拿一个char*来接收吧,那接收完之后,就该开始交换了。
2023-10-23 23:52:23 1609
原创 (C语言) strlen函数的实现
那既然如此的话,我们就可以让电脑一个一个地数,数完一个之后就换下一个,当他碰到'\0'的时候就停下来不数了。那么,每当他递归一次,他就应该离'\0'更近一点,当他递归到'\0'时,就return 0。我们都知道字符的最后一位藏着一个'\0',而'\0'是识别字符的结束标志,简单点理解就是电脑在看到'\0'时便不会再向后识别。那这么想的话,我们是不是只需要将'\0'的地址用指针表示出来,再与首字母的地址相减,就可以得到我们想要的字符的长度啦呀!在介绍三种实现方法之前,我们先来简单提一下main函数里的内容。
2023-10-09 20:23:26 194 1
原创 C语言——扫雷(含递归展开)
我们仔细看一看这张ASCII码表就会发现,字符‘0’的大小为48,而其他字符的值减去字符‘0’的值都等于我们想要的数字,比如字符‘1’的值为49,‘1’ - ‘0’ == 49 - 48 = 1。那进入函数主体之后,我们先让该坐标在show上变成空格(能进入函数主体的周围一圈都没有雷),而后我们发现,我们需要让这个函数做的,是让其扩张一圈,那我们总该需要知道其周围一圈各自的坐标吧,随后再用双层 for 循环代表这一圈里的内容,易得 x 的坐标是从x-1到x+1的,y的坐标则是从y-1到y+1。
2023-10-02 22:19:01 298 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人