自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基础排序算法

冒泡排序冒泡排序的本质是交换排序,他也是最基础的一种排序算法。冒牌排序的基本思想时从第一个数开始,依次进行比较,每一次都将未排好序的序列中最大的一个数放到数组的最后一个位置,每次未排好序的序列减一,知道整个数组有序为止。例如:有如下一组数据第一轮的排序中,会将最大的一个数字(在这里就是55)放置在最后面。首先会从 i = 0,第一次比较 i 与 i + 1 (在这里就是 6 与 25)...

2020-01-12 15:32:28 143

原创 C++智能指针

大家都知道C/C++中对内存进行动态申请的时候, 堆上开辟的空间一定要进行释放, 否则造成了内存泄漏是一件十分危险的事情, 但是我们在平时写代码的时候, 难免会忘记释放空间, 或者当程序抛出异常的时候, 释放空间的代码被跳过, 执行到, 这都是造成内存泄漏的原因. 为了解决这一情况, C++中引入了智能指针,来对动态开辟的内存进行管理.RAII思想RAII的思想是指, 利用对象的生命周期来对程...

2019-12-01 17:41:21 111

原创 C++实现单例模式

单例模式单例模式属于创建性的模式, 它提供了一种创建对象的最佳方法,他设计到一个单一的类,也就是说,一个类只能实例化一个对象. 并且还需要给其他对象提供全局访问点.单例模式的实现方式主要有 饿汉模式 和 懒汉模式饿汉模式饿汉模式的意思是, 无论程序将来是否使用这个类, 在程序已启动的时候,就对对象进行实例化饿汉模式的实现需要在类的内部就对声明一个该类静态成员对象, 并且在类外进行初始化,...

2019-11-14 18:20:34 162

原创 C++实现工厂模式

什么是设计模式设计模式是一套被多数人知晓, 被大家反复使用的一种代码设计经验的总结, 在写代码的时候合理的运用设计模式,可以使自己的代码的可读性变得更高, 也可以增强代码的复用性单例模式单例模式属于创建性的模式, 它提供了一种创建对象的最佳方法,他设计到一个单一的类,也就是说,一个类只能实例化一个对象. 并且还需要给其他对象提供全局访问点.单例模式的实现方式主要有 饿汉模式 和 懒汉模式...

2019-11-12 22:26:29 147

原创 Linux---进程间通信方式

进程间通信时什么?在Linux下每一个进程都拥有自己的虚拟的值空间, 因此进程与进程之间都是相互独立的, 所以当两个进程之间想要进行数据交互的时候, 他们自身是没有办法完成的, 所以操作系统为进程之间提供了进程间的通信方式, 也就是为进程之间提供了一个公共的媒介.进程间通信所完成的任务进程间数据传输数据共享进程控制事件通知进程间通信方式管道(命名管道/匿名管道)管道在...

2019-10-24 20:39:05 91

原创 Linux---线程池

**线程池是一个线程的使用模式, 当线程创建过多的时候,会带来调度开销, 而当处理短时时间任务比较多的时候, 者中调度开销,可能会影响程序执行的性能, 而线程池维护着多个线程, 它等待着用户向他分配并发可执行任务,当没有任务到来的时候, 线程池中的线程不会退出,而是进行等待, 并且线程池中也包含一个任务队列, 用户只需要将处理的任务放在任务队列中, 而线程会自己去想任务队列中拿去任务进行处理 **...

2019-10-18 18:52:19 154

原创 Linux---进程间信号

信号的概念信号就是一个中断 : 它通知一个事件的发生(打断当前的操作(选择合适的时机),去处理信号)而进程的信号就是一个软件(应用程序)的中断信号的种类在Linux下,使用 kill -l 命令查看信号的种类一共有62种信号1~31号信号是Linux继承Unix而来的31种事件信号,当系统发生对应的时间的时候,就会发送对应的信号34~64号信号是没有指定具体事件的,当我们用户需要...

2019-10-15 11:17:44 105

原创 Linux---五种IO模型

概念说明用户空间与内核空间同步与异步进程的阻塞阻塞与非阻塞缓存IO1. 用户空间与内核空间对于32位操作系统而言,它的寻址空间(虚拟地址空间)为4G,操作系统的核心是内核, 他独立于其他的应用程序, 既可以访内存空间,也可以访问外部的硬盘, 为了保证内核的安全, 使用户进程不能直接访问内核对于Linux操作系统而言, 将寻址空间的高1G个字节置为内核空间, 将低3G字节的空间置为...

2019-10-10 22:38:52 103

原创 Linux---TCP/IP协议栈中网络层与链路层--实现与特性

网络层作用 : 负责地质管理与路由选择在网络通信中, 通信的两端称为主机, 而在两个主机之间会存在着许许多多的有路由器组成的复杂网络. 每一个主机都配有IP地址, 而主机与主机之间的协议主要就是IP协议IP协议字段4位版本 : 指定当前的协议是哪一个版本, 有创建socket是所传的地址域决定.4位首部长度 : 标志了IP协议的头部长度8位TOS服务类型 : 3位弃用,一位保留, 四...

2019-10-04 16:05:39 454

原创 C++---STL.string

string是我们在STL中的一个很实用的容器, 他的底层就是一个类, 用来存储字符, 并且它具备类的6大成员函数size(), resize(), reserve(),capacity()size() : size()接口用来获取当前字符串的有效字符长度.capacity() : capacity()接口用来获取当前string对象的容量大小.resize() : 他改变的是size...

2019-09-26 20:24:32 89

原创 Linux---线程安全中的死锁问题以及其他锁的探究

死锁的产生是由于 : 多个线程对多个锁资源进行争抢, 但是因为推进顺序不当而造成了互相等待, 使程序流程无法继续向下进行死锁的四个必要条件互斥条件 : 一个资源只能被一个执行流使用不可剥夺条件 : 一个执行流已经获得的资源, 在没有使用完之前, 不能被强行剥夺走请求与保持条件 : 一个执行流因请求资源而陷入阻塞的时候, 对已将获得的资源保持不放环路等待条件 : 若干个执行流之间形成一...

2019-09-26 18:35:59 95

原创 Linux---消费者与生产者模型

什么是消费者与生产者模型消费者与生产者模型是通过一个容器来解决两者的前耦合问题 , 生产者生产出一个产品之后,将其放到这个容器中, 消费者消费的时候在从容器中拿到这个产品, 这个容器就相当于一个缓冲区.总结来说就是:一个场所,两个角色,三种关系生产者与生产者之间是互斥关系消费者与消费者之间是同步关系生产者与消费者之间是同步与互斥的关系消费者与生产者模型的优点在于解耦合,支持并发,...

2019-09-24 10:51:31 111

原创 Linux---TCP/IP协议栈中应用层与传输层常见协议--实现与特性

1. 应用层应用层主要用于负责应用程序之间的数据沟通应用层的协议一般有用户自己制定, 但也不缺乏一些有大佬制定出来,被人们广泛认可的知名协议私有协议—网络版计算器假如要实现一个网络版计算器客户端 : 将两个数字和一个运算符号传给服务端服务端 : 服务端对接受到的数据进行解析,运算,之后将运算的结果返回给客户端假设有约定 : 我们将两个数字与一个运算符用一个结构体保存起来,发送数据时将...

2019-09-24 10:23:15 1251

原创 Linux---TCP套接字编程

三次握手协议基于TCP协议的网络编程的特点是 : 面向连接, 可靠传输, 提供字节流服务, 由于TCP协议的特性, 因此哎客户端与服务端进行数据通信时, 需要两端先建立连接建立连接时 , 首先由客户端向服务端发起建立连接的请求, 确定服务端是否在线, 服务端在线的话就会对客户端做出回复, 但是为了避免客户端发起请求后进下线, 因此服务端在进行回复的信息中也会加上向客户端的请求,确定客户端是否能...

2019-09-21 13:46:01 175

原创 Linux---UDP套接字编程

UDP与TCP网络通信网络通信在传输层进行的,他实现了两台主机之间通过网络从而达到了通信. 在传输层的典型协议有两个,UDP与TCP, 他们各自拥有各自的特点UDPUDP称为用户数据报协议, 他的特点是 : 无连接, 不可靠, 面向数据报. 意为用户在利用UDP协议进行通信的时候, 不关心对端用户是否在线, 直接发送数据, 同时对数据的安全性能要求没有TCP协议那样的高, 但他要求实时性高...

2019-09-16 09:45:40 200

原创 C++多态

多态是什么通俗的将多态就是多中形态 , 具体讲就是去完成某个行为时不同的对象去完成是会产生不同的状态, 就像买票这一件事情, 成人去买票就是全票, 学生去买票就是半票, 不同的对象去完成同一件事情, 产生的状态是不同的在C++中, 就体现在不同的但有继承关系的类的对象, 去调用同一个对象时, 产生了不同的行为如下代码中同样的接口在不同的对象去调用的时候, 打印的效果是不同的class pe...

2019-09-12 19:59:04 118

原创 Linux---网络基础

网络的发展在计算机刚出现的时代 , 每一台计算机相对于其他的计算机都是独立的 , 也就是他们只能处理单机的任务 , 但是在许多大项目或者大工程的实现的时候, 往往需要多人协同完成开发 , 每一个人实现项目的一部分 , 在通过磁盘拷贝将一台计算机上的程序与另一台计算机上的程序结合起来 . 但这种方式是十分的不科学的, 因此就有了路由器的诞生 , 一个路由器可以连接多台主机 , 这些主机通过路由器...

2019-09-12 19:28:40 121

原创 Linux---线程安全

线程安全就是多个线程对临界资源进行访问, 是数据产生二义性临界资源 : 多个执行流都能够访问的资源称为临界资源 , 多个执行流会对这个资源进行竞争实现线程安全的方式为同步与互斥互斥互斥的意为线程对临界资源的访问为同一时间只有一个线程可以进行访问...

2019-09-04 18:57:11 152

原创 C++继承

继承机制实际上是对代码的一种复用 , 他可以在保持原有类特性的基础上进行拓展. 这样,我们把被复用的类称为 基类(父类) , 复用基类生成的新类 , 我们称为 派生类(子类)class person{public: void print(){ cout<<"_age:"<<_age; cout<<"_name"<<_name; ...

2019-09-03 11:30:52 145

原创 Linux---线程控制

操作系统没有直接给用户提供线程的系统调用函数 , 所有就要大佬将一套线程控制接口封装成了库函数共用户使用所以创建的线程是一个用户态的线程, 但是在内核中对应有一个轻量级进程实现程序的调度运行线程创建int pthread_create(pthread_t *thread, const pthread_attr_t *attr void *(*sta...

2019-08-30 18:49:29 95

原创 Linux---线程概念

在Linux下 , 操作系统是通过PCB来模拟线程的.因为CPU是通过操控PCB来操作进程的 , 每一个进程都有一个属于自己的虚拟地址空间, 并且通过页表对应到内存上如下图中, 一个程序有四个函数 , 此时要创建4个进程分别去执行四个函数的话, 需要创建四个虚拟地址空间 , 通过页表的映射 , 找到四个函数分别内存上的地址,来执行四个函数当我们要让进程执行不同的函数时, 因为创建一个进程时...

2019-08-30 18:06:15 106

原创 Linux---基础命令

Linux是一款依靠输入指令进行操作的操作系统, 它的常用的命令包含了对目录操作的命令,对文件操作的命令, 以及一些其他的命令等等目录相关命令ls :列出当目录下的文件列表信息ls -a : 显示隐藏的文件, 在Linux下,以符号点( . )为开头的文件是隐藏文件, 默认不显示ls -l : 显示文件的详细信息, 相信信息包含 :类型权限 连接数 文件所属的用户名 用户...

2019-08-29 18:55:04 338

原创 unordered_map与unordered_set的实现

unordered_map与unordered_setunordered_map与unordered_set大体上与map和set的特性是相同的, 但是unordered系列的关联式容器是无顺序的, 这是因为他的底层结构为哈希表,而且由于哈希表的性能略高于红黑树, 因此unordered关联式容器的性能也略高除此之外, map 与 set 的迭代器因为红黑树每个节点是三叉的,所以它提供双向的迭...

2019-08-29 17:25:19 459

原创 哈希表(开散列)

哈希表的结构有闭散列和开散列,闭散列的问题就在于, 产生哈希冲突太多的时候,就会是哈希表的性能下降. 而开散列的优点在在于. 它在哈希表的每一行键值位置下面挂了一个链表, 哈希表中存放链表头结点的指针, 所以这里的 vector 是一个指针数组, 当产生哈希冲突的时候, 只需要在相同键值的链表下面在挂一个节点就可.这样的到的就像一个个桶一样, 因此也叫哈希桶哈希桶与结点template<...

2019-08-28 16:46:20 164

原创 哈希表(闭散列)

在红黑树中,我们对其中的元素进行操作的时候,每一个键值要通过层层的比较才能定位到它的准确位置,虽然他的时间复杂度已经为O(log N)了,但是它还不是最理想的情况, 最理想的情况是,当我们没拿到一个键值的时候,就能直接找到它所映射的那个位置, 这样就能将时间复杂度直接降到 O(1),我们这中映射关系叫做哈希函数, 将存储数据的表叫做哈希表.哈希函数与哈希表(闭散列)其实STL中的vector就...

2019-08-25 17:39:46 287

原创 红黑树

红黑树也是在二叉搜索树的基础是上对其性能的一个拓展, 虽然AVL树的性能已经很高了,但是它在调整的时候由于平衡因子出现的多种情况导致的旋转是非常多的,因此在实现的时候也就会变得相当的复杂. 而红黑树虽然也涉及到了旋转,但他相对于AVL树是稍微简单的,AVL树和红黑树的时间复杂度都为O(long N),假设有是一个数据插入到AVL树中,他操作的次数大约为30次,红黑树操作的次数大约为60次,但对与计...

2019-08-19 17:27:00 90

原创 AVL树

AVL树是在二叉搜索树的基础上的一种优化, 在操作二叉搜索树的时候无论是插入节点还是删除节点,都需要去遍历寻找位置,因此操作二叉搜索树的时间复杂度为O(log N),但是当我们的二叉搜索树为单边树的时候, 进行一次操作的时间复杂度就变成了O(N),这两者之间的差距还是非常大的.AVL树是二叉搜索树的基础之上多了一个平衡因子, 每个节点的平衡因子就是其对应的结点的右子树的高度与左子树的高度之差, ...

2019-08-16 15:32:29 79

原创 二叉搜索树

二叉搜索书是一个有排序的树,特点就在于将二叉搜索书按照中序进行遍历的时候的得到的是一个有小到大的有序数列在创建二叉搜索树的时候,当数据大于当前节点的数据值时就向右子树中插入,当小于当前结点的数据值时,就向左子树插入.如上图将其按照中序遍历的结果刚好为: 0,1,2,3,4,5,6,7,8,9注意:二叉搜索树中没有相同的值二叉搜索树的定义以及节点定义template<class T&...

2019-08-07 17:56:51 104

原创 Linux----进程概念

**程序:**程序指的是一系列有逻辑, 有顺序结构的指令.**进程:**进程从两个角度来说:1 用户角度: 进程从用户角度来说就是运行中的程序2 操作系统的角度: 进程是操作系统对运行中程序的描述信息, 叫做...

2019-05-04 20:30:02 188

原创 C++List的模拟实现

list的基本结构list在库中是一个实现删除插入的一个容器, 其中底层的结构是一个双向的循环链表.链表中的每一个元素都存储在每一个互不相干的独立结点之中. 每一结点中保存了该结点的前一个元素和后一个元素的地址. 对其进行删除插入的操作的时候, 时间复杂度都是O(1);list不同的地方就在于其迭代器的实现, 由于List中所存储的都是每一个结点的地址,因此对迭代器进行解引用以及++/–操作...

2019-04-22 18:09:56 121

原创 Date日期类

对日期类实现的大致流程在私有成员中定义 int 整形的年(_year),月(_month),日(_day).在公有成员中实现a.构造函数 Date(int year=1990,int month=1,int day=1);b.拷贝构造函数 Date(const Date& d);c.赋值运算符的重载 Date& operator=(c...

2019-03-24 21:08:21 193

原创 C++模板

1.泛型编程泛型编程指的是编写与类型无关的代码,让系统或者编译器自己根据不同的类型去生成相应的代码. 我们把这一类编程叫做泛型编程.对于实现一个交换函数我们都是通过类似于如下的代码去实现的. 但是下面的代码只能实现 int 类型的变量的交换. 对于 double型的变量来说, 就只能重新去写一个交换函数.int Swap(int & a,int & b){int tem=*...

2019-03-24 19:09:26 133

原创 C与C++的内存管理

C++与C语言的内存区域划分C++和C语言虽然在申请动态的内存的时候的方法略有不同. 但他们在计算机中的存储区域是相同的.数据的存储形式主要是在1.栈 2.堆 3.数据段 4.代码段 这四个地方存储.他们在内存上由上向下一次排开. 其中:1.静态数据与全局的数据存储在数据段上.2.局部变量定义的数据存储在栈上.3.一动态内存申请方式申请的数据保存在堆上.4.一些可执行的代码,...

2019-03-20 20:02:08 162

原创 C++入门

前言经过一段时间对C语言和数据结构的学习, 前期的编程学习算是告一段落, 今天正式学习了C++ 就像小时候学习语文一样都有如下的一个过程.识字—&gt;造句—&gt;写作文C++的学习也是这样的关键组—&gt;逻辑语句—&gt;实现编程下面总结今天学到的关键字1.namespace(命名空间)在实现大型的项目的时候难免会出现定义冲突的时候, 这种现象我们叫做重定义行为. 为了解决重定...

2019-03-09 21:37:31 87

原创 数据结构1-线性表(顺序表)

线性表线性表(是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成...

2018-12-02 10:18:59 170

原创 C语言基础练习3

1.将数组A中的内容和数组B中的内容进行交换。(数组一样大)#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;void Exchange(int* arr1[],int* arr2[],int len){ int t; for (int i = 0; i &lt; len; ++i){ t = arr1[i]; arr1[i] = ar...

2018-11-27 17:29:35 103

原创 C语言基础练习2

作业:给定两个整形变量的值,将两个值的内容进行交换。#define _CRT_SECURE_NO_WARNINGS#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;int main(){int a, b,t; printf("请输入两个整数:\n"); scanf("%d%d", &amp;a, &amp;b); printf(.

2018-11-27 10:45:46 145

原创 C语言基础练习1

1.打印100-200之间的素数#include &lt;stdio.h&gt;#include &lt;math.h&gt;int main(){ int a = 0; int b = 0; for (a = 100; a &lt;= 200; a++){ int j = 0; for (j = 2; j &lt;= sqrt(a); j++){ if (a%j == ...

2018-11-20 17:22:27 104

原创 几个字符函数的实现

1.strlen函数的实现非递归实现int Mystrlen(const char* str){ int count = 0; while (*str != '\0'){ ++count; ++str; } return count;}递归实现int MystrlenDigui(const char* str){ if (*str == '\0'){ return...

2018-11-13 21:33:55 135

原创 C语言基础练习4

有这样的一个数组, 其中的元素都是成对处出现的, 只有两个元素出现了一次. 要设法找出这两个元素.首先, 我们将数组的收元素存在变量 tem 中,然后将 tem 中的元素依次与数组中的每一个元素进行对比. 如果相等则使变量 k++ .当对比完成之后如果k的值等于1,则打印tem中的值. 然后利用循环对数组中每一个元素进行此操作.具体代码如下#include&amp;lt;stdio.h&amp;gt;#i...

2018-11-07 12:22:50 131

空空如也

空空如也

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

TA关注的人

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