- 博客(29)
- 收藏
- 关注
原创 C++11基础
std:initializer_list一般是作为构造函数的参数,C++11对STL中的许多容器都增加了std:initializer_list作为参数的构造函数,这样对初始化容器对象就更方便了,也可以作为operator=的参数,这样就可以用大括号赋值。范围for本质上是由迭代器支持的,在代码编译的时候,编译器会自动将范围for替换为迭代器的形式。C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
2024-06-25 17:07:12
959
原创 哈希应用——布隆过滤器
场景一:在注册账号设置昵称的时候,为了保证每个用户昵称的唯一性,系统必须检测你输入的昵称是否被使用过,这本质就是一个key的模型,我们只需要判断这个昵称被用过,还是没被用过。场景二:我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时都要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推荐去重的?用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录,如何快速查找呢?
2024-06-12 17:16:56
965
原创 数据结构——bitset(位图)模拟实现
第一种:构造一个8位的位图,所有为初始化为0//00000000第二种:构造一个8位的位图,根据所给的值初始化位图前N位//01100100第三种:构造一个8位的位图,根据字符串中的0/1序列来初始化位图的前N位//00111001。
2024-06-11 17:25:41
679
原创 哈希桶封装unordered_map、unordered_set
我们将由下列的哈希桶来模拟封装STL库中的unordered_map和unordered_set注意:为了实现封装unordered_map和unordered_set,我们需要对下列源码进行优化。
2024-06-08 16:27:18
886
原创 数据结构——哈希表、哈希桶
此时,我们可根据哈希表的大小,选择其中各种符号分布均匀的若干位作为哈希地址。顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较,顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN),搜索的效率取决于搜索过程种元素的比较次数。与闭散列的哈希表不同的是,在实现开散列的哈希表时,我们不用为哈希表中的每个位置设置一个状态字段,因为在开散列的哈希表中,我们将哈希地址相同的元素都放到了同一个哈希桶中,并不需要经过探测寻找所谓的“下一个位置”。
2024-06-03 10:38:23
1311
4
原创 红黑树封装map和set
我们将由下列的KV模型红黑树来模拟封装STL库中的map和set注意:为了实现封装map和set,我们需要对下列源码进行优化。
2024-05-26 15:35:50
899
原创 数据结构——红黑树
首先,为了增加代码的可读性与后续操作的方便,这里采用枚举来定义结构体到颜色。而在定义结点的时候,我们可以采用与AVL树相同的方法,为了后续方便旋转操作,结点里面含有相互链接的三叉链。那么,为什么在构造函数里,颜色会初始化为红色呢?按照红黑树的性质,假设:1.初始化为黑色,那么原本符合要求的树,插入一个黑色结点后,一定会有一条路径多出一个黑色结点,那么此时红黑树的性质将会被破坏(每条路径的黑色结点数量相等),必须调整。
2024-05-24 00:40:16
660
原创 数据结构——AVL树
在结点的定义中,我们直接定义成KV模型的结点,并新增一个平衡因子,还有一个_parent指针,也就是说,该结点拥有三个指针+一对键值对+一个平衡因子,在初始化时指针都初始化为空,平衡因子设定成0。//左子树指针//右子树指针//每个结点都包含了一个父结点地址//键值对int _bf;//平衡因子//构造函数, _kv(kv), _bf(0){}
2024-05-16 14:58:44
1061
原创 C++ map set
1.set是按照一定次序存储元素的容器。2.在set中,元素的value也表示它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能再容器中修改(元素总是const),但是可以从容器中插入或删除它们。3.在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4.set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。5.set在底层是用二叉搜索树(红黑树)实现的。
2024-05-08 19:27:54
683
原创 C++多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如student继承了Person。Person对象全价买票,student对象半价买票。在继承中要构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数。2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-04-26 19:59:07
558
1
原创 C++三大特性(1)——继承
1.基类的private成员无论以什么方式继承,在派生类中都是不可见的,这里的不可见是指基类的私有成员虽然被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。2.基类的private成员在派生类中是不能被访问的,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就需要定义为protected,由此可以看出,protected限定符是因继承才出现的。
2024-04-12 21:10:12
837
原创 Linux入门常见指令
语法:s [选项功能:想查看当前目录的所有子文件与文件夹,直接输入ls然后回车即可,但是ls可以尾接许多选项例如: ls -a,这个是显示当前目录的所有文件,包括隐藏文件诸如此类的常用的有:-a列出目录下的所有文件,包括以 . 开头的隐含文件-d将目录象文件一样显示,而不是显示其下的文件。如:ls –d 指定目录-i输出文件的 i 节点的索引信息。如 ls –ai 指定文件-k以 k 字节的形式表示文件的大小。ls –alk 指定文件-l列出文件的详细信息-n。
2024-04-11 16:40:48
860
原创 C++模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。例如,在之前的STL容器模拟实现的时候,大家就很喜欢在.h头文件中写代码,如何在.cpp源文件中直接测试即可优点1.模板服用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性缺点1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-03-30 17:40:24
799
1
原创 C++ stack和queue
queue是平常所说的队列,队列就像平常排队吃饭一样,先到的就有饭吃,只能从一端进,另一端出,也就是先入队的先出队,后入队的后出队。
2024-03-21 15:47:52
433
1
原创 C++ list模拟实现
/迭代器类//指向结点的指针:_node(n){}return tmp;return tmp;= s._node;= s._node;
2024-03-17 13:32:33
927
1
原创 C++ vector模拟实现
在完成了string类模拟后,我们已经了解了许多函数的用法,那么vector的函数用法与string有很多相似的地方。
2024-03-10 21:12:19
857
1
原创 C++ 模拟实现string类
在上一篇中,我们已经初步了解了string类的各种函数。接下来我们就开始模拟实现这些函数吧需要注意的是,由于在标准库中已经有了string类,所以我们在模拟实现string类时需要使用自己命名的空间,例如namespace bear等在一个string类对象种,除了有str字符,还需要有目前字符串的有效长度size与目前的字符串容量capacity,为了区分原来的标准库,我们都在前面加上_来区别。
2024-03-03 14:56:35
694
原创 C++ STL库——Sring类
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
2024-02-15 17:00:15
848
2
原创 c++类与对象(三)收尾
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造哦函数体中的语句只能将其称为赋初值,而不能称作初始化,因为初始化只能初始化一次,而构造函数体内可以多次赋值初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,而每个成员变量后面跟一个放在括号中的初始值或表达式。注意:1.每个成员变量在初始化列表中只能出现一次(因为初始化只能初始化一次)2.类中包含以下成员,必须放
2023-12-02 15:16:47
1177
5
原创 c++类与对象(二) 类的六大默认成员函数及其日期类实现
本章我们来学习六个默认成员函数,随后通过学习的内容来模拟实现一个日期类。如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
2023-11-29 15:25:49
1028
4
原创 c语言实现八大排序
思想:也是定义左指针left与右指针right,key对应的下标为piti,然后将左边第一个元素放到key里面,然后此时左边就有了坑,然后右边开始往前走,遇到比key小的,则与key交换,那么此时右指针的地方则变成新坑,然后左边走,左边遇到比key大的数则交换,然后左边变成新坑,以此类推,当相遇时停止,然后将key放进相遇的坑位,然后分割成两个左右数组,左数组为[0,piti-1],而右数组为[piti+1,n-1],然后就是一样的对左右数组进行重新排序,不断地递归。
2023-11-07 18:24:14
264
4
原创 二叉树的链式结构实现以及前序,中序,后序遍历
二叉树可以由数组实现也可以由链表实现,数组的实现在堆排序重已经大致了解,现在可以使用链表来完成只需要创建一个结构体,用来存放节点数据已经左子树的地址和右子树的地址即可代码如下: 在上述代码中,创建出的二叉树由下图所示:二叉树的前序,中序,后序遍历通常使用递归方式进行,而前中后对应如下:前序:先访问树的根节点,再访问左子树,最后访问右子树中序:先访问左子树,再访问数的根节点,最后访问右子树后序:先访问左子树,再访问右子树,最后访问树的根节点可以发现,前中后对应的是根节点的访问的先后顺序那么和递归有什么
2023-10-24 12:58:49
132
2
原创 堆的创建以及堆排序(向上排序算法,向下排序算法)
注意,假设目前是一个小根堆,假如要移除堆顶的数据会破坏堆的特性,失去了一个根节点,会变得非常复杂,所以我们这里并不是简单的移除堆顶的数据,我们可以先临时将堆尾的数据与要删除的堆顶数据交换,然后再将交换后的堆尾(原堆顶)的数据删除,然后再将堆顶的数据(原堆尾)使用向下排序法进行调整即可。如上图:假设为小根堆,现在插入了一个数据10,将它与它的父亲节点比较,假如比父亲节点小,则将它们俩的位置交换,然后再将交换后的数据再与父亲节点比较,以此类推。,所以我们每插入一个数据都需要使用到向上排序算法,来满足堆的特性。
2023-10-17 21:32:43
242
原创 C语言实现栈和队列
在main函数的teststack函数中,我们插入了123456六个元素,然后循环打印,每打印一次然后再将栈顶的元素取出,最后打印完成再回收空间,代码运行结果如下。在main函数中的test函数中,我们插入了123456六个元素,然后循环打印,每打印一次然后再将队头的元素取出并销毁,代码运行结果如下。首先,先将基本的栈实现函数列举出来,并定义一个可动态增长的数组来模拟存放栈(后续需要使用到向系统申请空间的知识)队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出。
2023-10-14 15:03:31
198
原创 C语言实现单链表及其打印
(比如第一个空间地址是A,第二个是B,第三个是C,第四个是D,那么第一个空间的指针是第二个空间的地址,第二个空间的指针是第三个空间的地址,以此类推)单链表与顺序表的不同之处就是:单链表并不会和顺序表一样有对应的下标,单链表的每个空间的地址是不连续的,但是每个空间都会有一个指针指向下一个空间,所以从空间来说是连续的。由上图可看见,n1->next是存有n2的地址,n2->next是存有n3的地址,而最后一个n4->next是指向空,此时说明我们的单链表创建成功了。当然是赋NULL,空指针。
2023-09-24 11:51:51
929
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人