- 博客(69)
- 收藏
- 关注
原创 继承
c++中什么是继承?先上一段代码:class Parent {public: void f1() { std::cout << "f1()" << std::endl; }private: int _a; int _b;};class Child : Parent{public: void f2() ...
2018-08-07 10:58:48
529
原创 String引用计数写时拷贝
为什么要采用引用计数和写时拷贝?在一些情况下,我们可能只会对一个对象进行读操作,如果一味的遇见一个对象,就开辟空间,并且赋值,这种操作没有任何意义,并且耗费时间和计算机的内存资源,设置一个引用计数,表示当前这段空间被几个对象引用,以自己写的String为例,当我们在使用拷贝构造或者赋值时,可以直接给引用计数加1,并且让这个新创建的对象指向这个已存在的对象的字符串,当指字符串的指针减少时(每减少...
2018-07-30 12:21:43
237
原创 模拟实现string类
在c++中,string其实就是将字符串封装起来的类,调用类中的成员函数可以完成对类内的字符串进行增删查改,并且将操作符重载,可以更直观的操作字符串,省去了c语言中很多麻烦的操作,有现成的成员函数供我们使用。举一个简单的例子:在c语言中要在一串字符串的尾部拼接另一个字符串,我们需要做的事情就是定义两个字符串,要使用malloc,然后自己书写拼接逻辑。而在c++中只需要构造出lian两个stri...
2018-07-28 17:22:57
372
原创 类和对象(下)— Date类
#include<iostream>#include<assert.h>using namespace std;class Date{public: Date(int year = 1900, int month = 1, int day = 1) :_year(year) , _month(month) , _day(day) { if (...
2018-07-21 17:52:31
260
原创 类和对象(上)
1.什么是面向对象? 想想之前学过的c语言,c语言是面向过程的语言,不管是简单类型还是复杂类型,只是一味的调用函数,这里的调用函数就是将数据处理的过程,更加在乎的是处理逻辑和处理结果 c++是面向过程的语言,首先要说一下什么是类?什么是对象? 类,通俗的就讲就是一个事物的描述,描述着这一类事物的特征和动作,即成员变量和成员函数 对象,是类实...
2018-07-20 14:36:29
134
原创 c++_引用和指针
1.引用的概念及用法一个对象的引用就是这个对象的别名,所以对一个对象的进行操作,和直接对这个对象操作的效果是一样的。如何创建引用? 对象类型 & 引用名 = 对象名;引用的特点:引用为一个对象的别名,所以不占内存引用必须初始化,并且不能为NULL引用初始化结束后,不能再次改变代码如下:#include<iostream>int main(){ int a = ...
2018-07-10 23:27:38
118
原创 C++入门(重载,缺省参数,命名空间)
介绍c++ 可以这样理解,c++是c语言的升级版,如果把c语言看作一个类,那么c++就是c语言的继承,也就是说,c++兼容c语言的所有语法,并且拥有自己的特定的语法,,c++是面向对象的语言,也可以基于过程的程序设计特点:封装性: 类是支持数据封装的工具,对象则是数据封装的实现。c++可以通过private继承:在C++现有类的基础上可以声明新类型,这就是继承和重用的思想多态性: 简...
2018-07-09 23:31:51
176
原创 数据结构—hash表
哈希表,是根据键值对(Key --- value)进行访问的数据结构。也就是说,它通过把key值映射到表中一个位置来访问记录,以加快查找的速度。给定表ht,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。总结上面的所说: 若在Hash表中存放数据的是一个结构体...
2018-06-23 13:54:29
595
原创 数据结构—堆
堆的定义:堆是一个完全二叉树 堆有两种, 一种叫小堆(小根堆, 最小堆), 一种叫大堆(大根堆, 最大堆). 以小堆为例, 这个树的根节点是这个树中的最小的元素,对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值. 以大堆为例, 这个树的根节点是这个树种的最大元素,对于任意一个子树来说, 子树的根节点, 大于左右孩子节点的值. 头文件 heap.h#pragma once #inclu...
2018-06-03 16:10:16
203
原创 进程间关系与守护进程
进程组每个进程除了有⼀个进程ID之外,还属于⼀个进程组。进程组是⼀个或多个进程的集合。通常,它们与同⼀作业相关联,可以接收来⾃同⼀终端的各种信号。每个进程组有⼀个唯⼀的进程组ID。每个进程组都可以有⼀个组⻓进程。组⻓进程的标识是,其进程组ID等于其进程ID。 组⻓进程可以创建⼀个进程组,创建该组中的进程,然后终⽌。只要在某个进程组中⼀个进程存在,则该进程组就存在,这与其组⻓进程是否终⽌⽆关。实例如...
2018-05-12 14:11:39
173
原创 多线程总结
进程与线程的区别(总结)进程是资源分配的基本单位,线程是cpu调度的基本单位。在同一个进程中可以创建多个线程,这些线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少有一个线程。进程的创建调用fork,系统需要为这个进程分配资源,线程的创建调用pthread_create,系统只需要创建该线程的PCB,这个PCB将使用这个进程资源,不用系统分配。正常退出:进程结束后它拥有的所有线程都将销毁...
2018-05-06 15:58:37
187
原创 数据结构—顺序表
顺序表,地址空间上连续的一段内存,本次用数组实现顺序表头文件:test.h#pragma once #define SeqListMaxSize 1000 //数组最大容量typedef char SeqType; //顺序表的元素类型typedef struct SeqList { SeqType data[SeqListMaxSize]; size_t siz...
2018-05-01 20:40:15
262
原创 共享栈(一个数组实现两个栈)
原理:想要一个数组实现两个栈,那么就必须一个栈的栈顶从数组下标为0处开始,另一个栈从数组额最大下标处开始,两个栈相对而生如下图所示:如何判断栈满?当两个栈顶标记重合时,表示共享栈已经满了代码如下:头文件ShareStack.h#pragma once#include<stdio.h>#include<stdlib.h>typedef char StackType;...
2018-04-26 20:54:23
10578
原创 判定字符串是否按照出栈顺序
判断一个字符串是否可以通过另一个字符串通过栈变换得到假设:源字符串:src 目标字符串:dst判断规则:src与dst的长度必须相等才能进行变换,否则不能变换的到首先定义两个指针p_src和p_dst分别指向src和dst的第一个字符先让p_src对应的元素入栈并进行p_src++,然后取栈顶元素与p_dst对应的元素相比较如果相等,p_dst++,并且栈顶元素出栈如果不相等,在p_src !=...
2018-04-26 20:38:40
432
原创 两个队列实现一个栈
原理:如果组成的栈中没元素,那么两个队列为空如果组成的栈有元素,就要时刻保证一个队列中有元素,另一个队列中没有元素栈的初始化:初始化两个队列即可栈的销毁:销毁两个队列即可入栈:有元素的队列入队列即可出栈:加入有元素的队列中有n个元素,把钱n-1个元素直接出队列,然后直接人另一个队列,把剩下的最后一个元素出队列即可取栈顶元素:加入有元素的队列中有n个元素,把钱n-1个元素直接出队列,然后直接人另一个...
2018-04-26 20:24:40
212
原创 两个栈实现一个队列
队列的特点是先进先出,也就是说,存进队列的顺序和从队列中取出的顺序是一样的栈的特点是后进先出,也就是说,存进栈内的顺序和从栈中去出的数据是相反的,入过用两个栈,第一个栈将数据反向,第二个栈又将第一个栈的数据反向,最后得到的序列与从队列中得到的序列一致,示意图如下:代码如下: 头文件:QueueByTwoStack.h#pragma once #include<stdio.h>...
2018-04-26 20:08:25
211
原创 线程概念
什么叫做线程?在一个程序里的一个执行路线叫做线程,更准确的说,线程是一个进程内部的控制序列。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。在Linux操作系统中,并没有真正意义上的进程,而是用线程去模拟进程,我们把其称之为轻量级进程(Lightweight Process...
2018-04-26 17:57:11
187
原创 封装fork/wait,实现process_creat函数
先介绍一下wait:wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status 可以设成NULL。子进程的结束状态值请参考waitpid()。头文件: #include <sys/wa...
2018-04-24 21:22:30
274
原创 fork和popen/system
先介绍一下fork所需头文件:#include <unistd.h>fork的原型: pid_t fork(void);返回值:pid_t实际上是一个宏定义的int类型当调用成功时,fork的返回值如果是0, 则是子进程在运行,返回值大于零(子进程的pid),则在父进程内运行用调用失败返回-1如何穿件子进程?fork时,操作系统要为子进程开辟空间,分配资源,创建PCB,并为子进程复制一...
2018-04-21 21:45:06
500
原创 用fock实现简易shell(程序替换)
fork之后就会创建则进程,数据、堆、栈有两份,代码仍然为一份但是这个代码段成为两个进程的共享代码段都从fork函数中返回,当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂子进程在创建的时候会复制父进程的代码。不管是共用代码还是复制代码,这就相当于父进程创建了一个和自己功能完全相同的进程,这样一来,子进程就只能进行和父进程一样的操作动作,这样做实际意义并不大,那怎么让子进程干和父进程不一样...
2018-04-21 21:26:28
320
原创 最小栈
最小栈:有入栈,出栈,取栈顶元素,取出栈内的最小值的时间复杂度均为O(1);有两种实现方式:第一种:使用一个栈没入栈一个元素,都再次把最小值插入,所以每次入栈,其实要入两个元素,栈顶永远是最小值,取栈内最小值就是取栈顶元素,将9725入栈,出栈,取栈顶元素如下图:入栈过程:出栈:取栈顶元素:代码如下:头文件MinStack1.h#pragma once#define MinStackMaxSi...
2018-04-15 17:09:52
398
原创 环境变量
基本概念环境变量(environment varriables)一般是指在操作系统中用来指定操作系统运行的一些参数比如在编写c/c++代码时,在链接的时候,从来都不知道所链接的静态库动态库在哪,但是照样可以链接成功,生成可执行程序,还有当我们在Linux下任意目录执行ls命令时,都可以正常执行,ls无非也是一个可执行程序,但是我们自己写的可执行程序为什么要加 ./ ?而不能像ls那样不用加 ./ ...
2018-04-14 23:43:34
203
原创 使用代码模拟实现僵尸进程, 孤儿进程
在进程运行时,由于某些原因会产生僵尸进程和孤儿进程,僵尸和孤儿两个词语形象的体现某进程的运行状态僵尸进程:当进程加载到内存中时,需要向操作系统申请资源,正常情况下,当一个进程正常退出时,这个进程的资源会被他的父进程或者操作系统回收,如果这些资源在进程退出时没有被操作系统回收,就像一具已经僵硬的尸体,没人处理,形象的称这个进程为僵尸进程,如果僵尸进程一直不被回收,就造成了内存泄漏,试想一下,如果系统...
2018-04-14 00:15:48
252
原创 进程概念
在我们看来,进程是一个正在执行程序的一个实体,从内核的角度出发,进程是一个担当分配系统资源(CPU时间, 内存)的实体提到进程就不得不说PCD(process control block),进程的信息就被放在 进程控制块(PCB) 的数据结构中,进程控制块至少应该包含进程标识(是进程的唯一标识,PID),还有进程的优先级,记录进程的上下文信息,记录进程下一次下一条指令的地址,进程中的程序的地址,等...
2018-04-13 17:48:16
149
原创 进程调度算法
1、先来先服务调度算法(FCFS,first come first served) 各个进程按照先后顺序排队,然后依次被调度2、时间片轮转调度算法(RR,Round-Robin)每次没给进程的运行时间片段相等,没有优先,这使得一些必须被立刻处理的进程得不到处理3、最短作业优先(SJF, Shortest Job First)短进程优先4、多级反馈队列调度算法(Multilevel Feedback...
2018-04-11 23:07:35
494
原创 数据结构—队列的实现(顺序表)
数据结构中的队列有“先进先出”的特点,意思是最先被存进队列中的数据,总是最先被取走一个队列只有初始化,销毁,入队列,出队列和取队首元素,这些限制往往使在操作数据时更安全,代码容易实现,出现BUG的机会就很少上图队列,如过进行了多次入队列和出队列,就会是head之前的空间浪费,如下图为了避免这种浪费空间的测操作,当每次head 和 tail 只要到达最后一个元素,操作完成就让他们回到对列的最前面,即...
2018-04-11 09:58:57
404
原创 数据结构—栈的实现(顺序表)
数据结构中的栈有“后进先出”的特点,意思是最后被存进栈中的数据,总是最早被取走一个栈只有初始化,销毁,入栈,出栈和取栈顶元素,这些限制往往使在操作数据时更安全,代码容易实现,出现BUG的机会就很少上图中,栈中有3个元素,栈顶元素是data3,如果是入栈操作则data4放入栈顶,此时栈中有四个元素,栈顶元素是data4,如果出栈,则data4被取出,栈顶元素变为data3,具体实现代码如下:头文件(...
2018-04-11 09:27:57
305
原创 双向链表实现
双向链表:对比单向链表,双向链表中,一个结点不仅知道他的后继,还知道他的前驱,这就使得双向链表在操作上比单项链表更为简单,效率更高注:头结点的data无任何意义,所以填0即可空的双向链表(head 的 prev 和 next 都指向头结点)非空双向链表(结构如下图所示)头文件 DLinkList.h#pragma oncetypedef char DLinkType;typedef st...
2018-04-08 23:17:34
115
原创 C语言实现通讯录(文件版本)
通讯录功能简介:添加一个联系人删除一个联系人查询指定联系人信息修改指定联系人信息显示所有联系人信息清空所有联系人信息所有联系人按名字排序头文件hest.h#pragma once#define NAME_MAX 32 //名字最大长度#define SEX_MAX 4 //性别最大长度 #define TEL_MAX 12 //电话号码最大长度#define NODE...
2018-04-05 11:18:33
2254
3
原创 数据结构—链表
实现链表的各种增删查改等操作,并附带一些题目:头文件(c文件中所要实现的内容):typedef char LinkType; typedef struct LinkNode { LinkType data; struct LinkNode* next; } LinkNode; /** * @brief 初始化链表 * * @param head */ void LinkLi...
2018-04-03 00:00:51
168
原创 fopen与fclose详解
fopen()打开一个文件函数原型:FILE *fopen(const char *path, const char *mode);path字符串是一个文件名mode是打开文件的方式具体有如下几种方式:r 以只读方式打开文件,该文件必须存在。r+ 以可读写方式打开文件,该文件必须存在。rb+ 读写打开一个二进制文件,允许读数据。rw+ 读写打开一个文本文件,允许读和写。w 打开只写文件,若文件存在...
2018-03-29 23:43:24
2462
原创 fread()和fwrite()详解
fread()从文件中读取数据函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);ptr:指向保存结果的指针;size:每个数据类型的大小;nmemb:数据的个数;stream:文件指针函数返回读取数据的个数。建立test.txt文件,输入内容编写代码(只读方式 r 打开)运行结果(每一行都有一个\n,所以一行...
2018-03-29 23:21:48
755
原创 sscanf与sprintf详解
sscanf与sprintf需要引入stdio.h头文件sscanf();函数原型:int sscanf(const char *str, const char *format, ...);返回值为format中的字符个数#include<stdio.h>int main(){ char buf2[32] = "hellowhorld!"; char* str1 = "ab...
2018-03-29 21:21:01
258
原创 Linux下打印彩色进度条
代码如下:#include<stdio.h>#include<stdlib.h>int main(){ char jdt[103] = " "; int i = 0; int j = 0; int flag = 0; char arr[4] = {'+','x'}; jdt[0] = '['; jdt[102] ...
2018-03-27 20:44:59
230
原创 rpm安装和yum安装的区别(配置yum源)
yum是从网络安装源上下载rpm,如果存在依赖关系会把依赖的rpm同时下载安装(安装包都以rpm结尾)rpm是安装本地存在的rpm包,如果存在依赖也需要安装上源码安装是将源代码通过预处理,编译,汇编,链接形成可执行程序配置yum源(有网操作):在linux火狐浏览(firefox)器中输入:https://opsx.alibaba.com/mirror选择centos这一栏的帮助选择对应的Cent...
2018-03-27 20:25:56
1204
原创 gcc编译为什么要加-g选项
加上-g 选项,会保留代码的文字信息,便于调试下面两幅图是有无 -g 选项调试的区别(我是用的是cgdb,比gdb稍微好用一点,文章结束附带cgdb下载教程)先来一段简单的代码:如果使用 gcc test.c, 再使用cgdb调试时的效果是这样的:如果使用 gcc -g test.c, 再使用cgdb调试时的效果是这样的:cgdb安装教程链接...
2018-03-27 20:02:00
52750
2
原创 cgdb安装教程
安装步骤(有网操作):下载cgdb-0.6.7.tar.gz压缩文件:wget http://cgdb.me/files/cgdb-0.6.7.tar.gz 下载完成之后当前目录会有一个cgdb-0.6.7.tar.gz压缩文件,建议下载到家目录解压cgdb-0.6.7.tar.gz文件:tar -zvxf cgdb-0.6.7.tar.gz解压完成之后,当前目录会出现cgdb-0.6.7目...
2018-03-27 20:01:25
2234
2
转载 历史上出现过的主流C/C++ 编译器都有哪些?
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:farta fine链接:https://www.zhihu.com/question/39661628/answer/82559043来源:知乎Turbo C/C++DOS时代的启蒙先驱,上古神器。Visual C++M$出产的编译器系列。Windows下的事实兼容性标准。6.0版一代经典,至今仍然老而不死,死而不僵,僵而...
2018-03-27 19:24:33
1373
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人