在这里我们首先学习两个新的知识点第一个: 第二个: 下面我们再来理解思考下面的四个问题: 我们首先来解决第一个问题如果新建一个文件Linux系统会做什么呢? 新建文件,系统会做什么 当我们要新建一个文件的时候,我们肯定是在系统的一个文件路径下去新建的,这个路径能够帮助我们确定清楚这个文件是在哪一个分区中(C盘还是D盘还是其它盘),以及在哪一个分组(分组就是上一节说的800G被划分成了好几份,第一个200G就是一个分区,然后我们在将200G划分成为好多不同的组(每个组10G{假设}))里面(通过路径就能够确认)。我们暂时不将分组加上,至少通过路径我们能够确认的就是哪一个分区里面。那么现在我...

在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C98/03标准。从C0x到C11,C标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C98/03,C11则带来了数量可观的变化,其中包含了约140个新特性,以及对C03标准中约600个缺陷的修正,这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言,C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不...

位图 题目: 第一种方法:二分查找。虽然二分的时间复杂度为o(log n),但是这个方法是不可行的,我们就算假设这40亿个数据是已经排序完成了的数据,但是40亿个整数在内存需要消耗的内存就是差不多16G,这个消耗是非常巨大的,并且这16个g还必须是连续的空间。(这里最大的问题就是内存很难开出这样巨大的空间),放到红黑树,和哈希表自然也是不可行的,因为这些还具有其它的消耗(红黑树,哈希表的结构体中的其它消耗)。 分析一下这里其实询问的是我们去标记一个值到底在不在,而标记一个值到底在不在的最小的单位是bite。 因此这里我们就让每一个值映射一个bite,此时40亿个整数需要多少内存,多...

exec系列接口中的环境变量 在之前我们学习了exec系类函数的功能就是将一个程序替换成另外一个程序。 然后就会出现下面的问题: 首先父进程对应的环境变量的信息是从bash中来的,因为我们自己写的父进程在运行的时候首先就要成为bash的子进程。这里我们将bash称为祖父进程,我们自己写的父进程,和父进程创建的进程为孙子进程。这三位其实使用都是一套环境变量(bash的环境变量)。在这里我们在bash中导入一个myval环境变量,然后父进程会继承bash的环境变量,而孙子进程也会继承父进程的环境变量。那么在孙子进程处打印环境变量我们应该可以看到MYVAL的环境变量。 下面就是在孙子进程中打印了所...

AVL树的规则 在学习AVL树插入节点的方式之前,我们首先要理解为什么要出现AVL树,首先我们要知道的是AVL树是在二叉搜索树的基础上增加一些限制条件才完成的。那么AVL树就是为了处理二叉搜索树的缺点而出现的一棵树,那么普通的二叉搜索树的缺点是什么呢? 假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。 而为了解决这个问题,AVL树就在二叉搜索树的基础上增加了这些规则。 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) ...

序列式容器和关联性容器 首先序列式容器和我们之前学的线性表很相似,序列式容器的功能就只是单纯的储存数据。序列式容器例如:vactor/list/deque等等 而关联式容器则并不单纯的储存数据,数据之间式存在关联关系的,有了这个关联关系我们才能更好地去做查找。关联式容器由map/set等等。 两者的的区别,我要往map中插入一个数据,我能不能保证这个节点一定插在根节点的左子树上呢?很明显是不能的,而我想往vector的中部,头部,尾部任意一个位置插入数据都是可行的。 所以我们要知道关联式容器,并不是单纯的为了储存数据。 set接口简介 set是包含在头文件set中的 include<se...

对于进程控制的第一个学习部分那就是使用fork去创建子进程这一部分,请去复习fork那一节的笔记。 这里我们主要学习一个在使用fork创建子进程的时候,是如何进行写时拷贝的,在之前的那一节fork的学习中我们学习到的是使用fork创建一个子进程,这里我们要学习的是使用代码去创建多个进程。 使用fork创建子进程 这里当我们使用fork创建子进程之后,对于父进程会返回子进程的pid,对于子进程会返回0。那么我们在代码中使用一个pid_t的变量(a)来储存fork的返回值。那么再将fork返回的值赋值给a的时候,就发生了写入,此时os发现这个变量父进程的页表和子进程的页表中都有一个相同的虚拟地址...

对于进程控制的第一个学习部分那就是使用fork去创建子进程这一部分,请去复习fork那一节的笔记。 这里我们主要学习一个在使用fork创建子进程的时候,是如何进行写时拷贝的,在之前的那一节fork的学习中我们学习到的是使用fork创建一个子进程,这里我们要学习的是使用代码去创建多个进程。 使用fork创建子进程 这里当我们使用fork创建子进程之后,对于父进程会返回子进程的pid,对于子进程会返回0。那么我们在代码中使用一个pid_t的变量(a)来储存fork的返回值。那么再将fork返回的值赋值给a的时候,就发生了写入,此时os发现这个变量父进程的页表和子进程的页表中都有一个相同的虚拟地址指...

本篇博客主要是讲解什么是二叉搜索树,以及模拟实现二叉搜索树的插入节点,中序遍历,查找特定节点,以及删除节点。 什么是二叉搜索树 首先二叉搜索树肯定是一棵二叉树,对于二叉树我们应该是陌生了。而我们在学习二叉树的时候知道,如果只是一棵普通的二叉树,用来储存数据是没有任何意义的,因为如果我们将数据放到一个普通的二叉树上,那么当我们需要查找这个值的时候我们只能将整棵树都遍历一遍,我们才能找到这个这个节点在二叉树中的位置。这和我们普通的使用数组没有什么区别。 二叉搜索树则不同 我们下面来看二叉搜素树的特点: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1.若它的左子树不为空...

经过之前的学习我们知道了,继承能够实现多态的原理就是,在继承的父类和子类中各自存在一个虚表,父类和子类的虚表中各自储存了自己的虚函数,不同的点就是如果我们完成了虚函数的重写,那么子类(派生类)虚表中的那个虚函数地址是重写后的虚函数的地址。所以我们虚函数重写还有一个名字就是虚函数的覆盖,形象一点的说,那么虚函数的重写,就是子类将重写后的虚函数的地址,覆盖在了为重写前的虚函数的地址上。当然这只是一个形象的说法而已,底层不一定就是这样做的。下面我们再来深入的理解一下多态的实现。 虚函数表和虚函数的存在位置 首先我们知道正是因为虚表的存在所以才存在了多态,那么我们思考一下,虚表以及虚函数是存在哪一个区...

什么是多态 我们让不同的对象去完成同一件事情,这件事情的结果是不一样的,例如买火车票,我们学生买火车票,普通人买火车票,或是军人买火车票最后结果都是不一样的。 多态的要求是什么 首先一定是要在继承中 虚函数重写 必须是父类的指针或是引用去调用 例如下面的这个代码就构成了多态: classPerson{ public: virtualvoidBuyTicket() { cout<<"买票-全价"<<endl; } }; classStudent:publicPerson{ public: virtualvoidBuyTicket()//这里的Studen...

首先我们先回忆一下,在派生类(子类)中默认的成员函数做了什么事情?我们现在可以这么认为对于普通类来说呢?只需要看待两个部分的成员:内置类型和自定义类型。而对于派生类而言序言看待三个部分的成员:内置类型,自定义类型以及父类 类型 构造和析构 拷贝构造 普通类 对于内置类型一般不处理,自定类型调用自定义类型的构造和析构 对于内置类型完成值拷贝,对于自定义类型调用自定义类型的拷贝构造函数 派生类 和上面的基本一样,但是还需要去显示调用父类的构造和析构 依旧和上面的一样,但是依旧需要显示的去调用父类 即派生类是将父类有看成了一个整体,无论你是显示的去写派生类的构造和析构还...

首先我们知道在使用vs时,我们时可以通过调式一段代码来找出我们这段代码的逻辑错误在哪里的,但是在Linux中没有对应的图形化界面,我们应该怎么去调试一个代码呢?这里就需要使用道Linux中的一个工具叫做gdb。首先要检测你的操作系统中是否安装了gdb。 检测安装gdb 使用下面的指令 gdb--version 如果出现了你所对应的gdb的版本号,代表已经安装了gdb。 如果没有安装gdb请在已经安装了gcc和g环境下执行下面的命令 sudoyuminstall-ygdb gdb的使用 Linux中的Debug和Release 下面我们就来学习如何使用gdb这个工具。第一步我们肯定要...

这几天刷了需要使用分治快排思想去解决的几道比较好的题目,所以写下这篇博客用于复习和以后的复盘。 什么是分治快排思想 首先我们要知道什么是分治快排思想,这个思想其实就是在模拟实现qsort算法的时候使用的一个方法,在模拟实现qsort的时候,我们知道第一步是需要使用一个随意选择(三数取中)的方法去选择一个随机数作为key的,然后我们需要遍历待排序的数组,将整个数组分成三个部分分别是小于key的元素,等于key的元素,大于key的元素。那么我们使用的将整个数组分成三个部分的这个思想就是分治快排思想。 其实这个思想还有一个方法名字叫做三向划分数组。这个方法的实现请看下面的图, 下面是例题: 题目...

第一步肯定还是要弄懂什么是分治归并思想,这个思想最经典的地方也就是归并排序的实现了。那么我们现在就来复习一下归并排序的实现方法。 首先归并排序的第一步也就是分治,例如上图将数组中的元素不断的划分直到每一个元素都被划分成单独的一个一个之后再将其不断地合并直到最后完成归并排序。 题目1:排序数组 题目链接:912.排序数组力扣(LeetCode) 下面是代码实现: classSolution{ public: voidmerge(vector<int>&nums,intbegin,intmid,intend,vector<int>&tmp){ intl...

  YGRwB9iV7sL2   2023年11月02日   29   0   0 i++算法数组数据结构排序算法

文件是什么和文件权限的简单理解 首先我们要知道对于Linux中的文件而言一个文件=属性+内容。 并且对于一个操作系统的使用人员而言,一个文件具有三种权限,分别是可读,可写,可执行。并且操作系统对于每一个用户(除了root权限)对于一个文件而言会倍分成不同的组。对于文件的创建者而言,Linux会将这个用户设置为拥有者(Owner),对于和创建者同一组的人都会被认为是同一个所属组(Group),而除了所属组之外的所有用户,对于这个文件而言都是Other。 那么随机创建一个Linux的.c文件 可以看到这里我创建了一个test.c文件那么对于Owner而言对于这个test.c文件Owner具有可...

  YGRwB9iV7sL2   2023年11月02日   22   0   0 linuxshell信任列表字符设备

首先我们在刚开始学习stl的时候,知道stl中含有6大组件,其中容器,迭代器和算法都是stl的六大组件之一。那么这里我们思考一个问题:迭代器的意义是什么呢? 我们知道容器的意思是储存数据,而算法的作用是对数据进行处理,例如对vector进行排序,对list进行排序。 如果我们将算法写到容器实现中,那么就会出现很多重复的代码。所以容器和算法是分离的。除此之外,我们还可能想要遍历一下容器中的数据,但是不同类型的容器,其底层的实现逻辑是不同的,例如树形结构的遍历和普通线性结构的遍历那就是截然不同的,即使最后遍历打印出的数据是一样的。那么假设我们是自己想要遍历容器中的数据,我们本身肯定是要理解这个容器...

  YGRwB9iV7sL2   2023年11月02日   64   0   0 数据自定义类型迭代器

首先我们在之前学习模板的时候说过,在使用模板的时候我们要做到声明和定义不分离,但是这是为什么呢?如果模板的声明和定义分离又会发生什么事情呢? 这是声明 这是定义 在进行编译之后,可以看到报了下面的错误 可以看到这是一个编译错误,那么如果我将这个函数模板替换成一个普通函数呢? 普通函数的声明 普通函数的定义 重新编译运行都是成功的。 那么这是为什么呢? 我们首先要知道编译器底层是怎么处理我们写的代码的 结合到我们刚刚写的函数,在第一部的时候,会将Stack.h中的iostream展开,同时在test.cpp和stack.cpp中将stack.h展开 然后第二步就是构成汇编代码。那...

  YGRwB9iV7sL2   2023年11月02日   35   0   0 实例化类模板编译器

继承的定义 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用 总结一下上面的话语:继承的本质也就是复用。即假设我在这里写了两个类,这两个类中含有公共的函数,那么我们将这个公共的函数抽取出来。形成一个新的类,然后让另外的两个类去调用这个函数。 我们使用下面的例子来详细解释一下什么是继承。 这里我写了两个类一个是student类,一个是teacher类。 从上图...

  YGRwB9iV7sL2   2023年11月02日   49   0   0 临时对象子类父类
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~