自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 重写muduo库

目录概述Reactor模型整体框架组件详解channel概述1. 项目简介:模拟 muduo 库实现non-blocking + IO-multiplexing + loop线程模型的高并发 TCP 服务器模型。2. 开发环境:CentOS7 linux环境。3. 技术栈:C++、多线程、socket网络编程、epoll多路转接。4. 项目设计:整体采用non-blocking + IO-multiplexing + loop线程的设计框架,其中线程模型采用one loop per thr

2020-07-19 20:02:44 661

原创 BST树的插入、删除、查询操作

1.什么是BST树2.BST树的节点3.BST树的插入操作4.BST树的删除操作5.BST树的查询操作1.什么是BST树二叉搜索树(Binary Serach Tree),又称二叉排序树,其简写为BST树。对于二叉树上的每一个节点,如果满足左孩子的值 < 父节点的值 < 右孩子的值,那么就称这棵二叉树为二叉搜索树。例如:在这棵二叉树中,对于每一个节点均满足左孩子 < 父节点 < 右孩子。2.BST树的节点BST的树的节点与普通的二叉树一样,节点中存储当前节点的

2020-06-10 19:21:07 3466

原创 Linux——进程间的通信方式

进程间通信概述通信方式管道概述进程间通信:因为每一个进程都有一个独立的虚拟地址空间,在保证了进程独立性的同时,却使得进程间无法直接通信,所以操作系统为用户提供了进程间的通信方式,并且因为通信场景的不同,提供的方式也有多种。通信方式System V标准下进程间通信方式的种类有:管道,共享内存,消息队列,信号量。管道用于进程间的数据传输,通过半双工通信方式实现数据传输(半双工:可以选择方向...

2020-04-01 15:22:43 197

原创 C++STL——顺序容器

顺序容器详解vector:向量容器deque:双端队列容器list:链表容器vector、deque、list对比总结:vector:向量容器1.底层数据结构:动态开辟的数组;涉及到扩容操作时,每次以原空间的2倍进行扩容。2.基本操作:vector< int >vec; // 实例化一个vec//插入:vec.push_back(20);// 容器末尾添加元素20vec,...

2020-03-29 15:48:43 249

原创 解决死锁问题之银行家算法

银行家算法背景:银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在...

2019-12-24 11:30:29 2962

原创 数据结构——单向循环链表解决约瑟夫环的问题

问题描述约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,它的下一个人又从1开始报数,数到m的那个人出列,一次规律重复下去,直到圆桌周围的人全部出列,输出人的出列顺序。带头节点的单向循环链表解题思路:初始时头要指向头(循环),出队时初始化prev指向头节点、cur指向第一个节点;先让cur指向第k个人...

2019-11-16 14:28:32 1744

原创 Linux学习——Linux基本命令

Linux基本命令命令格式:命令名 [选项参数] [操作对象]目录相关命令:ls:列出当前目录下内容。(一个终端打开之后,直接就会处在某一个目录下)-a:浏览所有文件,包含隐藏文件。Linux下以.开头的文件是隐藏文件. 目录自身… 上级目录-l:浏览文件的详细信息。-t:对浏览的文件进行按时间排序-s:按时间排序-r:逆序-lrt:把最后一次修改的文件或文件...

2019-11-09 22:27:44 122

原创 C++学习——模板编程

C++模板前言在C语言中,当我们的需求不同时,我们需要书写参数类型不同但功能相同的函数去实现,但是这样的代码书写方式会造成代码的冗余性过高。例如:一个实现求和功能函数,当需求是对两个整形求和时我们需要写一个参数为整形的求和函数,当需求变为对两个浮点型数据求和时,我们又要重新写一个参数为浮点型的求和函数,其实这样代码的复用性并不高。而在C++中, 我们可以利用函数的重载来满足对不同参数类型的...

2019-11-08 16:50:10 384

原创 C++学习——深度剖析new和delete原理

C++的动态内存管理方式在C语言中,我们使用malloc/calloc/realloc和free动态开辟和释放内存,而在C++中,我们则经常使用的是new和delete进行动态内存管理。区别:malloc/calloc/realloc按字节开辟内存的;new开辟内存时需要指定类型,例如:new int[10]。new不仅可以做内存开辟,还可以做内存的初始化操作。malloc/callo...

2019-11-07 14:15:41 331

原创 C++学习——类的其他成员

类的各种成员类的成员分为类的成员方法和成员变量。一般情况下,我们会将成员方法定义为公有的,而将成员变量封装成私有的,以便对于数据的保护。类的成员方法又分为普通成员方法、static静态成员方法、const常成员方法。普通成员方法:普通成员方法:=======>编译器会添加一个this形参变量。例如构造函数、析构函数、拷贝构造函数等等。特征:属于类的作用域。调用该方法时,需要依...

2019-11-05 12:58:18 286

原创 C++学习——类的六个默认成员函数

类的6个成员成员函数如果我们定义一个空类,编译器将会自动生成六个默认成员函数,他们分别是构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符重载函数以及const取地址操作符重载函数。构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,其功能是初始化对象的数据成员,并且在对象的生命周期内只调用一次。构造函数分为默认构造函数和用户自定义的构...

2019-11-02 14:14:55 574

原创 C++学习——类和对象

类:是一种实体的抽象类型类的引入在C++面向对象编程(OPP)中,类即为通过对实体属性、行为等特征的抽象产生的一种实体抽象类型。将其属性定义为成员变量,其行为定义为成员方法(成员函数),通过对类的实例化产生各种各样对象进而实现面向对象的编程思想。类的定义class className { // 类体:由成员函数和成员变量组成 }; // 一定要注意后面的分号clas...

2019-11-01 15:09:45 266

原创 C++学习——C++基础部分

一.形参带缺省参数的函数1.缺省参数:缺省参数:是指是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。2.缺省参数的分类:(1)全缺省参数:int sum(int a = 10, int b = 20){ return a + b;}即形参的所有参数均给以缺省值。(2)半缺省参数:int sum(int a , ...

2019-10-31 13:35:47 228

原创 排序——快速排序

快速排序前言:快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。基本方式1.hoare版本2.挖坑法3.前后指针法我们先介绍这三种基本方式:以下均以...

2019-10-17 22:24:53 436 2

原创 数据结构——堆

C语言实现堆在介绍堆之前我们先需要介绍一个数据结构——二叉树的概念。二叉树的概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树 的二叉树组成。二叉树的特点:每个结点最多有两棵子树,即二叉树不存在度大于2的结点。二叉树的子树有左右之分,其子树的次序不能颠倒。特殊的二叉树:1.满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,...

2019-09-27 15:37:59 163

原创 数据结构——C语言实现队列

C语言实现队列1.队列的结构及相关概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)的特性。入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头2.队列的实现:队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会...

2019-09-23 22:19:55 2096

原创 数据结构——C语言实现栈

C语言实现栈1.栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。2.栈的实现:栈的实现一般可以使用数组或者链表实现,相对...

2019-09-23 13:48:25 925

原创 数据结构——C语言实现带头双向循环链表

数据结构——C语言实现带头双向循环链表带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了,比单链表实用的多。图示:ListNode.h文件:在这里插入代码片...

2019-09-22 21:57:54 373

原创 数据结构——C语言实现无头非循环链表

**C语言实现无头非循环链表**链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。函数接口(Singlelist.h)文件:typedef int SLTDatatype;t...

2019-09-17 12:36:11 173

原创 从指令角度深入理解函数调用堆栈详细过程

从指令角度深入理解函数调用堆栈详细过程在学习任何一门高级编程语言时,我们都离不开函数的调用,但是无论是库函数,还是我们自己声明的函数,我们都不仅仅要了解如何去实现该函数,更加需要了解的是其底层的调用原理。本文将从汇编指令的角度去深入理解函数调用堆栈的详细过程。有了底层原理的理解,对于我们学习有着深远的意义。我们来看这样一个例子:int sum(int a, int b){ int tem...

2019-09-15 08:35:43 426

原创 掌握进程虚拟地址空间区域划分

掌握进程虚拟地址空间区域划分在阅读本文前大家需要明确,本文是在X86体系,32位Linux环境下进行描述的。任何的编程语言在编译链接时都只会产生两种东西:指令和数据。编译链接后会产生一个可执行文件,存储在磁盘上,当然CPU是不可能直接运行磁盘上的程序的,还需要将磁盘上的程序加载到内存当中。那么,问题是将可执行文件中的哪些内容加载到内存当中呢?加载到内存当中后又是如何存放的?内存中有没有区域的划...

2019-09-12 19:29:51 383

原创 数据结构——C语言实现顺序表

数据结构——C语言实现顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。一般情况下顺序表是以数组为基础,结构体为框架来实现的。数组存储。在数组上完成数据的增删查改,而结构体中包含了存储数据的数组、所存储数据的实际长度以及顺序表的容量。顺序表一般可分为:1.静态顺序表:使用定长数组存储#define N 100typedef int SLDataType;typede...

2019-09-11 23:04:37 3279

原创 指针的初级认识

指针是什么?在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存储在电脑存储器中另一块地方的值。由于通过地址能找到所需的变量单元,所以可以理解为地址指向该变量单元。因此,将地址形象化的成为“指针”。意思是通过它能找到以它为地址的内存单元。指针存储的是什么?指针是个变量,存储内存单元的地址(编号)。用代码实现:#include <stdio.h&g...

2019-06-20 11:42:11 287

原创 指针八大经典题目

在此,我们将讲述C语言的精髓——指针的八道经典题目,这里我们主要以画图的方式解答。提前说明:二维数组我们可以想象成由几个简单的一维数组组成。题目一:int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf("%d,%d", *(a + 1), *(ptr ...

2019-06-16 22:23:39 10612 6

原创 求一组数据中仅出现了一次的元素(其余元素都是成对出现的)

题目:一组数据中有部分数字仅出现了一次,其他所有数字都是成对出现的,请找出这些数字。例如,1,3,2,5,5,3,2,7,1,9。要求:1.使用位运算。2.不能创建除存储数据以外的新的数组 。 3.使用函数,并且函数中不能出现打印语句 。题目分析: 首先,我们需要创建一个数组来存储,在函数参数传递的过程中数组的长度是必须要传的,因为在数组传递过程中传递的数组首元素...

2019-05-25 23:05:20 330 1

原创 C语言实现扫雷游戏

设计要求:1.第一次不会被雷炸死。2.点开如果不是雷显示周围雷的个数。3.周围没有雷,则展开一片。实现思路:1.首先需要设计两个雷阵,一个是设计者用来存储布置雷场数据的雷阵,另一个是玩家用来扫雷的雷阵2.布雷:我们需要设计一个A*A(A代表雷阵大小,根据设计者需要自行设计)的雷阵,布有X(X代表雷的个数,根据设计者与玩家需求自己设计)个雷,那我们可以用二维数组来实现雷阵,用...

2019-05-24 22:55:01 1424 3

原创 简单的三子棋(棋盘大小可变)

三子棋的逻辑:首先第一步:需要写出游戏菜单,判断是否需要进行游戏;第二步:对棋盘进行初始化,将棋盘初始化为空格;第三步:打印棋盘。接下来就开始下棋啦,首先玩家输入坐标进行下棋,进而电脑自动随机生成坐标进行下棋(需要注意防止所输入坐标已经被占用的现象)。最终就是判断输赢的函数咯,不过要注意的是一定不要忘了判断棋盘是否已满,如果棋盘满了就是平局啦。具体代码如下:函数声明:game.h#...

2019-05-23 20:55:33 1864

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除