自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 单例模式的内存池

可以参照之前的两篇博客《普通内存池的实现》、《通用内存池的实现》单例模式的实现:(1)构造函数写在私有成员里面(2)有一个静态的成员函数用来生成一个唯一的对象代码实现:#include <iostream>using namespace std;const int MEM_POOL_SIZE = 5;template<typename T>class MEM_P...

2018-03-14 17:10:10 438

原创 通用内存池的实现

代码示例:#include<iostream>using namespace std;const int MEM_POOL_SIZE = 5;template<typename T>class MEM_POOL{public: void* alloc(size_t size) { if (pool == NULL) { int allocs...

2018-03-04 19:22:45 286

原创 普通内存池的实现

内存池的实现:数据结构部分是用的静态链表                         类和模板实现代码示例:#include <iostream>using namespace std;const int MEM_POOL_SIZE = 10;template<typename T>class Queue{public: class QueueItem...

2018-03-04 18:57:58 237

原创 STL(标准模板库)概述

1、容器(1)顺序容器(2)vector        可以进行插入的操作:push_back(尾插)、insert(按位置插)(3)deque        可以进行插入的操作:push_back、push_front、insertvector和deque有[]运算符的重载函数,list没有,因为list底层是一个双端队列。(4)list        可以进行插入的操作:push_back、p...

2018-03-01 19:51:22 200

原创 类模板的完全特例化和非完全特例化

有关类模板和函数模板的一些概念:1、函数模板不支持模板参数给默认值(C99标准),类模板支持参数给默认值。2、类模板有选择性实例化。3、类中部分函数特例化时,一定要提供成员方法的模板。4、成员方法的特例化不能在类外定义(语法不支持)。5、类模板不能进行模板的实参推演,实参推演只针对函数模板。6、出了编译器自动生成的成员函数之外,其他成员方法的模板完全可以代替普通的成员方法。代码示例:#includ...

2018-02-27 12:38:45 827

原创 用模板实现冒泡排序

代码实现:#include <iostream>using namespace std;#include <stdlib.h> //包含rand()的头文件template<typename T,int SIZE>//SIZE是非类型参数 非类型参数本身就是常量void sort(T array[]){ int i = 0; int j = 0...

2018-02-21 13:41:07 679

原创 C++中关于临时量和临时对象

一、临时量的生成1、内置类型产生的临时量:常量 不可更改2、自定义类型产生的临时量:变量 可以更改3、隐式产生的临时量:常量二、返回值1、返回内置类型的时候,产生的都是寄存器的立即数2、返回自定义类型的时候,也是通过寄存器返回的,但是用指针或者引用来接收返回值时,编译器会自动产生临时量3、返回对象时,一律产生临时量,并把临时量的地址作为实参传递进去,被调用函数通过访问ebp+8就能够访问临时量的地...

2018-02-20 12:34:19 996 1

原创 C++中String类的实现

要注意字符串是否为空代码实现:#include <iostream>using namespace std;#include <string.h> class CString{public: CString(char* p = "")//构造函数 { mstr = new char[strlen(p) + 1](); strcpy(mstr, p...

2018-02-18 20:26:20 193

原创 C++复数类的实现

代码实现:#include <iostream>using namespace std;class Complex{public: Complex(int real = 0,int image = 0) :mReal(real),mImage(image){}//构造函数 //复数与整数的+-*/ const Complex operator+(int rh...

2018-02-08 12:46:40 467

原创 C++运算符重载详解

一、为什么要运算符重载C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的,但是大多时候我们需要对我们自己定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。二、运算符重载的实质实质:函数重载或者函数多态三、运算符重载的规则1、运算符重载不能改变运算符的优先级这样会导致

2018-02-07 23:40:51 448

原创 Linux中select 、poll、epoll三者I/O复用的比较

前面我们讨论了select、poll、epoll三组I/O复用系统调用,这三个系统调用都可以同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回,返回值就是就绪文件描述符的数量,返回0表示没有事件发生。1、select系统调用select的参数类型fd_set没有将文件描述符和事件绑定,它仅仅是一个文件描述符集合,因此selec

2018-02-01 12:53:06 308

原创 C++STL容器

一、迭代器的概念(1)迭代器类似于指针类型,它也提供了对对象的间接访问(2)指针是C语言中就有的东西,而迭代器是C++中才有的(3)迭代器提供一个对容器对象或者string对象访问的方法,并且定义了容器范围二、关于迭代器和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员,比如,容器都有的成员begin和end,其中begin成员

2018-01-31 22:16:46 223

原创 Linux中fork系统调用的源码剖析

Linux中fork系统i调用的源码剖析首先 先给大家看一张图 系统的看一下大概的fork的主要流程上述图片中 最后eax寄存器置0 这个就是最后为什么子进程的返回值是0的理由下面 就来浅谈一下 fork源码long do_fork(unsigned long clone_flags,      unsigned lo

2018-01-30 19:46:37 543 1

原创 C++对象的生存周期

例题:请给出下面对象创建过程中涉及的方法打印#include <iostream>using namespace std;class Test{public: Test(int a=5, int b=5):ma(a), mb(b) { cout<<"Test(int, int)"<<endl; } ~Test() ...

2018-01-27 11:33:33 331

原创 C++用模板实现单链表(类外实现)

这一篇可以和上一篇 点击打开链接 模板实现单链表进行对比 看类外实现和类内实现的区别代码:#include using namespace std;templateclass CLink{public: class Node; CLink();//无参的构造函数 void InsertHead(T data);//头插 void InsertTail(T d

2018-01-25 11:20:26 2440 1

原创 C++用模板实现单链表

用模板实现单链表话不多说 直接上代码#include using namespace std;templateclass CLink;templateclass Node{ friend class CLink; public: /* 构造函数和析构函数一般不加类型参数 本类类中除了构造函数和析构函数以外 其它的地方都要加上类型参数 */ Node(

2018-01-25 10:55:02 676

原创 Linux中I/O复用——epoll函数详解及代码实现

Linux中I/O复用——epoll函数详解及代码实现一、为什么是epoll在前面用select函数有效的解决了多个I/O端口的复用问题,但是select函数存在两个缺陷:一是进程所能同时打开的文件描述符个数受FD_SETSIZE大小的限制;二是每个select函数返回可用的文件描述符集合后,应用都必须对所有已注册的文件描述符进行遍历对比,以确定哪个描述符上发生了事件,从而

2018-01-22 17:02:17 446

原创 Linux中I/O复用——select函数详解及代码实现

Linux中I/O复用——select函数详解及代码实现一、I/O复用1、I/O复用概念: 解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。2、I/O复用使用的场合:(1)当客户处理多个描述符(通常是交互式输入、网络套接字)时,必须使用I/O复用。(2)tcp服务器既要处理监听套接字,又要处理已连接套接

2018-01-21 22:40:09 419

原创 常对象、常成员函数、静态成员函数、静态成员变量

一、const1、常对象只能调用常成员函数2、普通对象可以调用全部的成员函数包括常成员函数3、常方法不能调用普通方法 可以调用常方法、静态成员方法4、普通方法可以调用常方法解释:当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;在X类的const...

2018-01-21 20:28:14 1527

原创 类和对象及类中的六个默认的函数

一、面向对象的三大特征1、封装2、继承3、多态二、类和对象的区别答:类是抽象的,对象是具体的,所以类不占用内存,而对象占用内存。三、类和struct的区别(1)struct中默认为public(2)类中默认为private四、生成对象的2步(1)申请内存(2)使用构造函数进行初始化五、销毁对象的2步(1)调用析构函数释放对象所占的资源(2)把内存归还给内核六、封装体现在哪?——三个访问限定符1、p...

2018-01-21 20:09:42 316

原创 C++实现带头结点的单链表(友元类)

代码实现 单链表的头插和尾插   #include using namespace std;class Node{ public: Node(int data, Node* next = NULL)//构造函数 { mdata = data; pnext = next; } //不用写析构函数 因为头结点是在栈上开辟的 //不需要手动去释放 所以不

2018-01-20 18:23:42 905

原创 金融IT——模拟银行ATM系统Java实现

Java语言模拟银行ATM系统一、整体模块二、ATM的功能1、开户功能2、存款功能3、取款功能4、查询功能5、修改密码功能6、退出系统功能三、功能描述1、取款功能:用户按照系统要求输入取款金额,若取款金额小于账户余额,则可以进行取款,否则不能取款;2、存款功能:用户按照系统要求输入存款金额,返回存款之后的金额;3、查询功能:系统直接返回账号的当前信息;4、修改密码功能:修改密码时需要输入两次密码,

2018-01-18 16:03:38 1839

原创 Linux中I/O复用——poll函数详解及代码实现

Linux中I/O复用——poll函数一、poll函数select() 和 poll() 系统调用的本质一样,poll() 与 select() 类似,与 select() 在本质上没有多大差别,管理多个文件描述符也是进行时间轮询,根据描述符的状态进行处理,但是 poll()没有最大文件描述符数量的限制(但是数量过大后性能也是会下降)。poll() 和 select() 同样存在一个缺点就是,包含

2018-01-18 15:39:44 469

原创 C++中的名字空间namespace

名字空间namespaceC++中的4个作用域1、全局作用域2、局部作用域3、名字空间作用域4、类作用域同名的空间作用域会合并#include using namespace std;int gdata = 10;namespace A{ int gdata = 11; int Sum(int a,int b) { retu

2017-12-24 19:29:38 248

原创 C/C++动态申请二维数组的区别

C/C++动态申请二维数组的区别紧接着上一篇C++博客,这篇继续写到C/C++关于动态申请二维数组的区别。1、C语言中动态申请二维数组二维数组的开辟:先开辟二维,再开辟一维。代码核心实现: //动态申请 int arr[10][10]; int **arr = (int **)malloc(sizeof(int *)

2017-12-24 18:53:35 385

原创 C/C++的区别(默认值、内联函数、函数重载、const、引用、参数、返回值)

一、默认值1、C语言C89标准无默认值C99标准有默认值最新的标准:C112、C++C++99标准C++11标准从右向左依次给出默认值参数的默认值只能给1次 例:int Sum(int,int);int main(){Sum(10,20);Return 0;} 编译时√链接出错:因为函数没有定义(实现),符号解析出错 

2017-12-21 12:35:16 354

原创 C++中预处理、编译、汇编、链接 .cpp-------->.exe

C++中预处理、编译、汇编、链接 .cpp-------->.exe一、编译阶段1、预编译   --->.i(1)展开头文件(2)替换#define(3)删除注释(4)添加行号(5)保留#pragma(6)删除宏:#if #endif2、编译  --->.s(1)词法分析(2)语法分析(3)语义分析(4)代码优化3、汇

2017-12-21 10:55:57 240

原创 堆栈调用方式

ebp:栈底指针寄存器esp:栈顶指针寄存器eax:累加寄存器ebx:基地址寄存器:在内存寻址时 存放基地址esi/edi:源/目标索引寄存器ecx:计数器1、返回:返回值是怎么带出来的?答:eax寄存器(四个字节)      (8个字节)2个寄存器带出 eax ebx2、函数调用后怎么知道回到调用方?答:在被调用一开始压入调用方的栈底该指针寄存器e

2017-12-21 10:42:27 378

原创 Linux中利用线程实现多个客户端和服务器端进行通信

上一篇博文讲了如何利用子进程实现多个客户端和服务器端进行通信,那么,这一篇博客就来实现一下如何利用线程实现多个客户端和服务器端进行通信代码实现:ser1.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#inc...

2017-12-11 11:27:29 3664 1

原创 Linux中利用子进程实现多个客户端和服务器端通信

我在前面一篇博客中已经讲过了客户端和服务器端通信的流程和所需要用到的系统调用那么,这篇博客我就利用子进程实现多个客户端和服务器端通信代码实现:ser.c#include #include #include #include #include #include #include #include int main(){ int sockfd =

2017-12-11 11:21:16 907

原创 Linux进程间通信——流式套接字

Linux中进程间通信——流式套接字我前面几篇博客中说到的进程间的通信,通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程。通常我们使用socket进行网络编程,这里将会简单地讲述如何使用socket进行简单的网络编程,这一篇我是写的是在同一台计算机上两个进程通信。 一、socket的含义soc

2017-12-06 17:47:07 821

原创 小项目——2048小游戏

很久之前,在学完C语言的时候,老师留下了一个作业,问大家有没有玩过2048,让自己做一个2048的小项目,然后就各种查阅资料,自己做了一个小小的2048小游戏,用W——S——A——D实现上下左右的移动,下面是代码实现部分。代码实现:#include #include #include #include int code[4][4]={0,0,0,0,0,0,0,0,0,0

2017-12-06 17:10:05 1418

原创 小项目——大数据处理

之前上课的时候老师给我们留下一个作业,自己写一个大数据的处理,题目分为三部分1、0-9的数字,统计0-9出现次数最多的数字。可以定义10个计数器2、数组最大可以定义5个计数器,怎么做?3、1000个范围在0-9的数据从文件中读取,将奇数放到一个文件,将偶数放到另一个文件中,怎么做?留下这三个问题,让我们自己思考。下面就是对这三个问题的解答:1、代码实现#

2017-12-06 17:01:53 464

原创 KMP算法(字符串匹配)

KMP算法基本思想:求next数组:代码实现:#include #include #include #include static void GetNext(const char *str,int *next){ int len = strlen(str); next[0] = -1; next[1] = 0;

2017-11-28 12:40:03 254

原创 Linux中进程间通信——消息队列

Linux中进程间通信——消息队列 一、消息队列概念消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最

2017-11-25 10:23:55 326

原创 Linux中进程间通信——共享内存

Linux中进程间通信——共享内存 一、共享内存的定义顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进

2017-11-24 17:00:28 246

原创 Linux中进程间通信——信号量机制

信号量一、信号量的定义引入信号量:为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。 1、信号

2017-11-24 14:04:27 1241

原创 基数排序

基数排序1、基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort),它是通过每个数的各个位数,将要排序的元素分配至某些“桶”中,以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数。2、基本过程第一步假设原来有一串数值如

2017-11-23 11:17:19 266

原创 归并排序

归并排序归并排序(MergeSort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。算法描述:归并操作的工作原理如下:第一步:申请空间,使其大小为两个已经排序序

2017-11-22 09:17:35 329

原创 Linux中进程间通信之管道

进程间通信:管道管道:1、有名管道           2、无名管道为什么要引入管道呢?答:因为普通文件存储在磁盘中,读写效率低               管道文件存储在内存中,读写效率高1、有名管道(1)创建:mkfifo fifo(2)open时需要两个进程(r读、w写)一起操作(3)有名管道可以在任意两个进程间使用(4)管道有读端和写

2017-11-20 09:33:09 301

空空如也

空空如也

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

TA关注的人

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