C++之路
文章平均质量分 92
记录C++的各种语法
林先生-1
佛系……但致力于提高文章的文字水平。
展开
-
【C++笔记】异常与智能指针
其实在C语言阶段我们就接触过异常了,例如C语言中的assert断言判断程序错误以及errorno异常编号。而C++中把异常设计成了一个类,如果要使用C++中的异常,就要引入exception这个头文件:这个头文件中就是C++标准库提供的异常类的实现。当然,在实际应用中,一般都不是在try的代码块中直接抛出异常,可能是在try的代码块中调用了某些函数,而这些函数内部出现了异常,则直接在函数内部抛异常也是可以的。原创 2024-03-29 23:42:16 · 812 阅读 · 0 评论 -
【C++笔记】C++11一些重要的新特性
C++11第一个比较好用的特性就是”列表初始化",它可以大大的节省我们初始化对象的时间(特别是对象数组),虽然有些地方用起来有点儿奇怪,但是总的来说利大于弊。原创 2024-01-20 22:45:17 · 1023 阅读 · 0 评论 -
【C++笔记】红黑树封装map和set
好像这样确实已经可以了,但是我们不能忽略了一个重要的问题,map中存的是一个键值对pair,而我们在插入或查找的时候进行比较都是只针对pair中的K的,也就是pair中的first成员,那pair本身重载的比较方法是否也是只针对fist呢?同理在向上走的过程中,只要遇到当前节点是其父亲的右孩子的情况,其父亲也一定是被遍历过的,只有遇到当前节点是其父亲的左的情况,才说明其父亲是没有被遍历过的。我们知道中序遍历的顺序是“左中右”,并且是递归的形式进行的,所以对于每一个节点都会先去遍历它的左子树。原创 2023-12-01 22:01:10 · 208 阅读 · 0 评论 -
【C++笔记】红黑树的简易实现
红黑树本质上也是一颗搜索二叉树,但它在搜索二叉树的规则上有新添了一些额外的规则,使得它比普通的搜索二叉树甚至是AVL树的性能更好。红黑树是一棵搜索二叉树,它的每个节点上增加了一个存储位来表示每个节点的颜色,颜色要么是红色要么是黑色。并且树中没有连续的红色节点,且红黑树中确保没有任何一条路径长度会大于其他路径的两倍。1. 每个结点不是红色就是黑色2. 根节点是黑色的3. 如果一个节点是红色的,则它的两个孩子结点是黑色的(即没有连续的红节点)原创 2023-11-29 21:18:52 · 348 阅读 · 1 评论 -
【C++笔记】AVL树的模拟实现
/ 定义AVL树节点int _bf;// 平衡因子// 构造,_val(key),_bf(0){}// AVL树public:// ……原创 2023-11-13 18:21:49 · 279 阅读 · 0 评论 -
【C++笔记】二叉搜索树的模拟实现
如果我们想要将新的节点连接上parent,要执行parent->_right = cur,这其实是将cur放到parent->_right指向的 **“空间”**,也就是要用到parent->_right的 **“左值”**(**“左值”表示空间,“右值”表示数据**)。原创 2023-11-12 18:11:17 · 342 阅读 · 0 评论 -
【C++笔记】优先级队列priority_queue的模拟实现
优先级队列可能听名字就能想到它的功能,就是按优先级排的队列。可他到底是个什么呢?它的底层有时由什么实现的?我们可以先翻翻文档看看:从文档中我们也可以看出它其实也是一个类模板。其中的Container这个模板参数是一个容器适配器,默认使用vector作为其底层存储数据的容器。其实优先级队列在底层就是我们以前学过的堆,它在vector上使用了堆heap的算法将vector中元素构造堆的结构,默认情况下是大堆。原创 2023-11-11 21:30:58 · 321 阅读 · 0 评论 -
【C++笔记】C++多态
在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。多态可分为变量多态与函数多态。原创 2023-10-29 19:14:07 · 561 阅读 · 0 评论 -
【C++笔记】C++继承
C++是支持多继承的,也就是一个类可能会存在多个直接父类,例如下面这个例子:他们之间的继承关系如下图所示:而如果这些关系再复杂一点儿,就会变成“菱形继承”了:在这样的继承状态中,处于中间的A、B两个类是没有什么问题的,问题就出在最下面的C这个类:从代码中我们并不能看出问题出在哪里,我们得到监视窗口中才能看出:从内存中我们可以看到c1中竟然存了两个_o(一个是A继承的,一个是B继承的),这也就是为什么报错提示访问不明确的原因。原创 2023-10-24 20:44:31 · 495 阅读 · 0 评论 -
【C++笔记】模板进阶
也就是说我们在Stack.cpp中所写的可以比作一个骨架,从中只能得到这个函数的实现逻辑,所以在编译Stack.cpp的时候并不能生成具体的函数地址,这样main函数在调用的时候就自然找不到了。这其中的原因是因为函数模板比普通函数多了一个步骤:实例化,因为函数模板其实和具体函数其实是一个一对多的关系,一个函数模板可以实例化出很多个功能相近但参数和返回值类型不同的函数。但这种方法并不是一种很好的方法,因为它每一次只能解决一种类型,而且每一种类型都得要显示声明一次,这会是代码用于。直到C++20版本才引入。原创 2023-10-19 20:04:02 · 297 阅读 · 0 评论 -
【C++笔记】C++ list类模拟实现
但在开始实现构造之前,我们必须先得实现一个“空初始化”,因为我们设计的链表是带头结点的,并且这个头结点是不算入有效数据的。因为链表的哨兵头节点是私有的,并且链表也不支持随机访问(不能实现方括号重载),所以我们遍历链表的方式就只剩一种——迭代器。对于其他容器而言,链表的拷贝构造我想是最简单的了,因为它的空间本身就不连续,也就不必申请新的一段连续的空间再拷贝数据了。因为链表的空间不是连续的,所以我们就不能直接用原生指针来模拟了。因为我们所写的是带头链表,所以在list类里就只需要顶一个头节点和size即可。原创 2023-09-19 17:48:39 · 250 阅读 · 0 评论 -
【C++笔记】C++STL vector类模拟实现
start就是指向的数据段开始位置,但是_finish却是只指向的最后一个有效数据的下一个位置,这也是为了之后我们插入数据的时候更方便,也符合了迭代器的要求。随机删除判断pos位置是否合法就和insert不一样了,这里的判断是pos不能大于等于end(),因为end()即是_finish,而_finish指向的是最后一个有效数据的下一个位置,这个位置并不是有效数据的位置。所以我们这里使用的是依次使用赋值的方式就行拷贝,因为库中的自定义类型是一定重载了赋值运算符的,也一定是进行深拷贝的。原创 2023-09-10 15:58:19 · 229 阅读 · 0 评论 -
【C++笔记】C++string类模拟实现
也就是’\0’的位置:然后循环操作_str[end + 1] = _str[end],并让end–直到end与pos重合为止。原创 2023-09-09 09:22:10 · 291 阅读 · 0 评论 -
【C++笔记】C++内存管理
在C语言中我们需要动态申请空间的时候我们通常都是用malloc函数,但是malloc函数对自定义类型是没什么问题的,但是对于自定义类型就不那么适用了。如果是像栈这样的有额外申请空间的类,没有初始化这将是一件很危险的事情,因为我们后面向栈中插入数据的时候就一定会出错(野指针)。我们会发现其实里面还是用到了malloc和free的,至于其他的那些看不懂的都是跟异常现相关的。我们现在可以不理会。所以为了解决这样的问题,C++就设计了套新的动态内存申请的方案,即new和delete。原创 2023-08-29 19:46:09 · 391 阅读 · 0 评论 -
【C++笔记】C++之类与对象(下)
初始化列表是每个成员定义的地方,所以有了初始化列表之后,在就如构造函数的函数体之前就会去走初始化列表,然后再去走函数体。我们通过调试就可以看出:事实上,不管你写不写每个成员都要走初始化列表,这个我们可以通过为成员加上缺省值来验证,因为成员的缺省值就是给初始化列表用的:可以看到,虽然我们并没有在初始化列表里面写上_month的定义,但是当走到_day的定义的时候,_month就已经定义成了我们所给的缺省值了。这就说明了_month其实也走了初始化列表。原创 2023-08-27 22:36:44 · 329 阅读 · 0 评论 -
【C++笔记】C++之类与对象(中)
验证个这个特性我们就只需要保留一个有参数的构造函数,再使用不传参初始化的方式即可:原创 2023-08-19 10:48:57 · 219 阅读 · 1 评论 -
【C++笔记】C++之类与对象(上)
既然类是结构体的“升级”,那么内在结构体中定义的东西也一定能在类中定义,所以类中能定义的包括:各种变量:数组:还有枚举和结构体等等:几乎可以定义所有的东西:但C++的类除了可以定义以上这些东西之外,还一个定义一个类独有的东西:“成员函数”,有了成员函数,我们在管理结构体中的各个成员的时候就可以更方便,而不需要每写一个函数就需要传参。例如栈这个类的初始化:这是因为类划分了一个“类域”,在成员函数被调用的时候,就回到类中去寻找各个变量,这就不需要我们老是传递参数了。原创 2023-08-15 20:47:35 · 276 阅读 · 0 评论 -
【C++笔记】C++启航之为C语言填坑的语法
缺省参数还有一点需要注意的是,缺省参数不能声明和定义同时给:这样做的目的主要是为了防止声明和定义给的缺省值不一致,从而导致调用存在歧义。原创 2023-08-08 15:25:40 · 301 阅读 · 0 评论