- 博客(50)
- 收藏
- 关注
原创 智能指针的使⽤及其原理
我们想到赋值,可能就会这样直接写一个赋值,就是把你=右边的_ptr和pcount都给我然后再++即可,这样是错误的,因为你赋值是给一个已经存在的对象赋值的,所以,你需要赋值的这个对象可能就他自己指向一块空间,此时你让它指向别处,此时不就出现内存 泄漏了吗,所以还要判断一下。我们这样设计一下,就是使用一下指针,开辟一块空间只存放我们的这个引用计数的值,每次创建一个对象,就开辟一个空间存放它的值,如果你通过拷贝构造创建对象的话,此时就让我的这个引用计数这个指针指向你的引用计数指针的那块地址,然后再++即可。
2025-11-20 20:43:01
710
原创 c++异常
一.异常的概念及使⽤一.异常的概念及使⽤1.1异常的概念异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理,异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。C语⾔主要通过错误码的形式处理错误,错误码本质就是对错误信息进⾏分类编号,拿到错误码以后还要去查询错误信息,⽐较⿇烦。异常时抛出⼀个对象,这个对象可以函数更全⾯的各种信息。1.2。
2025-11-19 21:26:06
744
原创 ⽤哈希表封装myunordered_map和myunordered_set
一.源码及框架分析一.源码及框架分析SGI-STL30版本源代码中没有unordered_map和unordered_set,SGI-STL30版本是C++11之前的STL版本,这两个容器是C++11之后才更新的。但是SGI-STL30实现了哈希表,只容器的名字是hash_map和hash_set,他是作为⾮标准的容器出现的,⾮标准是指⾮C++标准规定必须实现的,源代码在hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h中。
2025-11-11 15:15:48
617
原创 哈希表的实现
一.哈希概念一.哈希概念哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。1.1直接定址法当关键字的范围⽐较集中时,直接定址法就是⾮常简单⾼效的⽅法,⽐如⼀组关键字都在[0,99]之间, 那么我们开⼀个100个数的数组,每个关键字的值直接就是存储位置的下标。
2025-11-09 09:00:00
770
原创 unordered_map和unordered_set的使用
一.unordered_map和unordered_set在我们讲Hash之前,我们先来看一下unordered_map和unordered_set的使⽤。一.unordered_map和unordered_set我们这个我们重点讲一下和map和set的区别。1.1unordered_set类的介绍unordered_set的声明如下,Key就是unordered_set底层关键字的类型unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀。
2025-11-08 14:31:06
558
原创 封装红⿊树实现mymap和myset
二.模拟实现map和set一.源码及框架分析SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/stl_tree.h等⼏个头⽂件中。map和set的实现结构框架核⼼部分截取出来如下:这是我们截取的几个比较重要的代码,图中看着很麻烦,我们先简化一下,删去一些没有用的东西。这是我们简化之后的图片。通过上图对框架的分析,我们可以看到源码中rb_tree⽤了⼀个巧妙的泛型思想实现,rb_tree是实。
2025-11-05 15:22:32
902
原创 AVL树的实现
二.AVL树的实现一.AVL的概念AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。•AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis是两个前苏联的科学家,他们在1962年的论⽂《An algorithm for the organization of information》中发表了它。•。
2025-05-22 20:56:12
939
原创 ⼆叉搜索树 ( 代码实现 c++ )
⼆叉搜索树的性能分析一.⼆叉搜索树的概念⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值它的左右⼦树也分别为⼆叉搜索树。
2025-05-14 19:24:02
792
原创 array和模板进阶(详细使用)
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有 目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。简单来说就是声明和定义分离,声明写在.h文件,定义写在.cpp文件。我们下面直接来看例子吧。这是我们的.h文件,也就是声明的文件。这就是我们的.cpp文件,就是定义的文件。我们发现运行是没有问题的。接下来我们先来讲一下它是如何运行的,方便我们一会儿的讲解。
2025-04-27 15:11:37
1112
原创 优先级队列和仿函数的讲解(底层实现)
这是我们完成的less和greater的类,就是通过对()这个运算符的重载来完成的,当我们传入less的时候,这是,我们只需要less实例化的对象(_con(parent),_con(child))传入这样的参数就可以完成我们下图这种if语句中完成的事情了,就是_con(parent)<_con(child)成立是返回true即可,另外的greater这个的()运算符重载就是相反操作即可。这是我们写的仿函数,我们把指针之间的比较转换为了还是结构体之间的比较了,此时,就会遵循Date这个类中的比较法则了。
2025-04-24 19:25:38
653
原创 Stack和Queue和deque的讲解(底层实现 手撕版)
适配器是一种设计模式设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)该种模式是将一个类的接口转换成客户希望的另外一个接口。听着很抽象,我们直接来写吧。就是这个样子的。这个适配器就是我们需要传入的一个类型,我们传入来演示一下。我们写了这样的一个代码,我们把第二个参数传入了一个vector容器,当然我们也可以传入list容器,接下来我们先来看一下好处。
2025-04-24 18:21:50
798
原创 list底层原理
这个用结构体更好,因为我们需要不断的访问节点,类中的成员函数一般都是私有的,需要还用友元函数什么的。这个是我们来实现的类,我们实现的是双向带头循环链表,这个是实用性最高的一个链表的形式。这个_head就是一个头的作用,没有实际意义。
2025-04-22 19:21:49
1141
原创 vector常用的接口和底层
我们都是只讲常用的。这四个都是比较常用的。第一个简单来看就是无参构造,是通过一个无参的对象来对我们的对象进行初始化的,第一个我们常用来当无参构造来使用。第二个我们常用的就是通过多个相同的数字来初始化一个vector。像这样。第三个的主要用途就是我们下图的形式。它会通过从头遍历到结束来初始化我们的vector。第四个毫无疑问就是通过另外一个vector对象来初始化我们的对象。
2025-04-15 21:35:05
913
原创 string的底层原理
我们来看一下,string的底层就是一个字符型指针和一个size来表示string的大小,capacity来表示分配的内存大小。我们来看我们注释掉的第一个构造函数,我们是通过初始化列表来初始化size的大小,再通过size的大小来初始化其他两个变量的,为什么图中要多给_str开一个空间呢,这是因为要存放\0的原因。注释掉的第二个是无参构造,我们发现可以使用缺省参数来合并成为一个构造函数。我们给的缺省值是一个空字符串,但是在下面我们给过它空间之后就会自动有一个\0了,所以不需要我们手动给它\0的值。
2025-04-01 18:17:50
792
原创 string(入门)
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。 在使用string类时,必须包含#include头文件以及using namespace std; 会出错,这是因为 是一个整数数组,并非指针数组。 尝试把数组元素当成指针来处理,然而整数并不能隐式转换为指针,所以会产生编译错误。你可以直接使用范
2025-03-26 15:05:35
1023
原创 内部类 ,匿名对象,编译器优化和静态成员
⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进⾏初始化。报错了,是因为不能直接给它值,这里只是声明,这里的值是缺省值,静态成员是属于静态区的,所以不会走初始化列表,所以不能给它缺省值,必须在类外初始化这样就是正确的了。静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。我们发现静态变量并不属于类本身,类的作用只是给静态变量了一个类域,使其访问受限。⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
2025-03-14 19:47:35
502
原创 初始化列表 , 类型转换,友元函数
之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。1.2 初始化列表有什么作用呢?我们来举个例子如上图,这就是一个简单的初始化列表,我们通过初始化列表给0和1赋值了。但是这些功能明明构造函数就能完成,为什么还要初始化列表呢?我们再来举个例子。
2025-03-14 14:20:56
851
原创 赋值运算符重载(下)
我们在上一个博客当中只写了部分的运算符的重载,我们将在这篇博客当中把他们补充完整。赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。赋值运算符重载的特点:1.赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成const当前类类型引⽤,否则会传值传参会有拷⻉。2.有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋值场景。
2025-01-20 11:00:00
896
原创 类和对象 --深拷贝和浅拷贝 赋值运算符重载
一.拷贝一.拷贝如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数 也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。拷⻉构造的特点:1.拷⻉构造函数是构造函数的⼀个重载。2.拷⻉构造函数的第⼀个参数必须是类类型对象的引⽤,使⽤传值⽅式编译器直接报错,因为语法逻辑上会引发⽆穷递归调⽤。拷⻉构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引⽤,后⾯的参数必须有缺省值。3.
2024-12-12 14:10:19
900
原创 类和对象(2)--构造函数 析构函数
一.类的默认成员函数一.类的默认成员函数默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最 后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数, 移动构造和移动赋值,这个我们后⾯再讲解。默认成员函数很重要,也⽐较复杂,我们要从两个⽅⾯去学习:•第⼀:我们不写时,编译器默认⽣成的函数⾏为是什么,是否满⾜我们的需求。•。
2024-12-11 15:35:23
1145
原创 排序2(万字详细版)
快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素 序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩ 于基准值,右⼦序列中所有元素均⼤于基准值,然后最左右⼦序列重复该过程,直到所有元素都排列 在相应位置上为⽌。快速排序也分为三个常用的,分别是hoare版本,挖坑法,lomuto前后指针。
2024-12-05 21:26:30
805
原创 排序1 (入门)
一. 排序概念及运⽤一. 排序概念及运⽤1.1概念排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的 操作。2.1 运用像这种大学的排名都运用到了排序的知识。接下来我们就来先讲几个基本的排序吧。
2024-11-30 11:13:59
889
原创 二叉树的层次遍历和判断是否为完全二叉树
树的层次遍历,按照一层一层的进行遍历。那么我们要怎么实现这个功能呢?我们在之前学过一个数据结构,叫做队列,我们来试一下,它们配合一下,看看是否可以完成这个功能。我们发现,用队列似乎是可以完成这个功能的,那么我们来操作一下。
2024-11-25 16:29:45
947
1
原创 链式二叉树 (非常详细)
一 .实现链式结构⼆叉树⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组 成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。其结构如下:创建了一个链式结构,left表示左孩子,right表示右孩子。
2024-11-25 14:39:40
894
原创 堆排序 (很详细 保姆级)
堆排序是利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,分为大顶堆和小顶堆。大顶堆的特点是每个节点的值都大于或等于其左右子节点的值,小顶堆则是每个节点的值都小于或等于其左右子节点的值。堆排序的基本思想是:先将待排序的序列构建成一个堆(初始建堆可以从最后一个非叶子节点开始调整,使其满足堆的性质),然后将堆顶元素(大顶堆的最大值或小顶堆的最小值)与堆的最后一个元素交换,此时最大(小)值就放到了它最终的位置。接着对剩下的n-1个元素重新调整为堆,重复这个过程,直到整个序列有序。
2024-11-24 08:00:00
708
1
原创 二叉树 --堆实现(顺序二叉树)
1.1树的概念与结构树是⼀种⾮线性的数据结构,它是由 nn>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。•有⼀个特殊的结点,称为根结点,根结点没有前驱结点。•除根结点外,其余结点被分成 M(M>0)个互不相交的集合T1T2……Tm,其中每⼀个集合 Ti(1 <= i <= m) ⼜是⼀棵结构与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以有0个或多个后继。因此,树是递归定义的。
2024-11-23 08:00:00
882
原创 引用 (简单易懂)
1.引⽤的概念和定义引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋 ⻛";林冲,外号豹⼦头;引用就是给变量起一个别名,但是它俩都是同一个人,就跟你的小名一样,不管叫哪个名字,都是指的你自己。我们先写一个简单的引用案例吧。你像我们之前写的代码,这样并不能改变a的值,因为a和b都是变量都开辟了一块空间,是属于两个不同的人。这是结果。
2024-11-22 08:00:00
995
4
原创 C++入门 (很详细)
缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把缺省参数也叫默认参数)我们来举个例子。这就是一个简单的例题,我们只需要传a的值,并不需要传入b的值,b就会被给与一个初值,当我们给b一个值的话,这个b的缺省参数就用不上了,还是会等于我们给的值,注意缺省参数只能从右往左给。•这样就是一个错误的,当我们只给一个值的时候,无法分清楚是给谁的。
2024-11-21 14:54:48
5538
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅