![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 94
c++学习
-杀意感知-
英雄联盟大师 永劫无间修罗 apex大师
展开
-
红黑树模拟实现STL中的map与set
/ 定义红黑颜色RED,BLACKT _data;// 数据域// 用来标记节点颜色RBTreeNode(const T& data) // 构造函数{}**定义红黑树结构(KV)**==K:键值 key 的类型。T:数据的类型,如果是 map,则为 pair;如果是 set,则为 K。原创 2024-07-27 01:56:53 · 635 阅读 · 0 评论 -
C++红黑树
AVL树:严格平衡(左右子树高度差不超过 1),所以 AVL 树的查找、插入、删除效率高:O(logN),但在插入和删除节点后,要维持树的平衡状态,做的旋转处理还是很多的。红黑树:近似平衡(控制最长路径不超过最短路径的2倍),变了一种方式来控制树的平衡,相较于 AVL 树而言,没有那么严格。红黑树更多是一种折中的选择,它舍弃平衡二叉树的严格平衡,换取节点插入时尽可能少的调整。因为红黑树的旋转情况少于 AVL 树,使得红黑树整体性能略优于。原创 2024-07-25 03:54:58 · 630 阅读 · 0 评论 -
AVL树(高度平衡二叉搜索树)
AVL 树节点是一个三叉链结构,除了指向左孩子的指针右孩子的指针,还有一个指向其父亲的指针,数据域是键值对,即 pair 对象,还引入了平衡因子,用来判断是否需要进行平衡操作。// AVL树节点的定义(KV模型)// 该节点的左孩子// 该节点的右孩子// 该节点的双亲指针// 键值对int _bf;// 该节点的平衡因子(balance factor) = 右子树高度-左子树高度// 构造函数, _kv(kv), _bf(0){}// AVL树的定义(KV模型)原创 2024-07-23 02:39:10 · 672 阅读 · 0 评论 -
二叉树进阶
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;情况d:找到能够替代其位置的值,也就是要满足左子树小于该值,右子树大于该值,我们可以找左子树的最大值或者右子树的最小值,然后被删除节点赋值成找到的最大值或最小值,在删除最大值或最小值节点。尽管是同一组序列,但是不同的插入顺序构造出的搜索二叉树也是不一样的,如上图所示,左边是比较正常的树,右边是极端情况下的歪脖子树。最差情况下,类似于右边的歪脖子树,此时树的高度接近于N,因此其复杂度就是:N、原创 2024-07-20 15:01:26 · 1029 阅读 · 0 评论 -
set、map、multiset、multimap的介绍及使用
1.set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列(默认是升序);2.set虽然是采用了键值对的方式存储数据,但是在set中,value就是key,即相当于是K模型,并且每个value必须是唯一的,不可以重复,所以可以使用set进行去重;原创 2024-07-19 01:16:07 · 840 阅读 · 1 评论 -
C++多态
多态是指不同继承关系的类对象,去调用同一函数,产生了不同的行为。在继承中要想构成多态需要满足两个条件1.必须通过基类的指针或者引用调用虚函数。2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。1.在虚函数的后面写上=0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。//抽象类(接口类)class Carpublic://纯虚函数int main()Car c;//抽象类不能实例化出对象,errorreturn 0;原创 2024-07-10 21:50:20 · 739 阅读 · 0 评论 -
C++继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。例如,以下代码中Student类和Teacher类就继承了Person类。//父类public:protected:string _name = "张三";//姓名//年龄//子类。原创 2024-07-09 23:28:23 · 889 阅读 · 0 评论 -
模版进阶操作
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。优点:模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。缺陷:模板会导致代码膨胀问题,也会导致编译时间变长。出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-07-07 18:53:06 · 618 阅读 · 0 评论 -
priority_queue的使用与模拟实现
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。默认情况下priority_queue是大堆。使用vector作为底层容器,内部构造大堆结构。使用vector作为底层容器,内部构造小堆结构。不指定底层容器和内部需要构造的堆结构。此时默认使用vector作为底层容器,内部默认构造大堆结构。原创 2024-06-28 17:56:43 · 694 阅读 · 0 评论 -
stack和queue的模拟实现
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:那deque是如何借助其迭代器维护其假想连续的结构呢?原创 2024-06-27 23:18:45 · 564 阅读 · 0 评论 -
stack和queue的介绍及使用
使用默认的适配器定义栈。使用特定的适配器定义栈。注意: 如果没有为stack指定特定的底层容器,默认情况下使用deque。使用默认的适配器定义队列。使用特定的适配器定义队列。原创 2024-06-27 23:00:24 · 652 阅读 · 0 评论 -
list的介绍及使用
1.list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。3.list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。4.与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。原创 2024-05-30 20:20:15 · 759 阅读 · 0 评论 -
vector的深度剖析及模拟实现
1.基本框架public:private:// 指向数据块的开始// 指向有效数据的尾// 指向存储容量的尾我们首先定义了一个模版类,这里的vector三个成员均为迭代器,而vector的迭代器是一个原生指针,我们这里为其定义别名iterator这些成员变量用于管理vector内部的动态数组_start:这是一个指针,指向分配给vector的内存区域的开始。这是数组的第一个元素_finish:这个指针指向数组中最后一个实际存在的元素的下一个位置。原创 2024-05-23 14:52:47 · 934 阅读 · 2 评论 -
list的模拟实现
list迭代器类,实际上就是对结点指针进行了封装,原创 2024-05-30 22:37:19 · 678 阅读 · 0 评论 -
vector的介绍及使用
1、vector是表示可变大小数组的序列容器。2、vector就像数组一样,也采用的连续空间来存储元素,这也意味着可以采用下标对vector的元素进行访问。3、vector与普通数组不同的是,vector的大小是可以动态改变的。4、当vector需要重新分配大小时,其做法是,分配一个新的数组,然后将全部元素移到这个数组当中,并释放原来的数组空间。5、vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。原创 2024-05-18 19:00:54 · 637 阅读 · 3 评论