![](https://i-blog.csdnimg.cn/direct/3ae2b022cb224b88b8f5d417f1dd0878.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++从入门到起飞
文章平均质量分 93
本专栏为C++的相关知识,目前为止还在持续更新中
24k纯甄
本人在校大学生一枚,致力于研究学习C/C++,Linux操作系统,AI人工智能等,愿与各位大佬共同学习,还望各位多多指教。
展开
-
【C++】:红黑树深度剖析 --- 手撕红黑树!
就是太过追求绝对平衡,比如在插入时要维护其绝对平衡,旋转次数太多,在删除时甚至有可能要一直旋转到根位置,使之性能低下。本篇文章介绍的红黑树也是一种平衡树,是通过改变节点颜色以及旋转操作,使之接近平衡。红黑树比AVL树的用途更加广泛,在一些方面效率甚至要优于AVL树,并且 map/set 的底层封装用的也是红黑树。红黑树的节点结构与AVL树的大致相同,只是AVL树中有节点的颜色,没有平衡因子。//枚举颜色RED,BLACK,_kv(kv){}原创 2024-07-25 20:22:48 · 1033 阅读 · 41 评论 -
【C++】:继承[下篇](友元&&静态成员&&菱形继承&&菱形虚拟继承)
1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。2.多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。3.继承和组合(1)public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。(2)组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。(3)优先使用对象组合,而不是类继承。(4)继承可以直接访问基类的protected 和 public成员。原创 2024-07-13 13:38:43 · 1145 阅读 · 69 评论 -
【C++/STL】:list容器的基本使用
list中的接口比较多,与string和vector类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。本文只介绍list中一些常见的重要接口。注意:使用list时需要包含头文件< list >。list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于。原创 2024-06-14 18:29:44 · 1738 阅读 · 96 评论 -
【C++/STL】:优先级队列的使用及底层剖析&&仿函数
优先队列(priority_queue)是一种容器适配器,默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。默认情况下priority_queue是大堆。注意:使用优先级队列要包含头文件 < queue >。仿函数也叫函数对象,是一个重载了 operator() 的类,可以使得类的对象像函数一样使用。原创 2024-06-25 08:57:09 · 849 阅读 · 61 评论 -
【C++】:AVL树的深度解析及其实现
上一篇文章对其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。本篇文章介绍的就是平衡树之一的:AVL树。注意:本篇文章AVL树实现的 key_value 模型。因为实际上 map/set 的底层并不是用AVL树封装的,而是用红黑树(下一篇文章),原创 2024-07-24 22:02:32 · 954 阅读 · 70 评论 -
【C++】:C/C++内存管理
1.在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。2.如果一次性开辟n个对象,则会调用n次构造,n次析构。3.自定义类型也可以初始化,其原理是会进行隐式类型转换。class Apublic://构造函数//单参数:_a(a)//多参数//拷贝构造//析构函数~A()private:int _a;int main()//自定义类型//malloc对于自定义类型也无法初始化。原创 2024-05-07 10:42:33 · 1120 阅读 · 67 评论 -
【C++/STL】:list容器的深度剖析及模拟实现
【list的基本使用】要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,list的底层是带头双向循环链表,通过上一篇文章的学习,这些内容已基本掌握,现在我们来模拟实现list容器的主要接口。与前面的vector类似,由于使用了模板,也只分成.cpp和.h两个文件。.cpp文件里放节点类,迭代器类,list类及其成员函数,测试函数的实现,在.h文件里进行测试。对三个类的区分与理解,迭代器类的实现。原创 2024-06-23 11:17:58 · 1745 阅读 · 62 评论 -
【C++/STL】:string类底层的模拟实现
但是这种写法不仅适用于string类,后面的链表,树也同样适用。因为链表,树等要拷贝节点,不容易进行深拷贝。上一篇文章已经对string类进行了简单的介绍,大家只要能够正常使用即可。这篇文章主要是对string类的几个重点的基本接口函数进行模拟实现,而这几个函数的模拟也有可能出现在面试中。原创 2024-05-17 22:27:51 · 725 阅读 · 88 评论 -
【C++/STL】:set和map的介绍及基本使用
在前面,我们已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。(1) set是按照一定次序存储元素的容器(2) 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。原创 2024-07-19 23:04:55 · 1441 阅读 · 86 评论 -
【C++/STL】:stack/queue的使用及底层剖析&&双端队列&&容器适配器
点击跳转到文章【list容器的基本使用】点击跳转到文章【list容器的深度剖析及底层实现】前面我们已经学习了list容器的相关知识,本文主要介绍STL中另外两种重要的结构,stack和queue。但是在STL中这两者并没有划分在容器范围内,而是将其称为容器适配器。适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。deque(双端队列):是一种双开口的"连续"空间的数据结构。原创 2024-06-24 09:22:24 · 1261 阅读 · 53 评论 -
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
上篇文章已经介绍了vector容器的基本使用vector容器的基本使用,这篇文章主要选择vector中一些核心的,基本的接口进行模拟实现。注意:由于我们模拟实现时使用了类模板所以不建议进行文件分离,不然会产生链接错误。所以我们把函数都写在.h文件中,在Test.cpp文件中进行测试。public:// Vector的迭代器是一个原生指针//......private://指向开始位置的指针//指向最后一个位置的下一个位置的指针//指向存储容量的尾。原创 2024-05-29 17:51:59 · 1700 阅读 · 121 评论 -
【C++】:模板进阶(非类型模板&&类模板打印&&特化&&分离编译)
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。原创 2024-06-26 10:24:53 · 880 阅读 · 63 评论 -
【C++/STL】:string类的基本使用
string 就是我们常说的"串",它是一种字符数组,只不过这个数组具备扩容,增删查改等功能。string类在我们日常生活中是十分常用的,并且在笔试,面试中也经常出现,它是学习C++的不可缺少的一部分。,想要了解更多,前往https://legacy.cplusplus.com/reference/string/string/网站里浏览。string类大概有120个函数接口,原创 2024-05-15 21:49:07 · 1228 阅读 · 48 评论 -
【C++】:二叉树进阶 --- 搜索二叉树
二叉树在前面C数据结构阶段已经讲过,本节取名二叉树进阶是因为:(1)map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构(2) 二叉搜索树的特性了解,有助于更好的理解map和set的特性因此本节借二叉树搜索树,对二叉树部分进行收尾总结。原创 2024-07-15 12:54:43 · 1680 阅读 · 89 评论 -
【C++】:多态的使用及原理解析
多态是C++的三大特性之一,也是面向对象的重要体现。在生活中的某些特定场合就能够体现出多态。比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。再比如动物发出叫声这一行为,小狗叫是"汪汪",小猫叫是"喵喵上述例子都能体现出不同的对象去完成同一个行为,结果不同。public:cout << "买票-全价" << endl;public:cout << "买票-优先" << endl;public:cout << "买票-半价" << endl;原创 2024-07-14 13:13:36 · 1206 阅读 · 64 评论 -
【C++/STL】:vector容器的基本使用
vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。与其它动态序列容器相比(deque, list and forward_list),vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。原创 2024-05-21 10:34:08 · 1419 阅读 · 63 评论 -
【C++】:继承[上篇](定义&&赋值兼容转换&&作用域&&派生类的默认成员函数)
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或子类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected://名字//年龄protected:int _stuid;// 学号protected:int _jobid;// 工号继承的父类的成员(成员变量+成员函数)不过是把父类的。原创 2024-07-01 09:30:45 · 1044 阅读 · 102 评论 -
【C++】:模板初阶和STL简介
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表。原创 2024-05-08 14:53:15 · 1007 阅读 · 71 评论 -
【C++】:const成员,取地址及const取地址操作符重载
这两个默认成员函数一般不用我们自己定义 ,编译器默认会生成。取地址操作函数和加了const的取地址操作函数构成重载。,const修饰类成员函数,实际修饰该成员函数。,表明在该成员函数中。原创 2024-04-29 07:41:28 · 712 阅读 · 117 评论 -
【C++】:拷贝构造函数和赋值运算符重载
拷贝构造函数是特殊的构造函数。是用一个已经存在的对象,赋值拷贝给另一个新创建的已经存在的对象。本质:用同类型的对象拷贝初始化。1.如果没有管理资源,一般情况下不需要写拷贝构造,用编译器默认生成的拷贝构造就可以。如 Date类;2.如果都是自定义类型成员,内置类型成员没有指向资源,用编译器默认生成的拷贝构造就可以。如 MyQueue;(小技巧:一般情况下,不需要写析构的,就不需要写拷贝构造。3.如果内部有指针或者有一些值指向资源,需要显式写析构函数释放,通常就需要显式写拷贝构造完成深拷贝。原创 2024-04-25 22:04:15 · 1240 阅读 · 122 评论 -
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。1.权限放大问题存在于引用和指针里,普通的赋值拷贝不会。2.权限只能缩小,平移,不能放大。原创 2024-04-20 21:56:44 · 1367 阅读 · 102 评论 -
【C++】:日期类的实现 -- 日期计算器
在C++中,由于。原创 2024-04-30 07:42:33 · 1339 阅读 · 103 评论 -
【C++】:构造函数和析构函数
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数用户没有显式实现,编译器会生成的成员函数称为默认成员函数。这篇文章介绍的是构造函数和析构函数。1.一般情况下构造函数都需要我们自己显式的去实现。2.只有少数情况下可以让编译器自动生成构造函数。(类似用两个栈实现队列的MyQueue,它的成员都是自定义类型)原创 2024-04-23 15:21:29 · 1354 阅读 · 105 评论 -
【C++】:C++关键字,命名空间,输入&输出,缺省参数
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。int val;一个工程中的 test.h 和上面 test.cpp 中两个N1会被合并成一个。但是合并后不能有同名的变量,函数等,否则也会报错。要用嵌套解决。所以命名空间不能随便展开!int a = 0;int b = 1;int c = 2;int a = 0;int b = 1;int c = 2;//展开命名空间int main()return 0;原创 2024-04-19 22:26:46 · 1506 阅读 · 97 评论 -
【C++】:类和对象(上)
/ 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号。原创 2024-04-22 07:43:15 · 1371 阅读 · 111 评论 -
【C++】:类和对象(下)
这个语法其实是对前面的构造函数的补充。最重要的是初始化列表的使用,及其特性,隐式类型转换,还有当前阶段需要了解的 explicit 关键字。初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。1.1 初始化列表的使用当我们实现一个MyQueue(用两个栈模拟一个队列)时,如果栈不具备默认构造,MyQueue也无法生成默认构造,此时MyQueue要显示实现默认构造。如何实现呢?必须用初始化列表。初始化列表的本质:可以理解为每个对象中成员定义的地原创 2024-05-01 08:34:42 · 1281 阅读 · 96 评论