自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Web服务器与Web框架

Web 服务器当我们在浏览器输入URL后,浏览器会先请求DNS服务器,获得请求站点的 IP 地址。然后发送一个HTTP Request(请求)给拥有该 IP 的主机,接着就会接收到服务器给我们的 HTTP Response(响应),浏览器经过渲染后,以一种较好的效果呈现给我们。这个过程中,正是Web服务器在幕后默默做贡献。简单来说,Web服务器是在运行在物理服务器上的一个程序,它永

2017-07-26 19:19:53 432

原创 Thymeleaf

Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎。类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。与其它模板引擎相比,Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。Thymeleaf初探相比于其他的模板引擎,Thymelea

2017-04-22 15:04:13 1496

原创 利用http协议实现一个简单的web服务器

目录文件:htdoc:html文件: hello hello fucang

2016-08-06 10:27:52 5877 1

原创 epoll实现I/O多路复用

epoll是Linux特有的I/O复用函数,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率;并且epoll使用一组函数来完成任务,而不是单个函数,它无须遍历整个被侦听的描述符集,只要遍历那些内核I/O时间异步唤醒而加入ready队列的描述符集合即可。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。1、这个文件描述符使用epoll_create函数

2016-08-02 15:06:01 985

原创 poll实现I/O多路复用

函数原型:函数说明:该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生的时候才。唤醒它参数说明:fds:是一个struct pollfd 结构体类型的数组,用于存放需要检测其状态的socket描述符。每当调用这个函数之后,系统不会清空这个数组,特别是对于socket连接比较多的情况下,在一定程度上可以提高处理的效率;这

2016-08-01 15:31:50 638

原创 select实现I/O多路复用

系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。select:该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它。参数含义:timeout:它告知内核等待所制定描述符中的任何一个就绪可在多长时间,其timeval结构用于指定

2016-07-30 21:33:06 2554

原创 dup/dup2输出重定向

有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接。dup()与dup2()能对输入文件描述符进行重定向。int dup(int oldfd);int dup2(int oldfd, intnewfd);dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者网络连接。并且dup返回的文件描述符总是取系统当前可用

2016-07-28 17:11:20 9724 1

原创 高级I/O函数之socketpair

pipe函数可用于创建一个管道,以实现进程间的通信。但是单个管道只能单向通信,一端用于读,一端用于写。若要实现双向通信,必须创建一对管道。而socketpair函数能够创建双向管道。int socketpair(int domain, int type, int protocol, int fd[2]);socketpair函数的前三个参数的含义与socket系统调用的三个参数完全相同。但

2016-07-28 15:55:06 823

原创 进程间通信之管道

进程间通信的本质:让不同的进程看到相同的资源

2016-07-28 09:46:14 301

原创 UDP——socket通信

基于UDP(UDP是无连接、不可靠的协议)的socket编程,分为客户端和服务器端客户端流程如下:1)创建套接字(socket)2)和服务器进行通信(sendto,recvfrom)3)关闭套接字服务器端的流程如下:1)创建套接字(socket)2)将套接字绑定到一个ip地址和端口上(bind)3)用返回的套接字和客户端进行通信(recvfrom,sendto)

2016-07-28 00:00:28 571

原创 Linux基于TCP/IP简单的客户端、服务器通信程序实例

服务器端代码:/************************************************************************* > File Name: server.c > Author: fucang_zxx > Mail: [email protected] > Created Time: Sun 24 Jul 2016 03:45:21

2016-07-26 10:08:10 23375 1

原创 B树的插入与查找

template bool BTree::Insert(const K& key){ //尚没有结点,直接改_root即可 if (this->_root == NULL) { this->_root = new Node(); this->_root->_keys[0] = key; ++this->_root->_size; return true; } Pair

2016-06-18 19:24:42 421

原创 数组中重复的数字

/**在一个长度为n的数组里的所有数字都在0到n-1的范围内。 *数组中某些数字是重复的,但不知道有几个数字是重复的。*也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 *例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出*是重复的数字2或者3*/// Parameters:// numbers: an array of i

2016-06-04 22:51:58 519

转载 进程控制块PCB结构 task_struct 描述

一、task_struct 结构描述1.进程状态(State)进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据。Linux 中的进程主要有如下状态,如表4.1 所示。(1)可运行状态处于这种状态的进程,要么正在运行、要么正准备运行。正在运行的进程就是当前进程(由current 宏 所指向的进程),而准备运行的进程只要得到CPU

2016-06-03 10:29:25 523

原创 从两个文件(各含50亿个url)中找出共同的url

题目描述:给A,B两个文件,各存放50亿条URL,每条URL占用64个字节,内存限制为4G,找出A,B中相同的URL。分析:我们先来看如果要把这些URL全部加载到内存中,需要多大的空间。1MB = 2^20 = 10^6 = 100W1GB = 2^30 = 10^9 = 10亿50亿 = 5G * 64 Byte = 320G明显是不可能全部加载到内存中的。我们可采用以下方法

2016-06-03 09:53:35 8646

原创 二叉树中最远的两个结点的距离

解法一:求出每个结点作为根结点时的最远距离struct BinTreeNode{ int _data; BinTreeNode* _left; BinTreeNode* _right; BinTreeNode(int data = 0) :_data(data), _left(NULL), _right(NULL) {}};int DepthBin(BinTreeNode*

2016-06-02 23:37:36 701

原创 二叉树中两个节点的最低公共祖先

1、如果此二叉树为二叉搜索树,即树中所有结点的左子树的结点都比父结点小,所有结点的右子树都比父结点大 对于此种情况,我们只需从树的根结点开始和输入的两个结点进行比较。如果当前结点的值比两个结点的值都大,那么最低的共同父结点一定是在当前结点的左子树中,于是下一步遍历当前结点的左子结点;如果当前结点的值比两个结点的值都小,那么最低的共同父结点一定是在当前结点的右子树中,于是下一步遍历当前结点的右子结点。这样在树中从上到下找到第一个在输入结点的值之间的结点,就是最低的公共祖先。2、如果此树是含有父结点的二

2016-05-31 20:10:34 590

转载 Linux下vim的配置

前言:    对于vim的配置,本人也在网上看了很多的方法,碰了很多 壁,所以就知道痛了。所以在下面给大家分享一下我如何配置vim的方法。配置环境  首先给说明下我的环境为CentOS6.5的版本,对于CentOS的配置应该都没有问题,但是是其他系统的话,可以参考,可能因为环境原因可能会发生错误哦。其他  还有一个需要说明的是,我的操作基本上是在文件夹里操作的,虽然能够简单直观的实现vim的配置,

2016-05-29 21:36:36 808

原创 Linux中文件的查找whereis、locate、find

Linux文件的查找:whereis、locate、find相对来说,find查找的速度比较慢;因为whereis与locate是利用数据库来查找数据,所以相对比较快,而且并没有实际查询硬盘,比较节省时间。whereis(寻找特定文件)  whereis [-bmsu] 文件或目录名-b:只找二进制格式的文件-m:只找在说明文件manual路径下的文件-s:只找source源文件-u:查找不在上述

2016-05-29 21:36:33 1361

原创 从1到n整数中1出现的次数

从1到n整数中1出现的次数要计算X出现的次数(650) this.width=650;" width="62" height="22" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/themes/default/images/word.gif") no-repeat center;bord

2016-05-29 21:36:30 499

原创 布隆过滤器

//BloomFilter.h#pragma once#ifndef __BLOOM_FILTER_H__#define __BLOOM_FILTER_H__#include #include "BitMap.hpp"#include "HashFuncer.h"template ,class HashFuncer2 = __HashFuncer2, class HashFun

2016-05-29 21:36:27 240

原创 位图

//BitMap.h#pragma once #ifndef __BITMAP_H__#define __BITMAP_H__#include class BitMap{ class Reference; //声明Reference类public: BitMap(size_t size = 0); void Set(size_t pos, bool val = true);

2016-05-29 21:36:24 247

原创 广义表的相关操作

//Generalized.h#pragma once #ifndef __GENERALIZED_H__#define __GENERALIZED_H__enum Type{ HEAD, VALUE, SUB,};struct GeneralizedNode{ Type _type; GeneralizedNode* _next; union { int _

2016-05-29 21:36:21 344

原创 迷宫问题

#include #include #include #include struct Pos{ int _row; int _col;};void GetMaze(int* &a, int& row, int& col){ std::FILE* fileMaze = fopen("C:\\Users\\朱潇翔\\Desktop\\迷宫.txt", "r"); asser

2016-05-29 21:36:18 265

原创 迷宫问题并求最短路径

#include #include #include #include struct Pos{ int _row; int _col;};bool MinPath(vector>& maze, int row, int col, Pos enrty, stack& minPath){ assert(!maze.empty()); stack path; bool fi

2016-05-29 21:36:15 711

原创 大数据的运算加减乘除

BigData.h:#ifndef __BIG_DATA_H__#define __BIG_DATA_H__#include #include typedef long long INT64;//#define MININT64 -9223372036854775808 // 编译器检查有错////#define MAXINT64 +9223372036854775807 

2016-05-29 21:36:12 1290

原创 稀疏矩阵的压缩存储与转置

稀疏矩阵:矩阵中大多数元素为0的矩阵(本文以行序为主序)稀疏矩阵的三元组表述法:        650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/7E/E1/wKioL1cLsP7QRQIfAAAHqmH0VZY633.png" title="dsg题.png" alt="wKioL1cLsP7QRQIfAAAHqmH0VZY633

2016-05-29 21:36:09 515

原创 利用栈计算算数表达式的值

先将中缀表达式利用栈转换为后缀表达式,然后再利用栈由后缀表达式计算算数表达式的值,具体代码如下:#include using namespace std;#include #include #include enum Type{ OP_NUM, OP_SYMBOL,};enum Operat{ ADD, SUB, MUL, DIV,};struct Cel

2016-05-29 21:36:06 865

原创 智能指针的模拟实现shared_ptr 循环引用 定置删除器

auto_ptr与scoped_ptr的实现见本人的上篇博客。三、shared_ptrshared_ptr的实现原理是通过引用计数来实现,只有当引用计数为1时才释放空间,否则只需将引用计数减1.拷贝和赋值将引用计数加1,具体代码如下:template class SharedPtr{public: SharedPtr(); SharedPtr(T* ptr); SharedPtr(co

2016-05-29 21:36:03 1094

原创 智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr

RAII(Resource Acquisition Is Initialization)资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。智能指针:用自动化或者说智能的指针来实现对动态内存的释放。它是一个类,有类似指针的功能。常见的智能指针:auto_ptr/scoped_ptr/scoped_array

2016-05-29 21:36:01 632

原创 C++虚继承中的对象内存布局

钻石型虚拟继承虚继承是为了解决多继承中的数据冗余而出现的。eg:650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7D/1C/wKioL1bgC5DDO7E6AAAh_Ka19tA339.png" title="xujicheng.png" alt="wKioL1bgC5DDO7E6AAAh_Ka19tA339.png" />#de

2016-05-29 21:35:58 719

原创 单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承??单继承:一个子类只有一个直接父类。多继承:一个子类有两个或多个直接父类。单继承中的虚函数表分析:示例程序:#include using namespace std;typedef void(*FUNC)();class Base{public: virtual void func1() { cout << "Base::func1(

2016-05-29 21:35:55 2603

原创 单链表的操作

数据结构:typedef int DataType;typedef struct Node{ DataType data; struct Node *next;}Node,* LinkList;1、从尾到头打印单链表void TailToFrontPrint(LinkList head)/*从尾到头打印单链表*/{ if (head != NULL) { TailToFron

2016-05-29 21:35:52 259

原创 两个链表的合并

主要功能:实现两个链表的合并基本功能要求:(1)建立两个链表A和B,链表元素个数分别为m和n个。(2)假设元素分别为(x1,x2,…xm),和(y1,y2, …yn)。把它们合并成一个线性表C,使得:当m>=n时,C=x1,y1,x2,y2,…xn,yn,…,xm当n>m时,C=y1,x1,y2,x2,…ym,xm,…,yn输出线性表C:测试数据:1) A表(30,41,15,12,56,80)B

2016-05-29 21:35:49 1216 4

原创 C语言的注释与C++注释的转换

本博客主要考虑以下几种情况,可能有的地方没有考虑到,望读者指出。// 1.一般情况/* int i = 0; */// 2.换行问题/* int i = 0; */int j = 0;/* int i = 0; */int j = 0;// 3.匹配问题/*int i = 0;/*xxxxx*/// 4.多行注释问题/*int i=0;  int j = 0;int k = 0;*/int k

2016-05-29 21:35:46 360

原创 C语言利用结构体实现一个通讯录

实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供以下方法:1. 添加联系人信息2. 删除指定联系人信息3. 查找指定联系人信息4. 修改指定联系人信息5. 显示所有联系人信息6. 以名字排序所有联系人7. 清空所有联系人student.h:#ifndef __CRT#define _CRT_SECURE_NO_WARNINGS 1#end

2016-05-29 21:35:43 2166

原创 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作

#include #include #define MAXSIZE 50typedef struct Node{ char data; struct Node *LChild; struct Node *RChild;}BiTNode,*BiTree;typedef struct{ BiTree element[MAXSIZE]; int front; int re

2016-05-29 21:35:41 1041

原创 快速排序函数的比较函数

快速排序函数函数原型:void qsort(void *base, size_t num, size_t width, int(*compare)(const void *num1, const void *num2));参数:1、待排序的数组的首地址      2、数组中待排序元素的个数      3、各元素占用空间的大小      4、指向比较函数的指针,用于确定排序的顺序compare函数的

2016-05-29 21:35:38 956 1

原创 冒泡排序函数,可以给任意类型的数据排序,比如整形数组,字符数组,字符串数组等

冒泡排序函数函数原型:void bubble(void *base, size_t num, size_t width, int(*compare)(const void *num1, const void *num2));功能:使用冒泡法排序对任意类型的数据排序参数:1、待排序的数组的首地址      2、数组中待排序元素的个数      3、各元素占用空间的大小      4、指向比较函数的指

2016-05-29 21:35:35 742

原创 一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数

先看一个简单的,一组数中,只有一个数只出现了奇次,其他所有数都是成对出现的,找出出现奇次数的数。对于这个题,我们只需对所有数及逆行异或即可。理论公式:a⊕b=b⊕aa⊕0=aa⊕b⊕b=aa⊕(b⊕c)=(a⊕b)⊕c代码:#include #include int main(){ int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; int ret = 0; i

2016-05-29 21:35:32 2545 1

空空如也

空空如也

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

TA关注的人

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