自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关联容器——(map/multimap)

1、map的特性map的特性是所有元素都会根据元素的键值自动被排序,map的所有元素都是一对的(pair),同时拥有实值(value)和键值(key)。pair中的第一个元素被看作键值,第二个元素被看做实值,且map不允许两个元素拥有相同的键值。map和list拥有相同的某些性质,当它对容器元素进行添加或删除时,操作之前的所有迭代器在操作完成值后依然有效。2、map的初始化map&...

2019-09-16 11:56:22 172

原创 关联容器——(set/multiset)

关联容器与序列容器有着根本性的不同,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的。关联容器支持高效的关键字查找与访问。set实际上是一个单集合,它的底层是由红黑树实现的。set的特性是,所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set...

2019-09-15 18:31:41 181

原创 顺序容器——deque

deque的底层实现是一个双端队列,即是一种双向开口的连续线性空间,在其头部和尾部都可以做插入和删除的操作,且时间复杂度都为O(1)。deque没有容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并组合起来。1、deque容器的优缺点优点:支持快速的头插尾插和头删尾删以及直接访问缺点:按位置插入和删除的时间复杂度大2.deque的适用场景 需要在两...

2019-08-21 18:35:14 305

原创 顺序容器——list

list相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个空间。因此,list对于空间的利用有绝对的精准,一点也不浪费。而且,对于任何位置的元素的插入或删除,它的时间复杂度都为O(1)。list容器的底层实际上是一个双向循环链表。list本身和list的节点的结构是不同的,需要分开设计list的节点定义:template&l...

2019-08-21 16:32:20 512

原创 顺序容器——vector

1、vector定义及概述vector与array非常相似,唯一的区别在于灵活性,数组是静态空间,一旦定义就不能改变,变大变小都需要客户端自己重新配置新的空间,然后将元素从旧址搬到新址,再把原来的空间还给系统。vector是动态空间,随着元素的加入,他的内部机制会自行扩充空间以容纳新元素。1.vector的底层实现vector所采用的是一个连续的线性空间,以两个迭代器start和f...

2019-08-20 17:11:02 186

原创 设计模式——观察者模式

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都要得到通知并自动更新。在观察者模式中有两种角色:观察者和监听者观察者:通知对该事件感兴趣的监听者监听者:处理事件事件对于监听者可以是1对1,也可以是1对多的关系举个例子:教室里有几个学生,趁着老师没在,各自做着与学习无关的事,小李在玩手机,小王在看小说,小刘在打游戏,他们让小胡帮忙看着...

2019-08-17 17:52:34 90

原创 设计模式——单例模式

单例模式,即保证一个类仅可以有一个实例化对象,并且提供一个可以访问它的全局接口。主要解决的问题:一个全局使用的类频繁的创建与销毁什么时候使用:想控制实例数目,节省系统资源时单例模式的实现方式分为两种,懒汉和饿汉单例模式的实现要点:全局只有一个static特性实例,同时禁止用户自己声明并定义实例 线程安全 禁止赋值和拷贝 用户使用static成员函数通过接口获取实例1.懒...

2019-08-17 16:06:09 95

原创 设计模式——工厂模式

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来执行新创建的对象。工厂模式作为一种创建模式,一般在用在创建复杂对象,在创建简单对象时,还是建议直接使用new完成一个实例对象的创建。1.简单工厂模式特点:需要在工厂类中做判断,从而创造出相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可以创建一个产品。缺点:工厂...

2019-08-15 15:37:17 118

原创 C++内存池的设计及思想

内存池的引入——默认内存管理函数的不足new/delete或malloc/free分配和释放内存时会有一些额外开销 系统在接收到分配内存的请求时,首先要查找内部维护的内存空闲块表,并需要根据一定的算法,找到合适大小的空闲内存块。如果该空闲的内存块过大,则需要切割成已分配的部分和较小的内存块。然后系统更新内存空间块表,完成一次分配。在释放内存时,系统将释放的内存块重新加入到空闲内存块表中。也有...

2019-08-13 14:35:15 179

原创 LT模式&ET模式

LT:在数据到达之后,无论程序是没有接收,还是接收了,但没有接收完,下一轮epoll_wait仍然会提醒应用程序该描述符上有数据,知道数据被接收完。ET:在数据到达之后,无论程序是没有接收,还是接收了,但是没有接收完,都只提醒一次,下一轮不再提醒应用程序该描述符上有数据。同一事件仅仅被触发一次ET的实现:#include<string.h>#include<s...

2019-08-08 18:35:32 485

原创 I/O复用——poll&epollu

poll系统调用和select类似,也是在指定的时间内轮询一定数量的文件描述符,以测试其中是否有就绪者。int poll(struct pollfd *fds,int nfds,int timeout);fds:是一个pollfd结构类型的数组,它指定所有用户感兴趣的文件描述符上发生的可读、可写和异常等事件。传入的是数组的首地址 。pollfd结构体定义:struct pollf...

2019-08-08 16:36:12 159

原创 I/O复用——select

I/O复用——一个进程或线程能同时对多个文件描述符(socket)提供服务。select 记录每种时间的结构,在数组按位来记录关注的文件描述符上的事件 每次最多可以监听1024个文件描述符,并且其最大值是1023 select函数返回时,通过传递的结构体变量将结果带回,并且内核会修改用户变量 int select(int nfds,fd_set *readfds,...

2019-08-05 14:31:15 138

原创 进程池&线程池

进程池和线程池概述进程池和线程池相似,所以这里我们以进程池为例介绍,下面对进程池的讨论完全适用于线程池(如果没有特殊声明)。进程池是由服务器预先创建的一组子进程,这些子进程的数目在3~10个之间(典型情况)。线程池的数量应该和CPU数量差不多。进程池中的所有子进程都运行者相同的代码,并具有相同的属性。因为进程池在服务器启动之初就创建好了,所以每个子进程都相对“干净”,即它们没有打开不必...

2019-08-04 17:34:50 298

原创 多进程&多线程

多进程accept()创建子进程,由子进程和客户端通讯,父进程继续接受客户端连接 启动多个进程,每个进程执行和一个客户端交互的程序 父进程完成与客户端的连接工作,完成后,创建子进程,子进程与客户端具体交互 子进程继承父进程打开的文件描述符(accept返回的文件描述符) 父进程必须关闭文件描述符#include<stdio.h>#include<string.h...

2019-08-03 13:56:22 206

原创 应用层协议(DNS&HTTP&HTTPS)

DNSDNS——域名解析协议解析方式:递归式 迭代式递归式迭代式迭代式降低了根域的压力HTTPHTTP:超文本传输协议,端口号为801、HTTP协议特点:支持客户/服务器模式 简单快速。客户向服务器请求服务时,只需传送请求方法和路径 灵活。允许传输任意类型的数据对象 无连接。其含义是限制每次连接只处理一个请求,服务器处理完客户的请求并收到客...

2019-08-02 16:42:38 337

原创 TCP编程流程

用到的函数#include<sys/types.h>#include<sys/socket.h>int socket(int domain,int type,int pro);//创建socket返回值:出错返回-1,成功返回文件描述符domain:协议簇 AF_INETtype:具体的协议 SOCK_STREAMPro:默认为0int...

2019-08-01 21:09:11 175

原创 IOS七层模型和TCP/IP四层模型

OSI七层协议模型应用层————为应用数据提供服务表示层————数据格式转化,数据加密会话层————建立、维护和管理会话传输层————建立、维护和管理端到端的链接,控制数据传输的方式网络层————数据传输线路选择,IP地址及路由选择数据链路层———提供截至访问和链路管理数据传输由顶向下,下层为上层提供服务TCP/IP四层协议模型应用层————HTTP H...

2019-08-01 19:37:19 1976

原创 网络基础

1、什么是网络将两台(两台以上)的主机连接起来。2、什么是互联网将各个网络连接起来(路由器),最大的互联网Inter。3、互联网中通讯的主角:运行在不同主机上的两个进程。4、如何在网络上标识进程:IP地址+端口号IP地址:标识网络中的主机端口号:标识标识主机上的进程5、网络设备:交换机 路由器(选路、存储、转发)6、网络设备:双绞线、同轴电缆、光纤8、...

2019-08-01 18:23:45 96

原创 线程安全

相同的条件下,同一份程序,多次执行结果不同,执行结果有二义性,说明该线程是不安全的,那么怎样使线程变得安全就成了一个值得研究的问题。下面我们以一个例子来说明这个问题;#include<stdio.h>#include<string.h>#include<unistd.h>#include<stdlib.h>#include<a...

2019-08-01 17:23:21 99

原创 线程的同步方法

1、信号量这里和进程间的信号量作用相似,当线程访问一些有限的共享资源时,就必须做到线程间同步访问。信号量的使用方式:#include<semaphore.h>初始化:int sem_init(sem_t *sem,int shared,int val);信号量sem一般被定义在线程共享的全局数据区,sem_init函数是将信号量sem的初始值设置为val,shared参...

2019-07-31 20:38:07 141

原创 线程的创建与实现

一、线程的创建与实现——线程库的使用线程库包含在头文件pthread.h中创建:int pthread_create(pthread_t *id,pthread_attr_t *attr,void *(*pthread_fun)(void*),void *arg);id:线程id,线程创建时分配的线程ID,传递一个变量的地址attr:线程属性,默认为空pthread_fun:线程...

2019-07-31 15:48:35 209

原创 线程(定义及和进程之间的区别)

1、什么是线程线程是轻量级的进程线程是进程内部的一条执行序列,或者执行流,每个进程至少有一条线程,称之为主线程,从代码角度看,就是main函数的函数体,在主线程中可以通过线程库创建其他线程(函数线程)。主线程和函数线程会同时向下运行。2、进程与线程的区别进程是资源分配的最小单位,线程是程序运行的最小单位(资源调度的最小单位) 线程依赖于进程,线程在进程内部,一个进程至少包含一个线...

2019-07-29 09:23:19 164

原创 套接字——socket

套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。Linux所提供的的功能和网络工具通常都是通过套接字来进行通讯的。套接字的创建与管道是有区别的,因为套接字明确的将客户和服务器区分开来。套接字机制可以实现将多个客户链接到一个服务器上。1、套接字的分类套接字分为三种,分别是流式套接字、数据报套接字和原始套接字。流式套接字。它提供了一种...

2019-07-27 11:54:56 623

原创 消息队列

消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法。与命名管道相比,消息队列的优势在于,它独立于发送和接收进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。而且,每个数据块都被认为含有一个类型,接收进程可以独立的接收含有不同类型值的数据块。好的是,我们可以通过发送消息来几乎完全避免管道的同步和阻...

2019-07-26 17:54:33 189

原创 共享内存

共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。1、实现原理共享内存区域说白了就是多个进程共享的一块物理内存地址,只是将这块物理内存分别映射到自己的虚拟空间地址上。假设有10个进程将这块区域映射到自己的虚拟地址上,那么这10个进程就可以相互通信。由于是同一块区域在这10个进程的虚拟地址上,当第一个进程向这块共享内存的虚拟地址中写入数据时,其他9个进程也会看到。因此共享内存...

2019-07-25 17:34:00 281

原创 信号量——P、V操作、临界资源、临界区、进程同步

1、信号量用来同步进程的特殊变量;一个特殊的计数器,大于0时记录资源的数量,小于0时记录等待资源的进程的数量。当信号量的值大于0时,进程总是可以获取到资源并使用,小于0 时,进程必须阻塞等待有其他进程释放资源。2、临界资源临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式实现共享的资源称作临界资源。属于临界资源的硬件有打印机、磁带机等;软件资源有消息队列、变量、数组、缓冲...

2019-07-25 15:48:25 1701

原创 管道

进程间通讯就像现实中的管道一样,有一个进程进行写操作,其余的进程进行读操作。如果管道为空则read操作会阻塞,如果管道为满则write操作会阻塞。因此这里我们就引入了管道(pipe)管道的特点:通讯数据遵循先进先出的原则,并且都是半双工通信原则,写入管道数据在内存存放。分类:管道分为两种,有名管道和无名管道。1、有名管道和无名管道的区别有名管道:可以在任意进程之间进行通讯,通讯是双...

2019-07-24 20:20:01 154

原创 文件操作

1、文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传递给read或write。2、文件共享 父子进程对同一个文件使用了同一个文件偏移量。如果父子进程写到同一个文件描述符,但没有任何形...

2019-07-24 17:40:38 138

原创 进程管理

1、fork创建进程fork函数原型 : pid_t fork(void) fork函数会生成一个新的进程,调用fork函数的进程为父进程,新生成的进程为子进程。fork函数调用一次返回两次,在父子进程中返回进程的pid,在子进程中返回0,失败返回-1. 子进程的代码与父进程完全相同,同时他还会复制父进程的数据(堆数据、栈数据和静态数据)。数据的复制采用 写书拷贝技...

2019-07-22 13:52:28 82

原创 Linux——库文件

一、什么是库文件 库文件是预先编译好的方法的集合(某些已经完成的功能代码的集合),比如我们提前写好的一些数据公式的实现,将其打包成库文件,以后只需要库文件就可以而不需要重新编写,如C库(printf/string...),C++库 STL标准模板库。 库文件分为静态库和动态库(共享库) Windows下静态库的扩展名为.lib 动态库的扩展名为.DLL ...

2019-07-20 16:46:30 257

原创 Linux——gdb调试

调试的对象:debug版本的可执行文件gdb debug版本的可执行文件l 显示main函数所在的文件的源代码list filename:num 显示指定文件的源代码b linenum 在linenum行添加一个断点info b 查看断点信息d dpnum 删除断点r 启动运行n 单步执行s...

2019-07-20 14:20:11 90

原创 函数堆栈调用

要明白C++中函数的堆栈调用,首先我们应该弄清楚这五个问题;1、形参开辟内存吗?有谁开辟?答:形参开辟内存,由调用方开辟。2、形参的入栈顺序是什么?答:从右到左。3、返回值由谁带出?答:寄存器。4、被调用方结束后怎么回退到调用方上?答:调用栈底指针的地址保存到被调用方栈底指针。5、函数调用完一轮的下一条是怎么知道要继续进行下一行指令而不是从头开始执行?...

2019-07-20 12:44:22 181

原创 函数模板

在 C++ 中,模板分为函数模板和类模板两种。函数模板是用于生成函数的,类模板则是用于生成类的。一、函数模板函数模板写法:template<class 类型参数1,class 类型参数2,...>//class 可用typename 替换返回值类型 模板名(形参表){函数体;}1.编译1、定义点 模板头部 2、调用点 模板函数2....

2019-07-19 14:14:49 142

原创 TCP和UDP——总结

一、什么是TCP?TCP是TCP/IP体系中一个非常复杂的协议。1、TCP的主要特点1)TCP是面向连接的运输层协议。在使用TCP协议之前必须先建立连接,数据从传送完之后必须释放连接。(这里类似于打电话,通话之前必须先拨号建立连接,结束通话需要挂断,断开连接)2)每个TCP连接只能有两个端点,一条TCP连接之间必须是点对点(一对一)的。3)TCP提供全双工通讯(全双工通讯指...

2019-04-02 21:02:15 512

原创 八大排序

插入排序 最坏的时间复杂度是O(n²),最好是O(n),并且是稳定的1、思想:插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 ,如此重复,直至完成序列排序。2、 算法分析1. 从序列第一个元素开始,该元素可以认为已经被排序2. 取出下一个元素,设为待插入元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于待插入元素,将该元素移...

2019-03-15 17:14:25 175

原创 类和对象(一)

一.首先我们先用一个图来明确一下类与对象二.C++所具有的三大特征     封装    继承    多态三.访问限定符    1.public:任意位置访问    2.protected:本类,子类类中访问    3.private:本类类中问在类中默认的访问限定符是私有的,在结构体中默认的访问限定符是私有的.四.this指针(this call)    类...

2019-01-18 19:01:32 95

原创 new 和 delete关键字

 一、在了解new和delete之前我们先回顾一下C语言中malloc和free的用法。    malloc:用来在堆上动态开辟内存    free:释放内存 二、现在我们来简单了解一下new和delete的用法:    new:用来动态开辟内存(也可做初始化)    delete:用来释放空间和资源三、C++中new与c中malloc的区别1、new是一个关键字,而m...

2018-12-04 22:42:40 266

原创 C++中const的使用

一、C语言和C++中const的区别       在C语言中const所修饰的变量为常变量,其处理是在预编译阶段看常变量有没有做左值,其他和普通变量的处理方式相同。       C++中const所修饰的变量为常量,在编译阶段把用到常量的地方替换成常量出初始化的值。二、C++中const使用的特点       1、一定要进行初始化       2、不能有修改常量内存块的风险...

2018-12-04 20:07:09 602

原创 编译和链接

编译与链接的过程有以下几个环节:源程序-&gt;预处理-&gt;编译和优化-&gt;生成目标文件-&gt;链接-&gt;可执行文件C++的预处理是指在C++程序源代码被编译之前,由预处理器对C++程序源代码进行的处理。这个过程并不对程序的源代码进行解析。这里的预处理器(preprocessor)是指真正的编译开始之前由编译器调用的一个独立程序。编译和优化包括:词法分析 --...

2018-11-12 21:20:28 104

原创

栈:栈是只能在一端进行插入和删除操作的线性表(先进后出)定义顺序栈typedef struct Stack{ ELEM_TYPE data[MAXSIZE]; int top;}Stack;栈的初始化栈的第一个节点置为0,表示此栈为空void Init(Stack* pst){ pst-&gt;top = 0;    }判断栈满bool IsFull(Sta...

2018-11-10 22:26:03 106

空空如也

空空如也

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

TA关注的人

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