
C++
文章平均质量分 73
Elib
这个人很帅但还是什么都没留下
展开
-
C++11
问题就出在当我们把参数传递给perfectforward之后,这里的T模板虽然是一个万能模板,但是注意看下一句Fun函数的调用,根据前面说所,右值是没有地址的,如果t是一个右值,那么他又如何作为参数来进行传递,这里我们看到以为t是一个右值,但其实他的本质还是一个左值。当我们实例化一个类的时候,通常会在初始化列表对其中的成员进行初始化,其成员个数也是我们需要在传参时进行匹配的个数,如果当我们传递的参数与构造函数的参数不匹配的时候它会报一个参数不匹配的错误。同样,捕捉列表也是可以结合起来的。原创 2023-10-06 12:08:30 · 385 阅读 · 11 评论 -
布隆过滤器
如果使用第一种的话,40亿个整形数据,每个整形4个字节,就大概需要将近16G的内存,一台普通家用电脑可能也才16G,那么说只跑这个程序就需要占掉电脑的所有资源,显然是行不通的,那么第一种行不通第二种当然也无法解决这个问题了。如果我现在有一家新公司要注册,但是不知道这个名字有没有被注册,那么我们就可以去这个名字对应的三个位置去查找,只要有一个位置的状态是0,那么就说明这个名字一定没有被注册,因为被注册过的一定是三个位置都位真的状态。那么,在面对海量数据的时候也是可以完美解决的。那些已经看过的内容。原创 2023-10-05 10:27:20 · 332 阅读 · 3 评论 -
AVL树的实现及原理
第一次右旋调整结束之后,我们继续往上更新,接下来进行左旋,同样根据左旋的性质,cur的leift做parent的右边,parent做cur的左边,cur做新的根,当这一次调整结束之后,这棵树又会重新符合条件。同样我们也可以根据搜索二叉树的特性,curleft是一定比parent大的,那么我们就可以让curleft去做parent的右边,parent做cur的左边,cur做新的根节点。然后在根据右旋的特性,让cur的右边成为parent的左边,parent成为cur的右边,cur成为新的根。原创 2023-10-03 13:54:26 · 402 阅读 · 3 评论 -
不过是一棵红黑树(附源码)
在数据结构学习的初期我们了解到了搜索二叉树,并且知道搜索二叉树的效率是非常之高的,在理想情况下10亿个数据中找一个值它也只需要30次左右,但是它尽管如此厉害可是也有不足的地方,在一些极端情况下,搜索二叉树可能会被退化成一棵单链表,那么此时它的效率就会大打折扣的变成O(n)。最后就会违背第4条规则,所以当叔叔不存在的时候,我们对其颜色改造之后,在进行旋转一下,让cur做parent的左边,grandfather做parent的右边,这样既不违背搜索二叉树的规则,又不违背红黑树的规则。这是红黑树就由此诞生了。原创 2023-09-20 17:09:00 · 270 阅读 · 5 评论 -
搜索二叉树
在这里我们先了解一下什么是搜索二叉树,搜索二叉树,顾名思义它要满足搜索的特征,于是就有人想出来一个办法,我能不能在创建一个树的时候,比它小的值放在左子树,比它大的值放在右子树呢,这样的话当我们要去寻找某一个节点的时候,只需要比较一下左右子树,如果这个值大就往它的右边走,比它小就往它的左边走呢。答案是否的,在某一个情况下我们想要寻找一个节点消耗的时间也是非常困难的。比如说是这样的一个搜索二叉树,它在图形上有点像我们的单链表,这样的一棵树如果要去寻找某个节点值的时候效率也是会达到o(N)的。原创 2023-08-17 11:29:17 · 426 阅读 · 1 评论 -
离多态更近一步
在不少的题目中我们时长能看见一个问题,虚表到底是存放在哪里的。当我们去往上查阅的时候都能出奇的发现一个答案,虚表是存放在静态区中的。对此我曾感到疑惑,存放数据的地方无非有栈,堆,静态区,常量区,首先我们可以排除堆区,因为系统不会自己去开一块空间来使用。接下来我们先了解一下虚表的存放体制,当一个对象在局部域中被创建出来并且它其中也有一张虚表,当局部对象被销毁后在另一个域类定义同一个对象,会发现它们使用的是同一张虚表。原创 2023-07-26 09:40:04 · 210 阅读 · 2 评论 -
虚继承是如何解决二义性和数据的冗余的
此时,我们利用B类定义一个对象,然后在用B类定义一个指针,让指针指向这个对象并且对对象中的_a进行操作,然后在让这个指针指向对象d,同样对d对象中的_a进行操作,那么此时的指针是无法知道具体指向谁的,它可能指向b对象,也可能指向d对象,所以这是就会利用偏移量,加上偏移量的值之后无论是b还是d都可以找到_a。当把虚继承关键字加上去再去观察内存的时候明显发现,此时B,C类中原本为A的数据区被写道了最后一个位置,而原本的位置变成了一个地址,如果我们通过地址找过去看看又会发现什么。那么这个偏移量是用来干什么的呢。原创 2023-07-23 18:04:24 · 422 阅读 · 3 评论 -
浅谈优先级队列
优先级队列就如何它的名字一样,同样是一个队列,同样遵循先入先出的规则,但不同的是它被叫做优先级队列,如同它的名字一样,在它内部是按照优先级来排序的,优先级也决定了哪个数据会被先出队列。当我们写下这样一段代码之后发现,less并不是向我们想象的一样是小的数先出队列,而是较大的数先出队列,那么说明less按小于比较,并且会将小于的数放在队列后面,对此我们可以试一试如果用大于来比较会不会是相反的结果。其实它的底部是利用了一个建堆的算法,当一个数进入队列之后,会对这个数进行比较,如果这个数较大就会把它往顶上推。原创 2023-07-22 12:00:11 · 151 阅读 · 0 评论 -
List迭代器是如何实现的
最后当我们看完之后发现list并没有像vector或者string那样,对[]进行重载,原因是因为,由于list的存储结构是链式状的,当我们想像vector那样去用[]对其访问时是无法知道[]的位置的。了之后发现,迭代器的++行为实际上是将当前结点的指针改为下一个结点的指针,那么由此我们可以得出,当使用--操作的时候实际上是将当前指针的指向改为上一个结点。此时我们就会好奇,链表是不像顺序表那样进行++操作的时候它通过顺序表的结构优势直接找到下一个位置,对其解引用同样可以直接拿到它的值的。原创 2023-07-19 17:36:25 · 1475 阅读 · 2 评论 -
Vector迭代器失效问题
或者还有一种情况就是,当我们需要连续的删除容器中某个数据的时候,刚好这个数据在最后一个位置,那么同样也是会造成问题的,从vector底层来看,vector的迭代器实际上是个指针来判断的,第一个是_start,第二个个是_finish 第三个是_endofstorage,在删除最后一个元素的时候实际上是_finish向前挪动的一个数据,所以当我们再去判断的时候此时it指针已经越过了_finish造成了边界判断失效的问题。当我们在使用vector的迭代器的的时候,感觉思路上是没有问题的,但是就是会报错。原创 2023-07-18 18:24:36 · 395 阅读 · 0 评论 -
string底层是如何实现的
首先看第一种,n比size小很好实现,我们不必真的去删除后面的字符,直接可以在n的地方放一个字符0来表示结束就行,那么第二种情况和第三种情况我们都可以并为一种,无论是比总容量大还是比总容量小,我们都直接释放掉当前指针指向的那块空间,然后去新开一一块大小为n+的空间,把新的空间给到原来的空间。在我们学习的时候总是会用到string,知道它具备各种功能,它也是一种很强大的模板,那么有没有想过,我们天天都在使用的它,它的底层又是怎么样的,它又是如何实现的呢。那么什么是有效字符呢,就是在对象中实际的字符串长度、原创 2023-07-07 17:10:07 · 458 阅读 · 1 评论