c++
文章平均质量分 89
犯困的土子哥
学习的过程很漫长,循序渐进,逐渐完善,提升自己。
展开
-
C++:搜索二叉树
找到N左子树的最大结点R(最右结点)或者N右子树的值最小结点R(最左结点)代替N,因为这两个结点任意一个放到N的位置,都满足二叉搜索树的规则。替代N的意思就是N和R这两个结点的值交换,转而变成删除R结点,R结点符合情况2或情况3,可以直接删除。3、如果⽀持插⼊相等的值,插⼊值跟当前结点相等的值可以往右⾛,也可以往左⾛,找到空位置,插⼊新结点。1、把N结点的父亲对应孩子指针指向空,直接删除N结点(情况1可以当成情况2或者3处理,效果是一样的)3、把N结点的父亲对应孩子指针指向N的左孩子,直接删除N结点。原创 2024-11-12 13:18:06 · 808 阅读 · 0 评论 -
C++多态
必须指针或者引⽤调⽤虚函数被调⽤的函数必须是虚函数。原创 2024-11-11 13:14:55 · 1219 阅读 · 0 评论 -
C++继承
继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复⽤,继承是类设计层次的复⽤。原创 2024-11-04 19:33:42 · 1413 阅读 · 0 评论 -
C++STL--------stack栈和queue队列
实现的初心是为了替代vector和list,但效率上都不上,list把插入删除的效率做到极致,vector把访问效率做到极致,deque克服了vector和list的缺点但访问比不上vector,中间位置插入删除又比不上list。stack就是适配器,把设计好的数据结构让stack来进行复用,通过传模版参数,形参不同的栈数据存储形式,链式栈或者是数组栈等等,就是负责完成后进先出的效果。队列也一样,只要实现效果是先进先出就可以,不用管底层是如何实现的,底层也是复用已经实现好的数据结构来完成的。原创 2024-10-27 11:46:01 · 404 阅读 · 0 评论 -
C++STL--------list
是一个支持O(1)时间复杂度插入和删除的链表结构,迭代器是双向的,底层是一个带头双向循环链表。跟push_back有差异,push_back要插入的类型被固定,可以支持隐式类型转换。list 自己实现的sort是支持双向迭代器的,算法库里的sort是传随机迭代器。emplace_back不支持隐式类型转换,但可以直接传要初始的值进行构造。比算法库里的swap更高效,底层是交换指向头结点。可以调整链表里面的顺序,把自己的结点转移给自己。位置用迭代器表示,也可以删除一个迭代器区间。插入1到9,打印9到1。原创 2024-10-22 18:24:09 · 1388 阅读 · 0 评论 -
C++STL--------vector
是一个类模版,可以创建各种类型的数组。原创 2024-10-14 23:51:44 · 584 阅读 · 0 评论 -
C++STL--------string
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。原创 2024-10-07 18:45:48 · 1259 阅读 · 0 评论 -
C++模版
来解决存储数据类型的问题,但如果存储了一个类型的数据,就不用用栈存储另一个类型的数据,栈不能进行同时存在多个类型数据进行存储。也可以由程序员控制让模版生成什么类型的函数来调用,称为显示实例化。在针对不同类型时也可以使用强转让编译器知道要实例化什么类型的函数。所以还是用模版生成栈可以同时存在用来存储不同类型的数据。对于需要不同类型模版也可以实现,需要定义多个参数类型。在调用时根据不同类型编译器生成一个匹配该类型的函数。前面编译器自动推导后生成的函数是隐式实例化。模版生成的函数就是逻辑一样,就是类型不一样。原创 2024-10-28 11:32:44 · 1074 阅读 · 0 评论 -
类的初始化列表
C++支持内置类型和类类型的相互转换class Apublic:A(int n):_a1(n),_a2(_a1)private:int main()A aa1 = 1;return 0;用整形 1 创建了一个临时的A构造函数,拷贝构造给了aa1但因为构造加拷贝构造太浪费了,就直接优化为直接构造看上图,编译器只执行了一次构造函数。如果不想让隐式类型发生转换可以在前面加explicit:_a1(n),_a2(_a1)当有多个参数转换时,用大括号括起来class A。原创 2024-09-16 22:56:00 · 1404 阅读 · 0 评论 -
C++运算符重载
如果不写赋值运算符重载函数,系统会自动生成,但是浅拷贝,一个字节一个字节的拷贝,对于占用资源的还是要自己写才好。对于类类型的使用运算符编译器是不知道要干嘛的就需要自己写函数,自己实现功能。要跟拷贝构造区分,拷贝构造是一个已经存在,给另一个初始化时进行的拷贝操作。日期 - 日期,日期 + 天数,日期 - 天数,这些都是有意义的。总结如果显示写了析构,就要显示写赋值运算符重载。对两个已经存在的类的对象进行赋值拷贝操作。运算符的作用,用于定义类的成员函数指针。就比如日期类的大小比较。原创 2024-09-09 21:20:50 · 3398 阅读 · 0 评论 -
C++类和对象
calss是定义类的关键词,用法更C语言中的结构体struct关键词用法一样,区别是类可以在里面创建函数,当然在C++中也是兼容结构体的,同样也对结构体进行升级也可以包含函数了。在类里面的函数默认是被内联函数inline修饰的。C++中的类和结构体的用法相同,区别在于默认的限制访问。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。原创 2024-08-06 22:58:50 · 1290 阅读 · 0 评论 -
C++入门基础
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。原创 2024-08-03 16:49:45 · 1261 阅读 · 0 评论