c++
文章平均质量分 67
吴所试试
励志成为码龙
展开
-
4月11日作业修订
条件变量提供了一个pcb队列以及阻塞和唤醒的接口实现同步,但是什么时候唤醒以及什么时候阻塞线程是由程序员控制的,而这个控制是需要一个共享资源来决定的,所以需要搭配上一个互斥锁来进行使用来保护这个共享资源的条件判断和操作。A.这主要看你互斥锁锁的资源是那部分的,如果是进程内资源,则可以实现同一进程不同线程之间的互斥,而如果将共享内存作为互斥锁进行操作则可以实现不同进程之间的互斥。条件变量被唤醒时,需要重新进行条件判断,因为有的线程卡在锁的地方,一个线程结束后,直接进入还是会导致数据的二意。原创 2023-04-12 01:30:00 · 658 阅读 · 1 评论 -
《图的基础概念》
注意:有向图中每条边在邻接表中只出现一次,与顶点vi对应的邻接表所含节点的个数,就是该节点的出度,但是如果你想要找到节点的入度,你必须去检查所有顶点对应的边链表,看看有多少顶点的目的值是i。使用邻接矩阵存储图的优点就是能过去快速的知道这两个顶点是否连通,缺陷是如果顶点比较多,边比较少时,矩阵中存储了大量的0成为系数矩阵,比较浪费空间,并且要求两个节点之间的路径不是很好求。联通图:在无向图中,若从顶点v1到顶点v2有路径,则顶点v1和顶点v2是联通的,如果图中任意一对顶点都是联通的,则这个图就是连通图。原创 2023-01-04 00:00:00 · 407 阅读 · 1 评论 -
《B-树》
对于一颗节点为N度为M的B-树,查找和插入需要logM-1N次进行比较,这个还是比较好证明:对于度为M的B-树,每一个节点的个数为M/2~(M-1)之间,因此树的高度应该要在logM-1和logM/2N之间,在定位到该节点之后,使用二分查找就可以定位到元素,知道为什么在这里能进行二分查找吗?以上结构适合于数据量不是很大的情况下,如果数据量是非常大的,一次无法加载到内存中,使用上述结构就不是很方便,需要多次IO。1.如果树为空,直接插入新节点中,该节点为树的根节点。tips:B-树读成b树,并不是b减树。原创 2023-01-02 00:45:00 · 315 阅读 · 0 评论 -
《LRU Cache》
狭义 的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较 快速的SRAM技术。Cache的容量是有限的,因此当cache的容量用完之后,而又有新的内容需要添加进来时,就需要挑选并且舍弃原有的部分内容,从而腾出空间来释放新的内容,LRU Cache的替换原则就是将最近最少使用的类容去替换掉,其实LRU Cache翻译成最久未使用会更加的贴合形象,因为该算法每次替换掉的就是一段时间内最久没有使用过的内容。【二】LRU Cache的模拟实现。原创 2022-12-30 00:45:00 · 154 阅读 · 0 评论 -
《并查集》
在一些应用问题中,需要将n个不同的元素划分为一些不相交的集合,开始时,每个元素自成一个单元素集合,然后按照一定的规律将归于同一组的集合合并,在此过程中要反复用到查询某一个元素归属于那个集合的运算,适合于描述这类问题的抽象数据类型称之为并查集。从底层上来说,并查集就是一个数组罢了,如果向取找到一个标记位的父节点的话,只需向上不断地递进,找到值小于零的标记位,这就是父节点,若想看这两个元素有没有关系,你就分别找各自的父节点,如果两者的父节点相同,就说明这两个是有关系的。1.数组的下标对应集合中元素的编号。原创 2022-12-28 17:26:04 · 453 阅读 · 0 评论 -
《位图&布隆过滤器》
一般来说,计算机中的集合是用哈希表来存储的是,它的好处是快速准确,缺点是废内存,当集合较小时,这个问题不是十分明显,但是如果集合是很巨大的时,哈希表存储效率是非常低下的。如果使用哈希表来存储,则需要200g左右的内存,而一般的电脑上是很难达到这样的内存规格的。布隆过滤器由布隆在布隆在1970年提出的一种紧凑型,比较巧妙的概率型数据结构,特点是高效的插入和查询,可以用来告诉你某样东西一定不存在或者可能存在,它由多个哈希函数,将一个数据映射到位图结构中,此种方式不仅可以提升查询效率吗,也可以节省大量的空间。原创 2022-12-28 01:00:00 · 511 阅读 · 0 评论 -
《哈希表》
桶的个数是一定的,随着元素的不断插入,每个桶中元素的个数不断增多,极端条件下,可能会导致一个桶节点非常多,会影响的哈希表的性能,因此在一定条件下需要对哈希表进行增容,那该条件怎么确认呢?研究表明:当表的长度为质数且表装载因子不超过0.5时,新的表项一定能够插入,而且任何一个位置不会被探测两次,因此只要表中有一半的空位置,就不会存在表满的问题,在搜索时可以不考虑表装满的情况,但在插入时必须确保表的状态因子不超过0.5,如果超出必须要进行增容,所以比散列的最大缺陷就是空间利用率低,这也是哈希的缺陷。原创 2022-12-27 02:00:00 · 1294 阅读 · 0 评论 -
《二叉平衡树(一)》
二叉搜索树虽然可以缩短查找的效率,但如果数据有序或者是接近有序二叉树就会退化为单只树,查找元素相当于在顺序表中查找元素,效率低下,因此俄罗斯两个大佬数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种 解决上述问题的方法:当二叉搜索树插入新节点后,如果能保证每个节点的左右子树高度之差的绝对值不超过1(需要对树中的节点进行调整),就可以降低树的高度,从而减少平均搜索长度。插入和删除操作,也都是建立在查找的基础上的,那么二叉搜索树的查找效率是多少呢?原创 2022-12-23 19:54:05 · 479 阅读 · 0 评论 -
《MySQL索引事务》
脏读问题:事务a在对某个数据进行修改时,修改的时候,事务b去读取了这个数据,此时事务b读到的可能是一个“脏数据”(这个数据是一个临时的结果,而不是最终的结果),出现了脏读的问题,原因就是事务和事务之间,没有进行任何的隔离,加上了一些约束限制,就可以有效地避免脏读问题。处理脏读:给写操作加锁!在修改的过程中,别人不能读了(加锁的状态),等改完之后,别人才能读(解除加锁),我和我室友说现在别抄,等我去给老师检查完了之后,你们再抄,一旦加上这个写锁之后,意味着事务之间的隔离性就高了,并发性就降低了。原创 2022-12-17 00:08:32 · 601 阅读 · 1 评论 -
《数据在外设中的存储》
【一】磁盘的物理结构 我们现在很少看到磁盘了,我们电脑使用的大部分使用的是nvme协议的固态硬盘,差一点的使用的是sata固态接口的硬盘了,磁盘在我们电脑上尤其是笔记本电脑上是很少存在的,难道磁盘真的穷途末路了吗?显然不是,在企业端,磁盘依旧是主流,这是为什么呢?因为出于成本和稳定性考虑。 相同容量的固态和磁盘,固态的价格要比磁盘高上三倍以上,且固态是一个电子元器件,如果遭受到了不可逆的损伤,数据恢复的可能性为0,且长时间断电的情况下,固态内的数据会出现短暂丢失且不能恢复的情况,原创 2022-12-06 00:41:20 · 298 阅读 · 0 评论 -
《vector和list 的对比》
扩容的时候,会将原本的空间丢弃,然后开辟出一块新的空间,这样就会造成计算机额外的消耗,且开辟的空间大小无论是原本的两倍,一点五倍或者其他,都会存在一定的空间浪费,如果你开始数据小的,浪费的并不是十分明显,如果当数据量达到一定的时候,你就会发现,你开辟两倍的空间,是非常多余的。因为内存空间是连续的,当cpu告诉缓存加载数据的时候,是加载一部分的空间,不仅仅是你需要的一块数据的空间,所以你访问时,你加加的时候,不需要重新加载一块新的空间,这也就节省了很多时间和提升了程序运行的效率。2.cpu高速缓存命中率低。原创 2022-12-02 12:14:09 · 1231 阅读 · 0 评论 -
《Linux下的进程创建》
返回值:fork函数的返回值是非常有意思的,他是有两个返回值的,对于父进程来说,返回值是子进程的id,对于子进程来说,返回值是0,但是如果子进程创建失败则返回-1.这就是关于这期所有的进程的内容,如果有什么遗漏或者有问题的地方,还请移步于评论区交流,如果觉得写的还不错的话,还请一件三连,毕竟码字不易。在Linux中fork函数是非常重要的,他从已存在的进程中创建一个新进程,进程为子进程,而原进程为父进程。1.之前说过,子进程退出,父进程退出,父进程如果不管不顾,就可能造成僵尸进程的问题,进而造成内存泄漏。原创 2022-11-15 23:31:54 · 288 阅读 · 0 评论 -
《进程状态》
一个CPU只能有一个运行队列,本质上进程都是以链表的形式将结构体对象放入运行队列中,让进程pcb在runqueue,就是R,所以并不是这个进程在运行就是运行状态,且不要以为你的进程只会占用你的CPU资源,你的进程,也可能随时随地要外设资源。阻塞状态:其中一个很重要的外设就是磁盘,因为磁盘的不管是上传还是加载速度都是很慢的,而且各个进程或多或少的都要去访问他,这个时候就排起了队,然后挨个访问磁盘,这个时候这些进程就叫做阻塞进程。所谓的进程不同的状态,本质上就是进程在不同的队列中,等待某种资源。原创 2022-11-06 10:19:20 · 556 阅读 · 2 评论 -
《进程的概念(一)》
以上就是关于进程的浅析,如果写的有问题还请位于评论区斧正,如果没问题的话,还请一件三连,点点关注。负数:如果出错,则fork()返回-1,此时没有创建新的进程,最初的进程任然运行。内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。这个手册告诉我们folk是用来创建一个进程的,且目前这个进程是他的父进程。进程信息被放置在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。I/O状态信息:包括现实的I/O请求,分配给进程的和被进程使用的文件列表。原创 2022-10-30 20:34:42 · 322 阅读 · 1 评论 -
《Linux调试器-gdb使用》
以上就是关于gdb下调试的命令指示,如果有问题的还请在评论区斧正,觉得本人说的还不错的话还请一键三连,比较码字不易,还请给给关注。list/l 行号:现实binFile源代码,接着上次的位置往下列,每次列10行。3.要使用gdb调试,必须要在源代码生成二进制程序的时候,加上了-g选项。print/p:打印表达式的值,通过表达式可以修改变量的值或者调用函数。display +变量名:跟踪查看一个变量,每次停下来都显示他的值。list/l +函数名:列出某个函数的源代码。info break;原创 2022-10-29 22:43:25 · 283 阅读 · 1 评论 -
《vim的基础使用》
答:命令模式的意义就是极大的提高编写效率,有的人就要问了,vim模式下代码那么难写,为何还能提升代码的编写效率,因为你想想你有时候一个c语言文件很长,一万行,你在vs的条件下编写,你需要翻到最后,你是不是就很难搞,滑鼠标滚轮都划半天,但是你在vim中就简单的使用一个命令即可。gcc -E wu.c -o wu.i 从现在开始,进行程序的编译,当你预处理做完,就停下来,且将文件生成的文件导入wu.i中。1.vim的配置,是一人一份的,一个用户的配置的配置是自己的,不影响别人!原创 2022-10-23 19:58:36 · 354 阅读 · 0 评论 -
《C++ STL介绍和String类的初阶》(仅做了解)
C语言中,字符串是以‘\0’结尾的一些字符串的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分开的,不太符合OPP的思想,而且底层空间需要用户自己管理,稍不留神可能面临越界访问。是在惠普实验室完成的初始版本,本着开源精神,他们声明允许任何人任意拷贝,运用,拷贝,修改,商业使用这些代码,毋须付费,但是唯一的条件就是也需要像原始版本做开源处理,HP版本,所有STL库的祖宗。c.string类是使用char作为他的字符类型,使用他的char_traits和分配器类型。原创 2022-10-23 00:27:34 · 347 阅读 · 0 评论 -
《C++内存管理结尾和模板》
什么是内存泄漏:内存泄漏是指因为疏忽或者错误造成程序未能释放已经不在使用的内存的情况,内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为程序涉及错误,失去了对该段内存的控制,因而造成了内存的浪费。类模板实例化与函数模板实例化不同,类函数实例化需要在类模板名字后面跟上,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。1.重载的函数仅仅是类型的不同,代码重复的利用率比较低,只要有新的类型出现时,就需要维护自己增加对应的函数。原创 2022-10-18 16:03:27 · 504 阅读 · 1 评论 -
《Linux下软件的管理》
在Linux下安装软件,一个通常的办法就是下载程序的源代码,并经行编译,既可得到可执行程序,但是这种办法属实是太麻烦了,因为下载要时间,编译要时间,可能有的小伙伴认为编译是一件很简单的事情,因为我们写的代码基本上按下F5后基本上三秒就能编译完成,但是对于一个普通软件来说,编译这件事属实是耗费世间,基本上都是三小时起步。在命令模式下,shift+;就会进入地行模式,输入不同的命令行,就会有不同的结果。vim在是一个多模式的编辑器,目前有13种编译模式,我们日常能用到的只有三种,正常模式,插入模式,末行模式。原创 2022-10-16 23:20:08 · 307 阅读 · 1 评论 -
《C++内存管理》
new和delete是用户进行动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。realloc将原有的空间扩容,如果原空间足够,就在原地址上扩容,如果原有的空间地址不太够,那么就另找一块空间开辟出相应的大小,再将原有的空间的数据拷贝到这个空间上来,然后释放原有空间。calloc开辟出空间,并将开辟出的空间初始化为0。原创 2022-10-16 01:45:00 · 387 阅读 · 0 评论 -
《C++类中拷贝构造函数及赋值运算符重载》
答案是否定的,只能拷贝出那个申请出的头指针,且使用析构函数析构的时候,会出现二次析构的情况。7.原因:赋值运算符如果不显示实现,编译器会生成一个默认的,此时用户在类外自己实现一个全局的赋值运算符重载,就和编译器中生成的默认运算符重载冲突了,所以赋值运算符重载只能是类的成员函数。C++为了增强代码的可读性引入了运算符的重载,运算符重载是具有特殊函数名的函数,也具有其返回值的类型,函数名字以及参数列表,其返回值与参数列表与普通的函数类似。1.拷贝构造函数是构造函数的一个重载形式(因为都是用来初始化类的)。原创 2022-10-11 16:03:46 · 679 阅读 · 0 评论 -
《C++类中的基本常识》
即:C++编译器给每个“非静态的成员函数增加了一个隐藏的指针参数this,让该指针指向当面对象(函数运行时调用该函数的对象),在函数体中所有的“”成员变量”的操作,都是通过该指针去访问。正常情况下,在类中函数编写的时候就会出现一个非常尴尬的问题就是,我们参数名和类中名字是相同的,这个时候就会出现一个特别尴尬的问题,就是我们傻傻分不清这个这个成员是这个本身类中的还是参数类中的,这个时候C++中通过引入this指针在解决这个问题。默认成员函数:用户没有显示显现,编译器会生成的成员函数称为默认成员函数。原创 2022-10-11 00:47:03 · 324 阅读 · 1 评论 -
《Linux权限》
其实这个还是比较好理解的,就是在对应的位置上 1表示有此项权限0表示无此项权限 然后转化为二进制,再将二进制转化为八进制。说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。ii.写(w):write对文件而言,具有修改文件内容的权限;iii.执行(x):execute对文件而言,具有执行文件的权限;i.读(r):Read对文件而言,具有读取文件内容的权限;tips:超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。文件和文件目录的所有者所在的组的用户:g--Group。原创 2022-10-09 23:06:24 · 191 阅读 · 0 评论 -
《Linux基本常识的介绍》
首先是免费,作为一家商业企业,坑定是想将利润最大化,能不出钱就不出钱,这点linux做的很好,因为他是开源的,所以这个是免费的,其次也是因为这个是开源的,所有的源代码是清晰可见的,这也就是意味着安全性得到了极大的提高,不会出现一种叫做“后门”的东西,这也就为企业的数据得到了极大的保证。2.使用虚拟机软件,将Linux搭建在虚拟机上,但是由于当前的虚拟机软件(如VMWare之类的)会存在一些莫名奇妙的bug,比较折腾,这个环境搭建的方式本人前面的文章有具体的操作步骤,大家有兴趣可以去看看。原创 2022-10-02 15:16:01 · 587 阅读 · 0 评论 -
《C++析构函数及其拷贝构造函数和运算符重载》
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作也是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。前面我们知道了函数的重载,这里我们又看到了运算符的重载,其实他的原理和函数的重载是一样的,有具体的函数名和其参数列表,其返回值类型和参数列表和普通的函数类似。tips:注意在编译器生成默认的拷贝构造函数中,内置类型是按照字节方式直接实现的拷贝的,而自定义类型是调用其拷贝函数完成拷贝的。5.编译器生成的默认析构函数,对自定义类型成员调用它的析构函数。原创 2022-09-24 16:52:56 · 689 阅读 · 0 评论 -
《C++中的引用》
tips:这里就涉及到一个c/c++部分一个很简单的问题,就是权限的放大缩小问题,使用const修饰之后相当于这个变量就成了仅可读的权限,但是在c/c++里面权限只能缩小且不能放大,你将这个变量赋给另外一个可以赋值的变量这显然是权限放大,显然是不允许的。从这行代码大家可以看出,使用const修饰之后,你会发现引用的对象不能修改了,引用本身也不能修改了,相当于这个引用对象变成了一个只读的权限。有的人说当使用const关键字修饰引用的时候到底是引用的对象不能修改,但是引用对象的数值不能修改?原创 2022-09-16 14:56:43 · 208 阅读 · 0 评论