- 博客(63)
- 收藏
- 关注
原创 Linux进程控制
目录1. 进程创建1.1 . / 可执行程序创建进程1.2 fork函数创建进程1.2.1 fork的返回值1.3 写时拷贝2. 进程结束2.1 进程结束的三种场景2.2 进程结束的退出方法2.3 exit函数和_exit函数的区别3. 进程等待3.1 进程等待的必要性3.2 进程等待的方法3.3 获取子进程的status4. 进程替换4.1 为什么要有进程替换?4.2 替换原理4.3 替换函数通过运行可执行程序可以产生进程fork函数会在已存在的进程中再创建出一个子进程,而原进程就为父进程调用fork
2022-12-07 13:22:57
595
1
原创 C++复习第二天:类与对象
C语言是面向过程的,关注的是过程,分析出解题过程的步骤,调用函数来实现。C++是基于面向对象的,关注的是对象,将一件事物划分成不同的对象,通过不同对象之间相互交互完成对于一个类生成的不同对象,调用其共有的函数,那么是如何区分其函数传入变量不同的呢?C++引入了this指针来区分,C++给非静态的成员函数都引入了this指针的概念,当该指针指向对象时,所有对成员变量的操作都是通过该指针来访问。
2022-10-22 19:51:07
842
原创 C++复习第一天:基本语法掌握
函数重载其实是函数的特殊情况,C++中允许在同一个作用域下声明几个功能相似的同名函数,这些同名函数的参数个数、类型不同在函数面前加extern C是告诉编译器以C语言的名字修饰规则来编译。1. 引用必须实例化2. 一个变量可以有多个引用3. 一个引用只能有一个主体被inline关键字修饰的函数被称为内联函数,内联函数在编译期间会展开,调用该函数不会生成函数栈帧,内联函数提高的程序的效率。
2022-10-21 16:27:00
208
原创 智能指针的介绍
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有不需要显式地释放资源。采用这种方式,对象所需的资源在其生命期内始终保持有效// 利用RAII思想写出的智能指针模板{{}{}
2022-10-08 22:27:00
693
原创 AVL树的插入操作
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树。......
2022-08-08 15:45:21
2736
原创 map和set容器
用来表示一一对应关系的一种结构,该结构只包含了两个成员变量key和value,key表示键值,value表示与key所对应的信息,比如英汉互译的字典,找到一个英语单词必定存在一个与之对应的翻译,每个单词和翻译之间是一一对应的。查询当前容器有多少个键值是key的数据,但由于在map中key值是独立的,因此count的结果只能是0 / 1。通过介绍我们可以发现,如果键值key在map中存在时,则会返回其键值对应的value的引用,关联式容器也是用来存储数据的,与序列式容器不同的是,里面存储的是。...
2022-08-07 17:17:05
510
原创 vim的基本操作
注意当进入了vim了以后,默认的模式是命令模式,如果需要写入数据,需要切换成插入模式。当使用o来切换插入模式时,光标会在当前行的下一行。[i]、[a]、[o]三种不同的切换方式。当使用a来切换插入模式时,光标会向后移一位。当使用i来切换插入模式时,光标不会移动。例如vimtest.c。...
2022-07-26 19:43:14
6839
1
原创 strlen和sizeof的区别
sizeof是一个运算符,其值在编译期间就已经计算好了,其参数可以是数组、类型、对象、函数等。功能计算该参数建立的对象的最大字节由于在编译期间就发生了计算,因此sizeof只能计算非动态的对象,sizeof的返回值和传入参数的内容无关,并且其返回值是size_t类型,也就是unsignedint类型。strlen是一个函数,其值是在运行时候被计算,strlen的参数必须是char*类型功能计算遇见'\0'之前的所有字符个数。...
2022-07-26 19:09:16
491
原创 二叉搜索树详讲
递归写法在删除和插入操作中不需要去判断目标值为其父值的左子树还是右子树递归写法突出的就是代码量少如果二叉搜索树不太均匀,递归写法可能会造成栈溢出httpshttpshttps。
2022-07-26 16:18:00
327
原创 多态的详讲
多态的概念通俗的来说,就是多种形态。可以理解为不同的对象去做同一件事件会产生不同的结果。举个例子比如在抢火车票这个案例,对于普通人则是全价,对于学生是半价,对于军人则是优先购买。这就是多态的特点对于不同的对象会产生不同的效果多态是不同继承关系的对象,去调用同一个函数,产生不同的行为,比如Student类继承了Person类,Person类调用其Buyticket函数则是原价买票,而Student调用Buyticket函数则是半价买票。那么构成多态的条件究竟是什么呢?(最重要的一点之一){...
2022-07-25 16:00:41
2336
原创 模板的使用
重载的函数只是类型不同,没有使用代码的复用性,并且只要有新的类型出现,就需要添加新的函数代码的可维护性差,如果一处出了错误,则都会发生错误那么有没有比重载更好的方法呢?,我们可不可以告诉编译器一个模板,让它根据不同类型生成不同函数呢?这就是模板的特点编写与类型无关的代码,充分利用了代码的复用性class模板名{//类成员定义};//动态顺序表//注意Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具{public,_size(0){}作用域。......
2022-07-24 15:16:49
590
原创 继承的详解
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类,而原有类被称为基类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次上的复用。1.2.1继承的定义格式1.2.2继承关系和访问限定符publicprotectedprivate1.2.3继承基类成员访问方式的变化类成员public继承在派生类中不可见。...
2022-07-21 17:43:20
962
原创 Linux权限
目录1. Linux的权限概念2. Linux权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限 2.3 文件权限的表示法 2.4 文件访问权限的相关方法 3. 目录的权限3.1 粘滞位Linux下有两种用户: 超级用户(root)和 普通用户如何从普通用户切换至超级用户?命令:su - 功能:从普通用户切换至root用户文件类型:访问权限:1. 字符表示法2.八进制表示法1.chmod方法功能:修改访问者对于文件或者目录的权限 (但需要注意修改的文件或者目录必须是属于自己的)格式:chmo
2022-07-07 20:32:26
480
原创 map容器
由于map容器中存储的数据都是成对出现的,因此我们需要使用pair来帮助我们完成存储 这里我们只考虑拷贝构造使用 = 来帮助我们完成赋值2. map容的大器小和交换2.1 大小的计算这里我们使用容器中的size函数,它将返回map容器中的元素个数 swap可以交换两个容器的空间 这里我们主要考虑map容器插入数据的方式:第一种第二种第三种第四种添加后的结果: 因为map容器会将插入的值根据键值来进行排序,因为我们只考虑插入的方式即可,不考虑插入位置等
2022-06-30 19:40:22
206
原创 deque容器
deque本质上是一个双向数组,其中存在一个中控器来控制缓冲区中的元素,从而实现数组的连续性3.deque的赋值操作1. = 操作符2. assign方法 4.deque容器的大小注意:deque和vector虽然都是数组,但是deque容器没有容量这个概念使用到的函数5.deque的插入和删除使用到的函数:insert()和erase()函数1. 插入 2. 删除如果要删除整个容器可以使用clear()函数 使用到的函数 加油!...
2022-06-19 15:43:40
409
1
原创 vector容器
vector容器分为三种构造函数形式:2.vector的赋值操作1. = 操作符 2. assign方法1. size方法2. capacity方法一般情况来说,v.size()
2022-06-18 20:12:23
2773
原创 String容器
C++98有以下主要构造函数2. 字符串赋值字符串赋值有两种操作符:1. =操作符 2. assign方法 3. 字符串拼接1. +=操作符 2. append方法拼接 4. 字符串查找和拼接1. find方法rfind与find语法类似,区别在于find是从左往右进行查找,而rfind是从右往左进行查找2. replace方法这里我们只考虑替换类型是字符串或者是类5. 字符串比较compare方法类似于C语言中的strcmp函数
2022-06-16 12:05:46
223
原创 模板的基本特征
模板就是建立通用的模具,提升了代码的复用性C++中的另一种编程思想就是泛型编程,主要的技术就是模板C++提供两种模板 -- 函数模板和类模板模板特点:建立一个通用的函数,其返回类型和参数类型可以不指定,可以通过一个虚拟的类型来替代语法:说明:template -- 声明创建的模板typename -- 后面的字符表示为一个数据类型,可以被class替换T -- 通用数据类型,可以被替换,但一般使用大写字母举例:2.2 函数模板的注意事项函数模板分为两种推导方式 --- 自动推导和显示指定类
2022-06-14 10:25:25
655
原创 文本文件操作
目录1. 写文件 举例:2. 读文件 举例:写文件包含五个步骤:1. 包含头文件#include2.创建输出流对象ofstream 对象名3. 打开文件对象名.open("文件路径",打开方式)文件打开方式:ios::out注意:文件打开方式可以配合使用,利用 | 操作符如果我们需要以二进制的方式来读文件我们应该怎么写入打开方式:ios::binary | ios::in4. 写文件对象名 ...
2022-06-12 20:53:54
486
原创 多态的所有特征
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用或者指针指向子类的对象基类的指针或者引用执行子类的对象3. 多态的底层原理多态的实现原理是:1.有继承关系2.子类要重写父类中的虚函数什么是虚函数呢?被virtual关键字修饰过的函数称为虚函数那么在底层,类中拥有被virtual修饰过的函数会产生什么呢?我们发现类中会产生一个vfptr的指针和一个名为vftable的作用域,这个指针指向这个作用域,而在这个作用域中存在着被virtual修饰
2022-06-11 10:41:20
1314
原创 继承的所有特征
继承是面向对象的三大特征之一继承可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。class 类名:权限 父类名我们继承了父类中的成员函数和成员变量,并且子类中也具有它们独特的性质。 C++中的继承分为三种:1. public继承 2. protect继承 3. private继承 我们可以发现当是public继承时:如果是公共继承时,则子类继承的成员权限仍和父类相
2022-06-09 09:41:41
385
原创 Linux常见指令(2)
语法:zip 压缩文件.zip 目录或者文件功能:将目录或者文件压缩成zip形式常用选项:语法:tar [选项] [目录或者文件名]功能:打包/解包常见选项: 如果要显示压缩或者解压的文件名可以添加-v语法:bc功能:可以进行算是预算语法:uname [选项]功能:uname用来获取电脑 常见选项:......
2022-06-05 17:19:00
692
原创 Linux常见指令(1)
语法: ls [选项] [目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。常用选项: 当我们创建以.开头的普通文件时,我们使用ll是无法看见的,这时我们就需要使用-a选项来显示隐藏文件。 语法:pwd功能:显示用户的当前目录语法:cd 目录功能:从当前目录转至目标目录 常见功能: 语法:touch [选项] [文件名]功能:新建一个不存在文件,或者修改文档或者目录的文件属性这里我们只需要了解touch可以新建一个不存在的文件即可语法:mkdir [目录名]功能:
2022-06-02 11:50:29
456
原创 C/C++内存管理
在C语言中提供了三个方式来动态开辟空间,分别是malloc、calloc、realloc,那他们三者有什么区别呢?malloc:在堆上开辟空间,但对开辟的空间不进行初始化。calloc:在堆上开辟空间,并对开辟的空间进行初始化,如果是int等类型则初始化为0,如果是指针类型则初始化为NULL。realloc:对已开辟的空间进行扩充或者缩小,如果是进行扩充,已开辟空间的内容会被保存,如果是进行缩小,可能会丢失原空间的内容。C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因
2022-06-01 21:34:00
194
原创 类和对象(4)
1. 构造函数的补充1.1 构造函数赋值在类和对象(2)中我们谈到了当一个对象创建时会调用构造函数来为成员变量赋值,那么这次赋值是初始化吗?class Date{public: Date(int year=1, int month=1, int day=1) { _year = year; _month = month; _day = day; _year=2; _month=1; _day=3; } private: int _year; int _month;
2022-05-25 19:07:02
150
原创 类与对象(3)
1. 操作符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型operator操作符(参数列表)这里我们统一使用Date类来进行以下操作class Date{public: //进行操作符的重载 //... private: int _year; int _month.
2022-05-19 23:00:27
224
1
原创 类和对象(2)
1. this指针什么是this关键字呢?我们先来看一段代码:之前我们得知创建对象时,函数成员是在公共代码区的,那d1和d2同时调用Display函数,怎么能分辨出呢?C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。因此当我们调用Display函数时,系统
2022-05-16 16:13:44
248
1
原创 类和对象(1)
目录1. C和C++的主要区别是什么?2. 类3. 类的定义类的两种定义方法4.类的访问限定符及封装4.1 访问限定符4.2 封装5. 类的作用域6. 类的实例化7. 类的大小7.1 求出类的大小1. C和C++的主要区别是什么?C语言是面向过程的,注重的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于面向对象的,注重的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2. 类在C语言中struct只能...
2022-05-13 21:13:25
268
原创 C++入门(1)
目录1. 命名空间1.1 命名空间的定义2. C++如何输入输出3. 缺省参数3.1 什么是缺省参数?4. 函数重载4.1 什么是函数重载?4.2 名字修饰5. extern "C"5.1 在C++中使用C库在C/C++中,我们总会遇见重名的情况,而这种情况又给我们带来了许多的不便,所以我们设计了命名空间,将在此定义的变量、类与外界隔绝起来,防止被污染。既然说到了命名空间的由来,那我们如何来定义一个命名空间?定义命名空间我们需要一个关键字 - namespace,也是好理解的一个关键字,后面跟上空间名,接
2022-05-10 16:41:13
309
原创 Top - k问题
什么是Top - k问题?比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决,基本思路如下:1. 用数据集合中前K个元素来建堆前k个最大的元素,则建小堆,前k个最小的元素,则建大堆2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素。代码实现如下://用堆来解决topk问题 voi.
2022-04-15 15:45:23
3788
1
原创 实现栈和队列
1.1 栈什么是栈?栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈有着先进后出的这种特征,所以接下来我们可以实现下栈的基本功能:// 我们主要实现下面的支持动态增长的栈typedef int STDataType;ty
2022-04-09 21:44:04
372
原创 动态内存管理(1)
1.为什么会存在动态内存分配目前我们已知的开辟空间的方式为:int val = 20; //在栈空间上开辟四个字节char arr[10] = {0}; //在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点:1. 空间开辟大小是固定的。2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但在写代码的途中,情况是多变的,可能固定的空间大小不够进行操作,那这时我们又无法改变大小,我们就引进了新的内存分配方式——动态内存。2. 动态内存函数...
2022-02-19 15:15:31
551
原创 学习位段(1)
1. 什么是位段?位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int或signed int 。2.位段的成员名后边有一个冒号和一个阿拉伯数字。例如:struct A { int a: 2; int b: 5; int c: 10; int d: 30;};A 就是一个位段类型。那A的大小又...
2022-02-19 11:12:50
690
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人