C++
文章平均质量分 69
二十5画生
野蛮其身体,文明其精神
展开
-
C++ 异常
1、首先检查throw本身是否在try块内部,(我自己抛,我就在原地处理)如果是,则在再检查匹配的catch。异常是一种处理问题的方式,当一个函数发现自己无法处理的错误时,就可以抛出异常,告诉你错了什么,错在哪里,然后让函数的直接/间接调用者来处理这个错误。3、抛出异常的对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个局部对象,5、实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配的,可以抛出的派生类对象。3、如果到了main函数的栈帧,依旧没有匹配的catch,就会终止程序。原创 2024-07-14 17:25:51 · 874 阅读 · 0 评论 -
通俗易懂->哈希表详解
什么是哈希表?哈希表,顾名思义,就是一个表。可是为什么叫哈希表?因为这是从老美哪里音译过来的叫做->Hash Table翻译过来就是->哈希表既然是表,那么第一,这个哈希表长什么样子?第二,为什么会有这个哈希表?第三,这个哈希表用来做什么?第三,这个哈希表的特点是什么?第四,什么是取余法?第五,什么是映射?第六,什么是线性探测?第七,什么是哈希桶?一些常见的概念,是什么?要怎么理解?下面一一我来解析。综上,我们来总结一下:1、值很分散,因此哈希表也叫做散列表。原创 2024-06-01 13:06:35 · 4007 阅读 · 5 评论 -
红黑树底层封装map、set C++
map和set底层都是红黑树,其行为都是一致的,问题在于节点数据类型的不同,所以,红黑树的底层迭代器实现都是一样的,设置为模板,因此和问题1的解决思路是一致的。我map要的是key-value模型的BRTree,所以传的是对应的BRTree传对应的模板到Node,实现不同类型的Node节点。模板写成一样的,功能是一样的,但是不同的对象类具体实现不同的功能。我set要用的是key模型的BRTree,所以传的是在各自的map和set写好各自的类,用于模板仿函数的实例化。原创 2024-05-15 21:08:20 · 974 阅读 · 0 评论 -
带你手撕红黑树! c++实现 带源码
4、如果对于每个节点,从该节点到其后代节点的简单路径上,均包含相同数目的黑色节点(每条路径的黑色节点数量相等)那么作为另外一条路径的叔叔节点,也必须变为黑色,也增加一个黑色节点,才能保持。3、如果一个节点是红色的,则他的两个孩子是黑色的(不存在连续的红色节点)如此,以祖父节点作为根节点的这棵子树已经保持了黑色节点数量不变。那么,对于祖父作为根节点的这课子树来说,多了一个黑色节点。父节节点变为黑色,父亲节点的路径黑色节点多了一个。而,父节点的父节点,即祖父节点一定存在且为黑色。原创 2024-05-12 23:09:09 · 1023 阅读 · 0 评论 -
C++ list介绍(迭代器失效)
reverse逆置sort排序(默认升序)仿函数greatermerge合并,可以全部合并,也可以一部分合并unique:去重(先排序,再去重)remove:删除e值,而不是erase的pos位置删splice(粘接):其实就是transform(转移)把某个位置i,转移到当前链表的某个position之前list的sort效率很低,底层用归并,但是数据访问很低,因为是链表vectror的sort更好一些,因为是连续的空间。原创 2024-05-08 15:10:15 · 833 阅读 · 0 评论 -
c++基类与派生类
基类对象不可以赋值给派生类,因为派生类有自己的部分,基类没有,内存不匹配。当派生类被赋值给基类对象时,会切片,将符合基类部分切给基类对象。派生类对象可以直接访问基类的public/protect成员。如果继承多个基类,派生类的虚函数放在第一个继承的基类虚表中。基类对象的引用/指针可以指向派生类对象,但是反过来不可以。派生类的对象模型:基类的虚表+基类的成员+自己的成员。静态成员不包含在任何一个类对象中。原创 2024-05-06 21:20:07 · 110 阅读 · 0 评论 -
带你手撕AVL树 平衡搜索树! c++ (附原码)
当parent为-2时,说明左子树高度高,插入的左子树,此时cur必定为-1;当parent为2时,说明右子树高度高,插入的右子树,此时cur必定为1,需要左旋。b、父亲平衡因子==1/-1,父亲所在子树高度变化,需要往上更新祖先平衡因子。c、父亲平衡因子==2/-2,父亲所在子树已经不平衡,需要旋转处理。因为,插入前的AVL树本身就是一个平衡树,平衡因子都是0/-1/1。当父节点的平衡因子出现2/-2的时候,就不符合AVL树平衡,需调整。1、原来为0,插入左边,--,变为-1,高度变化为-1。原创 2024-05-06 11:50:43 · 1380 阅读 · 0 评论 -
带你手撕BSTree二叉搜索树! c++ (附原码)
有两种情况:1、删除叶子节点2、删除非叶子节点1)删除带有一个孩子的节点(左/右)可以把删除叶子节点一同处理,即叶子节点不需要特殊处理为什么?删除带有一个孩子的节点其父节点都要链接上该节点的左孩子/右孩子如果是叶子节点,那么左孩子/右孩子是空,就直接连接上了除了以上的正常情况还需要考虑删除的是根节点也就是单支树的情况此时也要特殊处理2)删除带两个孩子的节点找右子树的最左边节点又分两种情况:a、没有最左节点b、有最左节点总之,画图!画图!画图!自己分析。原创 2024-05-05 20:32:07 · 641 阅读 · 0 评论 -
c++反向迭代器
STL设计的时候,设计为rebegin位置在end位置(和begin、end对称),解引用时,要向前一个位置。反向迭代器厉害之处在于:你给我一个正向迭代器,我就给你一个反向迭代器。而所有的反向迭代器的行为,只和正向有区别,就是++和--的方向相反。你传vector的迭代器,我生成vector的反向迭代器。所有的迭代器,逻辑都是相同的。所以,可以使用模板,实例化为对应适配器的正向迭代器。也就是使用原来的类的正向迭代器来复用实现反向迭代器。你传list的迭代器,我生成list的反向迭代器。原创 2024-05-05 17:12:57 · 308 阅读 · 0 评论 -
c++set和map
序列式容器:vector、list、deque....单纯的存储数据,数据和数据之间没有关联关联式容器:map、set.....不仅仅是存储数据,一般还可以查找数据,数据之间有强关联。原创 2024-05-04 16:58:35 · 685 阅读 · 0 评论 -
c++多态
存在虚函数,多开辟一个虚表指针虚函数存在常量区(即代码段)虚表存在常量区(即代码段)虚表是在构造函数初始化列表部分进行初始化的多态:要求父类指针/引用调用,虚函数重写进而实现:编译时,父类有父类的虚表子类有子类的虚表进而实现:运行时,指向父类,到父类的虚表中找,调用父类虚表中的的虚函数指向子类,到子类的虚表中找,调用子类虚表中的的虚函数重载:重载是函数的重载,是在同一个域内实现的构成的条件是函数名相同,但是参数不同,返回值不同并不构成重载。原创 2024-05-04 10:34:30 · 1178 阅读 · 0 评论 -
c++继承
父类的private子类都不能用,其余public和protect要和子类的继承方式比较,那个小取那个原则:构造保证先父后子析构保证先子后父常见复用的体现:1)函数逻辑的复用2)模板的复用3)继承的复用在实践中,可以设计多继承但是不要设计出菱形继承的结构(iostream的io流就是使用菱形继承)菱形继承是在2.0版本出现的到了3.0才出现的既然会出现歧义问题为什么不删掉呢?因为要兼容以前的历史版本,即向前兼容所以,只有解决,不能删除。原创 2024-05-03 23:28:30 · 459 阅读 · 0 评论 -
C++静态数组和C语言静态数组的区别( array,int a[])
一、区别C语言的静态数组int a[];原创 2024-05-02 13:35:10 · 381 阅读 · 0 评论 -
C++模板进阶
2、理解一般传常量使用宏但是利用宏有一个致命缺点:就是不可改变例如,我要一个10个大小的数组,如果宏是10还好说如果我要的是20呢?1000000000呢?宏无法解决,要解决,只有再写一个类而有了非类型模板参数,就可以了。数组参数为N你传N的参数为10,就开辟10个空间你传N的参数为100000,就开辟100000个空间那么,它是这么解决呢?事实上,本质上还是生成了多个类你传10,编译器生成10的类你传1000,编译器生成1000的类...原创 2024-05-02 13:27:23 · 1365 阅读 · 0 评论 -
C++ 仿函数
仿函数仿函数,顾名思义就是模仿函数模仿了函数的什么呢?原创 2024-05-02 10:09:45 · 958 阅读 · 0 评论 -
C++ 优先级队列priority_queue
底层使用的是堆实现,默认为大堆。原创 2024-05-01 22:41:01 · 636 阅读 · 0 评论 -
C++ stack、queue以及deque
严格来说栈和队列的实现是容器适配器1、常用接口:栈:top、push、pop、size、empty队列:top、push、pop、swap、size、empty。原创 2024-05-01 15:37:02 · 396 阅读 · 1 评论 -
C++ new简介和内存管理
因此,为了解决malloc失败返回空的问题,用operator new对malloc进行封装处理,如果失败抛出异常。operator new是对malloc的封装,解决的是malloc失败不会抛出异常的问题,为了实现new。(因此,再设计一个new,同时,对于内置类型的处理也更加方便,malloc不会调用构造函数,不能初始化)a、当我们对类显示自定义一个析构函数,在new对象的时,会多new四个字节,存储对象的个数。因为,指针位置本应该是往前四个字节,但是现在没有,释放位置错了,报错。原创 2024-04-24 17:27:55 · 626 阅读 · 0 评论 -
STL::string简单介绍
标准模板库 STL(Standard Template Library),主要是数据结构和算法的框架,是模板库的一部分,STL是一个规范,是一个实现要求,但是并没有要求实现细节.原创 2024-04-21 12:28:43 · 417 阅读 · 0 评论 -
vector简单介绍
kw=vector。原创 2024-04-21 12:14:35 · 952 阅读 · 0 评论 -
KY111 日期差值
思路:计算从0000年0月0日计算到该输入的日期天数,作差(注意,相邻为两天)原创 2024-03-27 16:07:51 · 226 阅读 · 0 评论 -
JZ64 求1+2+3+...+n
利用构造函数自动调用的特点,让计算在调用的时候在构造函数内部进行。进行n次即可,创立一个数组即可。原创 2024-03-27 14:47:39 · 203 阅读 · 0 评论 -
C++内部类、匿名对象详解
可以理解为就是一个全局的类,但是访问受到外部类的类域的限制;1、这个类B受到A类的类域的限制(而类域的限制就是访问访问权限,也就是访问限定符)但是,匿名对象不用创建具体的类对象,而是直接在当前行访问/传参,搞完就销毁。注意友元的定义,内部类是外部类的友元,即是说内部类是外部类的朋友,具有单向性。一般的做法,只能先创建一个类对象,然后再通过类对象进行成员函数的访问或者传参。应用场景:例如,需要调用一个类的成员函数,或者给类内部的成员函数传参。一个类B定义在类A的内部,这个类B就是A的内部类。原创 2024-03-25 11:53:29 · 209 阅读 · 0 评论 -
C++ 友元函数
友元函数:在函数前加friend的函数称为友元函数,友元函数的用处是为了突破封装。例如一个类A的pravite变量,外部类是不可以调用的。友元函数可以在的类定义的任何地方进行声明,但是不受类访问限定符限制(就是说写在私有位置、公开位置都可以)友元函数可以访问类的私有和保护成员,但是友元函数不是类的成员函数。那么,既然A是B的朋友,那么A就可以访问B的任何成员。但是,在A内可没有声明B是A的朋友(友元声明)那就是说,声明了一下,类A是B的朋友。所以,B不可以访问A的成员。A是一个类,B也是一个类。原创 2024-03-25 11:39:08 · 281 阅读 · 0 评论 -
C++ 初始化列表
的地方在初始化列表函数体的初始化已经是赋值了既然是赋值就会有二次赋值的情况而初始化列表避免了这个问题格式为:必须走初始化列表的成员变量:1、const2、&引用3、自定义类型如果不想用默认构造函数,也可以使用初始化列表对对象进行初始化因为,自定义类型会自动调用其构造函数但是如果在初始化列表使用了,就不会调用构造函数总结:初始化列表首先是为了解决。原创 2024-03-25 11:19:13 · 266 阅读 · 0 评论 -
C++ static静态变量详解
用static关键字修饰的成员变量叫做静态成员变量在类内部,但是属于全局,不属于任意一个类对象不能在类内部定义,只能在类内部声明,在全局进行定义。原创 2024-03-25 11:18:02 · 305 阅读 · 0 评论 -
C++ explicit隐式类型转换
构造函数有多个参数,除第一个参数没有默认值外,其余参数都有默认值。如果想多参数进行隐式类型转换(C++11以后支持)例如构造函数的参数为int,且只有一个int。就可以直接将int类型的整型数据转换成类对象。一个类对象的构造函数的参数只有一个,就可以。也就是说从int类型转换成了自定义类型。单参数构造函数支持隐式类型的转换。如果不想用隐式类型转换。关于这个知识,了解即可。原创 2024-03-25 10:44:23 · 156 阅读 · 0 评论 -
C++ 取地址重载&
一般场景下,我们可能需要频繁需要类对象的地址。也就是说我们不显式书写,编译器也会自动生成。编译器将取地址重载设置为了默认成员函数。默认成员函数之一:取地址重载&原创 2024-03-25 10:22:18 · 109 阅读 · 0 评论 -
C++ const权限详解
例如一个类对象设置为const(事实上这个const修饰的是this指针指向的对象,也就是说这个类对象是不可修改的对象)类内部有一个成员函数func现在你要用该const类对象去调用func函数此时就会出错为什么?因为func函数被调用时默认有一个this指针,也就是该类对象但是这个该类对象是用const修饰了的,有const修饰就是限制为不能被修改现在你要调用func函数对该类类对象进行处理,但是按理来说又const修饰的对象是不能被处理修改的也就是说权限被你放大了。原创 2024-03-25 10:17:53 · 256 阅读 · 0 评论 -
C++流插入、提取重载详解
而成员函数的第一个参数默认为this基类,而this参数又不能显式书写,所以没法改。注意:运算符重载如果有两个操作数的时候,第一个为左操作数,第二个为右操作数。所以,就导致了,流插入的第一个操作数为this,第二个操作数才是cout。形成以上问题的本质是因为,作为成员函数重载,this指针占据了第一个参数。也就是说第一个操作数只能为基类对象,第二个操作数是传参的参数。一般的理解就是,我已经是你的朋友了,可以访问你的私有。但是,现在的流插入的书写顺序是从左到右。然而,类对象的数据是封装在类域内部的。原创 2024-03-25 09:44:11 · 321 阅读 · 0 评论 -
(赋值)运算符号重载
为什么?如果定义为全局函数那么类内部就没有我们定义的赋值重载那么编译器就会自动生成一个那么问题就来了:类内部有一个赋值重载你全局域也有一个赋值重载那调用的时候到底听谁呢?所以,就强制规定,不能定义为全局因为赋值重载函数是默认的成员函数之一所以,我们没有显示实现时,编译器就会自动生成一个默认生成的赋值重载和默认生成的拷贝构造函数一样对内置类型不调用,直接赋值但是对于自定义类的赋值,就会调用对应类的赋值重载总结起来就是:原创 2024-03-17 21:18:57 · 948 阅读 · 0 评论 -
C++运算符重载详解
考虑一个问题:对于内置类型编译器可以自己比较但是自定义类型呢?编译器没法比,也不知道怎么比较,把握不住所以,需要我们自己写一个函数进行比较那么写函数,就涉及一个命名的问题:函数命名什么样子的函数名才叫做规范?这个,不好说,毕竟没有硬性规定所以,需要靠程序员自己的素养然而,依旧会有很多不同,影响可读性所以,祖师爷想到了这个问题于是就对这个问题进行了处理于是整了一个运算符重载的东西。原创 2024-03-11 20:34:48 · 164 阅读 · 0 评论 -
C++常引用详解
事实上是,a产生了一个临时变量,将double的是整数部分取出来放到临时变量。作用:我是你的别名,但是我不能修改你,也就是只读(权限缩小s)要知道char仅仅只是一个字节,再怎么着也不能变成4个字节。因为别名是支持读和写,也就意味着放大权限,这是乱来了。所以如果非要再写一个引用,也要加一个const。所以,事实上,是产生了一个int类型的临时变量。事实上,当类型转换的时候,就是用的临时变量。而是a和b产生的临时int变量进行比较。总的来说,权限缩小可以,权限放大不行。也就是说,事实上比较的不是a和b。原创 2024-03-11 20:30:33 · 251 阅读 · 0 评论 -
C++拷贝函数详解
而默认生成的拷贝构造函数中的自定义对象拷贝,会按照内存存储的字节序完成拷贝,什么意思?就是转化成为一个字节一个字节的拷贝过去,这种拷贝方式叫做浅拷贝,或者值拷贝。2、拷贝构造的参数只有一个,而且必须是类类型对象的引用,因为使用传值传参的方式会引发无限递归,直接报错。两个对象的指针是一模一样的,因为是拷贝过去的,也就是说地址一样,指向的是同一个空间。好,当对象2的生命周期结束的时候,就会自动调用析构函数free指针2指向的空间。所以,A就会作为B拷贝构造的参数,去调用B的拷贝构造函数。原创 2024-03-11 20:26:34 · 1344 阅读 · 0 评论 -
C++析构函数详解
:按位取反符号1、无参数,为返回类型2、一个类只能有一个析构函数,如果没有定义,编译器自动生成,同时析构函数不支持重载3、对象生命周期结束时,编译器系统会自动调用析构函数。原创 2024-03-11 20:06:43 · 594 阅读 · 0 评论 -
C++构造函数详解
同时,注意思考:既然我们不写,编译器会自动生成默认构造函数,那么这个自动生成的默认构造函数调用的时候会做什么呢?注意:C++98规则规定,内置类型不做处理,对自定义类型会调用构造函数内置类型/基本类型:int/char/double/指针 (语言自己定义的类型)自定义类型:struct/class(也就是根据我们的需求而自定义的类型)默认生成的构造函数,对内置类型不做处理,也就是说根本就不会调用如果是自定义类型,对自定义类型就会去调用类的构造函数什么意思?原创 2024-03-11 20:03:14 · 978 阅读 · 0 评论 -
C++的This详解
如果对象为空指针,但是却要调用对象的成员函数,如果这个成员函数没有对这个对象进行解引用,那就不会出错。只不过是对象的成员函数的参数this为空指针而已,我传一个空指针有问题吗?但是,如果这个成员函数对this进行了解引用,就会出问题,出现空指针解引用的问题。4、常量区(const不在常量区,const修饰的是后面的对象)所以,即使是类的对象是一个空指针,也不会对这个空指针进行解引用。所以,当要调成员函数的时候,并不需要用类的对象去进行调用。因为对象的成员函数不是在对象内部的。原创 2024-03-10 18:37:24 · 1011 阅读 · 0 评论 -
C++类详解
1、一般来说,建议在成员变量前加一个_前缀,例如_menber为什么?因为为了避免内部调用传参的时候发生混淆2、如果类前没有加访问限定符,默认为private(私有);而struct默认为public(公开)3、访问限定符分:public(公共)、protected(保护)、private(私有)public(公共):在类外部可以被访问protected(保护)、private(私有)在类外部不可以被访问(继承部分会有变化)原创 2024-03-10 18:24:19 · 450 阅读 · 0 评论 -
C++内联函数inline详解
内联函数(inline加在返回值的前面)理解内联函数,首先理解宏,什么是宏?原创 2024-03-09 12:38:32 · 755 阅读 · 0 评论 -
C++引用详解
很简单,记住,引用就是别名例如,李逵的别名叫黑旋风此处a的别名叫做b,就这么简单。原创 2024-03-09 12:24:37 · 339 阅读 · 0 评论