自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 c++ 哈希 & unordered_map & unordered_set 的学习

在 c++98 中, STL 提供了底层是红黑树结构的一系列关联式容器,set 和 map 的查询效率可以达到 log2N,红黑树最差的情况也只是需要比较红黑树的高度次,当节点数量非常多时,查找一个节点还需要比较几十次,效果也不是太理想,最理想的查询是,进行很少次的比较次数就能将元素找到。因此在 c++11 中,STL 又提供了 unordered 系列,unordered_map, unordered_set,unordered_mulitmap, unordered_mulitset。

2024-06-02 20:27:50 1071

原创 c++ map,set封装

map 是一个 kv 结构, set 是 k结构。我们前面模拟实现了 红黑树,但是我们实现的红黑树把 kv 结构写死了,怎么样才能用泛型编程的思想来实现map和set呢我们先简单看一下原码中是怎么实现的。

2024-05-12 11:24:51 858

原创 c++ 红黑树学习及简单实现

红黑树,是一种二叉搜索树,但在每个节点增加一个存储位表示节点的颜色,可以是红色,或是黑色,通过对任何一条从根到叶子的路径上各个节点的着色方式进行限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡。AVL 树:左右高度差不超过1(严格平衡)红黑树:最长路径不超过最短路径的两倍(近似平衡)这样看起来,似乎 AVL树更优秀,严格平衡如果相同的数据,AVL 树可能是 18层,但是 红黑树有可能是 18 - 36 层在查找方面 AVL 树可能会比红黑树优秀一点,但是只是一点。

2024-05-04 21:58:50 1032

原创 c++ map_set 特性

map 和 set 也是 c++ 中两个很重要的关联式容器,其底层结构都为搜索二叉树,set属于 k 模型, map 属于 kv 模型序列式容器:vector/list/deque/… 单纯为了存储数据关联式容器:map/set/… 数据之间存在某种关联关系(不只是存储数据)

2024-04-29 21:34:07 498

原创 c++ AVL树的学习及简单实现

前面我们简单学习了并实现了二叉搜索树,二叉搜索树可以提高查找的效率,但是有些特殊情况下,二叉搜索树会出现问题。我们知道,单纯的二叉搜索树,时间复杂度可能不是 log(n), 而是 n, 因为如果在插入数据有序的情况下,二叉搜索树会退化成单支树(单链表),查找元素就会使效率低下。因此,两位俄罗斯的两位数学家,,G.M.Adelson-Velskii 和 E.M.LANDIS 在1962年发明了一种解决这种问题的方法:当向搜索二叉树中插入新节点后,如果能保证,即可降低树的高度,从而减少平均搜索长度。

2024-04-29 21:13:45 1042

原创 c++二叉搜索树实现

之前我们在 c 语言 学习过二叉树的实现二叉树那里,主要是为了后面学习做铺垫,比如这里的二叉搜索树。在这里学二叉搜索树,也是为了后面学习 map , set 做铺垫,同时用 c++ 实现 二叉搜索树,也方便解决一些c语言中不好处理的 oj 题。

2024-04-04 10:12:03 565 1

原创 c++多态

首先,多态和继承是密切相关的,想学习多态必须会继承。

2024-03-23 19:41:25 522 1

原创 C++继承

继承的语法相对来说很麻烦。多继承->菱形继承->虚继承,底层实现就很 复杂,所以一般不建议设计出多继承,能不涉及菱形继承就不要涉及,否则在性能和复杂度上都会存在问题。多继承可以认为是c++的缺陷之一,因为坑比较多,后面的一些语言就没有多继承(如:java)

2024-03-17 11:18:28 807 1

原创 c++ 模版进阶 + 反向迭代器的模拟实现

1. 非类型的模版参数1.1. 用法介绍先看下面一段代码:#define N 10template<class T>class stack{private: T _a[N];};int main(){ stack<int> s1; stack<int> s2; return 0;}这段代码,我们有一个 栈(stack)类,这里内部成员设置的是 静态数组。我们宏定义了 N 为 10,默认数组开辟出来的大小是10。主函数中我们用这个类创建了

2024-03-09 11:31:44 821 1

原创 c++优先级队列(priority_queue)及仿函数

先看一段代码class Lesspublic:int main()Less less;return 0;这里我们先有一个 Less 的类,在主函数中使用 Less 创建了 less 的对象,因为 Less 实现了 “()” 的运算符重载,所以创建出来的对象可以直接使用 “()”。这样使用看起来好像是一个函数(函数名,括号里是参数),因此这种方法被叫做仿函数。运算符重载后,本来我们应该这样写实际上两种写法都可以,只不过上面仿函数的写法更简单。

2024-02-27 16:38:22 930

原创 c++ list的使用 及 模拟实现

kw=list这里我们还是和前面一样,跟着文档走,主要学习和 string 和 vector 中没有的函数list允许在O(1) 的时间复杂度的情况下,进行插入删除下面是 list 中实现的函数。

2023-12-24 21:59:52 60 1

原创 c++ vector主要函数的使用

和strring类似,string是针对字符的顺序表结构,但是string在 STL 前出现,所以不算是 STL中的成员。而vector根据上面的介绍,vector是一个动态增长的数组实现的顺序容器。简单来说,vector就是个顺序表,同时要注意 vector 的实现依靠模版。每次使用vector要传入类型。

2023-11-28 21:39:12 78 1

原创 c++ 模拟实现string

这里的模拟实现string ,并不是完完全全实现库里的string,只是基于自己的理解,加强对 string 实现逻辑的理解。

2023-11-25 17:16:50 44

原创 c++ string的使用

STL(standard templete library-标准模板库);是c++标准库的重要组成部分,不仅是一个可以复用的组件库,而且是一个包含了数据结构和算法的软件框架。最主流:容器,算法其中,容器就是数据结构。算法就是排序,交换之类的。

2023-11-12 19:28:36 97 1

原创 c++动态内存管理 new与delete

这里,他会在最前面开辟4字节的空间,存储开辟的A的个数10,同时,我们需要的a1 指针会指向多开的4字节的后面,需要用到的 sizeof(A)*10 空间的前面。既然什么都不做,编译器这里就会优化不去调用析构函数,因此在调用operator delete的时候,默认后面所有的空间都已经经过析构的处理了,所以可以直接删除。这里,我们直接自己new了一块空间,这块空间出了函数作用域不会自己调用析构函数,会保存在堆上,想要销毁这块空间的话,我们需要手动delete。一般情况下不会这样写,有些特殊场景会用到。

2023-11-11 10:21:45 53 1

原创 c++ 类和对象(补充)

友元是永久性的,只要定义了就能一直使用私有成员。

2023-10-31 00:27:55 64 1

原创 c++类和对象 6个默认成员函数

如:private:int main()MyQueue mq;return 0;在 MyQueue 这个定义的类型中,我们声明的成员变量都是 Stack 类型,也就是我们上面栈的类型。对内部成员是自定义类型的,在创建对象,系统自动创建的MyQueue构造函数,会自动调用成员的构造函数。一般情况下,都需要我们自己写构造函数,决定初始化成员变量的方式。成员变量都是自定义类型的,可以考虑不写其构造函数。

2023-10-28 10:38:24 78 1

原创 c++ 日期类的实现(类和对象学习)

int 的参数只是为了区分前置和后置++函数的区别。

2023-10-25 17:11:16 95 1

原创 c++类和对象 类的初步认识 this指针

/类体:由成员函数和成员变量组成//和结构体一样,必须有分号class 为定义类的关键字class为类的名字类体中的内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法和成员函数。声明和定义全放在类体中,就像我们上面写的方式。需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。声明和定义分别放在两个文件中Stack.hpublic://成员函数声明int Top();//成员变量。

2023-10-20 14:08:26 58 3

原创 c++入门 内联函数 auto 指针空值nullptr

return 0;在上面的三个文件中,我们分别将内联函数 f 的声明和定义分别放入两个文件中。此时我们检查错误LNK2019 是预编译过程中链接过程的错误为什么会出现这样的错误?首先,我们知道,c++在预编译过程中,会在test.cpp中展开头文件,但是头文件中只有函数的声明,test.cpp中只有函数的调用,但是能通过编译汇编环节。

2023-10-18 14:47:29 156 1

原创 c++入门学习

c语言是结构化和模块化的语言,适合处理较小规模的程序,对于复杂的程序,需要高度抽象和建模时,c语言不适合,为了解决软件危机,10世界80年代,计算机界提出了OOP(object oriented programming:面向对象)的思想,支持面向对象的程序设计应用而生。

2023-10-15 16:17:09 65 2

原创 数据结构--排序

我们可以看到,因为这个gap每次是2的倍数,循环的条件是i

2023-09-28 21:22:47 467

原创 二叉树的实现及练习

从1的左子树遍历,记录3的子节点有几个,将值返回给2,记录2的子节点有几个,返回值回到第一层,然后开始右子树的遍历,最后将左子树和右子树返回来的值相加,加上1这个节点,就是总的节点个数。根据前序遍历,根,左,右,首先向左填入数据,直到遇见NULL的时候返回,然后走空节点上层的右子树,如果不为空,则继续往下填入数据,如果为空,则该节点左右节点都存在,再次返回上级。没有找到值时,一直返回的是NULL,如果找到了值,则返回对应节点,返回上一层的find接收到的不为NULL,而是值的指针,就会一层一层返上去。

2023-09-19 00:53:38 131 2

原创 二叉树基础及堆的实现

对于深度为k的,有n个结点的二叉树,当且仅当每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称之为完全二叉树,树结构相对线性表来说就较为复杂,要储存表示起来就较为麻烦,既要保存值域,又要保存结点与结点之间的关系,实际中树有很多种表示方式:双亲表示法,孩子表示法,孩子双亲表示法以及孩子兄弟表示法等。堆只是想象出来的结构,实际上的储存还是按照数组的方式储存,不管是插入还是删除数据,都是在数组上面修改。堆顶跟最后一个位置交换,最大的数据排好了,剩下的数据向下调整,选出次大的,代价是logN。

2023-09-13 00:12:59 89 1

原创 双向链表(个人学习)

1.1.单链表 1.2.双链表1.3.带头(哨兵位) 1.4.不带头1.5.循环 1.6.不循环一共8种链表。

2023-08-19 23:43:17 70

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除