自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Nestle的专栏

源码之前,了无秘密。

  • 博客(142)
  • 收藏
  • 关注

原创 TinyFrame性能测试

压力测试。用TinyFrame编写Web服务器,Apache Bench(AB)程序作为客户端。客户端发出请求,服务器响应字符串“test”,以此来测量服务器并发量。测试环境:服务器配置:Pentium(R) Dual-Core CPU E6700 @ 3.2GHz 3.2GHz,2G RAM。客户端配置:Intel(R) Core2 Duo CPU T6670 @

2015-03-09 10:21:07 1064

原创 大整数加法

#include #include #include #include #include #include #include #include using namespace std;string AddLongInteger(string addend, string augend){ int sum = 0; int carry = 0; int len1 = a

2014-09-19 20:13:49 1088

原创 sort.cpp

#include #include #include using namespace std;// 冒泡排序void BubbleSort(int a[], int len){ if (a == NULL || len <= 0) return; bool swapped; int last = len - 1; do { swapped = false;

2014-09-19 09:30:44 1209

原创 heap.cpp

#include using namespace std;struct HeapStruct;typedef struct HeapStruct *PriorityQueue;PriorityQueue Initialize(int MaxElements);void Destroy(PriorityQueue H);void MakeEmpty(PriorityQueue H)

2014-09-19 09:29:21 990

原创 dp.cpp

#include #include #include #include using namespace std;// 动态规划求解背包问题void knapsack(int weight[], int value[], int n, int W){ // V[i][j]表示i个物品放入承重为j的背包中 int **V = new int*[n + 1]; for (int

2014-09-19 09:28:08 1022

原创 main.c

#include #include #include #include #include #include #include #include #include #include #include #include #include #include "myqueue.h"#include "myvector.h"#include "mystl.h"#includ

2014-09-19 09:27:28 961

原创 计算字符串距离

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。Levenshtein距离可以通过下面这个状态方程求解:这个式子还是比较好理解的:当字符串a为空,那么两个字符串之间的距离就是另一个字符串b的长度,因为可以通过删除strlen(b)个字符后编程空字符。其它三个方程

2014-09-15 14:50:46 1930

原创 数字哑谜和回文游戏

编程之美4.10的两道题。第一题:找出符合条件的九位数,每位数互不相同(1~9的某个排列),满足高n位能被n整除。例如abcdefghi,高两位ab能被2整除,高三位abc能被3整除,以此类推。一提到排列,很容易就想到递归+回溯,这个方法在面试中使用频率相当高。1~9这九个数字做一次全排列,符合条件的打印,不符合条件的返回。这里可以使用一些剪枝,例如第二高位只能是偶数,第四高位只能是偶数,

2014-09-06 21:34:47 1902

原创 C++模板Queue

《C++ primer》中的一个例子,ganjue

2014-09-05 21:55:15 1295

原创 STL算法实现

写了一点STL算法,模板biancheng

2014-09-03 16:26:26 1021

原创 C++简易list

list不同于vector,每个节点的结构需要自行定义,迭代器属于双向迭代器(不是随即迭代器),也需要自行定义。和通用迭代器一样,list的迭代器需要实现的操作有:++、--、*、->、==、!=。节点的数据结构命名为list_node,迭代器的数据结构命名为list_iterator。list中对迭代器的操作不应该使用算数运算,如+2、-3这样的操作,只应该使用++、--来移动迭代器。STI版本

2014-08-28 14:43:28 1408

原创 C++简易vector

好久没动手写一点C++程序了,以后没事多模仿STL吧,虽然达不到标准的STL的程序,但简单的功能还是要实现的。STL确实博大精深:泛型编程、容器、算法、适配器...有的是内容可以学。下面是根据STL源码,写的一个非常简单的vector,实现了部分接口。其实vector还是相对很简单的容器了,元素按在内存中连续排列,只需要三个指针就能实现很多的接口。还有一个就是内存的分配,这里采用了一个C++提供的

2014-08-25 19:07:35 1433

原创 用并查集求朋友圈数目

题目:假如已知有n个人和m对好友关系,如果两个人是直接或者间接有好友关系,则认为他们属于同一个朋友圈。写程序判断里面有多少朋友圈。例如:n = 5, m = 3  r = {(1,2), (2, 3), (4, 5)}  1 2 3 是一个朋友圈, 4 5 是一个朋友圈。所以输出是2

2014-08-22 10:50:06 2081

转载 为什么C++编译器不能支持对模板的分离式编译

为什么C++编译器不能支持对模板的分离式编译 刘未鹏(pongba)C++的罗浮宫(http://blog.csdn.net/pongba) 首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win3

2014-08-21 15:44:30 1668 1

原创 【设计模式】责任链模式

责任链模式是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。责任链模式的UML图如下:下面是一个用C++描述的责任链模式的例子:#include #include using namespace std

2014-08-11 09:33:32 1276

原创 【设计模式】命令模式

命令模式:将请求封装在对象中,客户不直接调用某个对象的方法,而是使用命令,将命令传递给拥有方法的对象从而让某一方法被调用。UML图如下:下面是用C++描写的命令模式的一个简单例子:#include #include #include using namespace std;// Interfaceclass Command {public: virtual

2014-08-09 10:18:04 1125

原创 【设计模式】桥接模式

桥接模式:把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。如“圆形”、“三角形”归于抽象的“形状”之下,而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。“形状”成为一个继承体系,“画图”成为另一个继承体系,抽象和实现两者的关系为聚合关系。UML图如下:Abstraction:定义抽象的接口,该接口包

2014-08-08 09:02:24 1071

原创 【设计模式】备忘录模式

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可以将该对象恢复到原先保存的状态。下面是一个用C++描述的备忘录模式的基本框架。#include #include using namespace std;// 备忘录class Memento {public: // 保存数据 Memento(const string &st

2014-08-03 21:53:42 1245

原创 【设计模式】适配器模式

适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。UML图如下所示:从上图可以看出,Client需要一个名为methodA的接口,而类Adaptee只拥有一个名为methodB的接口。这时,就需要一个适配器来将接口做一个转换,使Client对methodA的调用能够转接到methodB。这个转接的任务就落在了适配器Adapt

2014-08-02 10:30:53 1144

原创 【设计模式】抽象工厂模式

抽象工厂模式是工厂方法模式的进一步强化。当工厂函数只需要产生一种类型的产品(所有产品都继承自同一抽象基类)时,使用工厂方法模式即可。但是,当用户程序需要创建多种类型的产品,而这些产品又有一定的内在联系,那么就要用到抽象工厂模式了。抽象工厂模式的UML图如下所示:AbstractProductA和AbstractProductB是两种不同类型的抽象产品,每种类中的抽象下面又有两种

2014-07-29 11:05:02 1217

原创 【算法】打靶问题求解

问题描述:打一枪可能的环数为0~10,求打10枪总环数为90的概率。这是一道排列组合问题,可以用循环加递归的方法解决。比如,第一次可以打出0~10环,那么先固定第一次打的环数,然后加上剩下的九次打的环数,就得到总环数。而剩下九次的环数通过递归很容易求得。代码如下:#include using namespace std;int cnt = 0;int target = 90;

2014-07-27 13:44:24 4842

原创 【设计模式】建造者模式

建造者模式:将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同属性的对象。当构造一个对象时,构造的流程是相同的,但每一个步骤对应的具体操作是有差异的。这时,可以将需要进行的初始化作为虚函数固定到一个抽象基类中,这个抽象基类称为抽象建造者类;而具体的实现则由派生类中重写的虚函数定义,这个派生类称为具体建造者类。有了具体的建造步骤,下一步就是要按顺序调用这些步骤,这是由一个称为指

2014-07-24 19:30:55 991

原创 【设计模式】外观模式

外观模式:它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。这其实就是一个分层的思想,将较低层复杂的操作交由较高层同一管理,并向用户程序提供简单易用的接口。下面是一个用C++编写的外观模式的例子。#include #include using namespace std; // 键盘类class Keyboard {public: string Typ

2014-07-23 22:12:58 1066

原创 【设计模式】工厂方法模式

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。例如在简单工厂模式中出现的工厂函数:Operation* FactoryFunction(double left, double right, char op){ switch (op) { case '+': ret

2014-07-22 10:10:13 1068

原创 【设计模式】代理模式

代理模式在所需对象和用户代码之间增加了一层对象,这个对象被称为代理。用户代码只需要直接操作代理对象即可。著名的代理模式的例子就是引用计数指针对象,它使得我们对真实对象的操作都需要经过引用计数指针对象。下面是用C++写的一个运用了代理模式的例子。#include #include using namespace std; // 作为接口的抽象基类class Subject {pu

2014-07-21 18:49:21 958

原创 【设计模式】装饰模式

修饰模式是一种动态地往一个对象中添加新的行为的设计模式。继承是对现有类进行扩充,用来增加基类功能,该扩充动作是在编译期完成;而修饰模式是对一个对象进行扩充,从而达到修饰的目的,该修饰动作是在运行期完成。下面是一个用C++编写的关于描述一个人的示例程序,并使用了装饰模式。#include #include using namespace std; // Componentc

2014-07-19 16:11:40 1349

原创 【设计模式】单例模式

所谓单例模式,就是禁止用户代码实例化多个对象实例,保证单例对象的类只有一个实例存在。通过一个函数接口取用这个唯一实例,就能够控制对该实例的访问。下面是一个用C++编写的模拟单例模式的例子。#include #include using namespace std; class Singleton {public: Singleton() : m_str("Hello wor

2014-07-18 22:01:41 960

原创 【设计模式】模板方法模式

所谓模板方法模式,就是在在抽象基类中定义一套算法框架,框架内的步骤由各个派生类去实现。模板方法模式的好处在于,具有相同代码的操作提升至抽象基类中,派生类中只实现具有差异性的代码,从而最大程度减少了重复代码的存在。要注意的是,这里的模板方法和C++中的模板函数没有任何关系。下面以一个用C++描写的简单示例来说明模板方法模式的机制。#include #include using names

2014-07-15 09:40:16 1192

原创 【Nginx】事件驱动框架处理流程

ngx_event_core_module模块的ngx_event_process_init方法对事件模块做了一些初始化。其中包括将“请求连接”这样一个读事件对应的处理方法(handler)设置为ngx_event_accept函数,并将此事件添加到epoll模块中。当有新连接事件发生时,ngx_event_accept就会被调用。大致流程是这样:worker进程在ngx_worker

2014-07-14 21:11:31 2693 1

原创 【设计模式】策略模式

策略模式:指对象(被称为上下文)有某个行为,但是在不同的场景中,该行为有不同的实现算法。我们可以把算法单独提出来形成一个继承体系,然后让上下文包含某个算法即可。这样,当我们需要添加算法时,只需要继承某个抽象基类然后实现自己的算法即可,不需要修改其它已经实现的算法;当需要修改某个上下文所包含的算法时,也只需要修改上下文内指向算法的指针即可。下面这个例子是使用C++编写的一个带策略模式的计算器:

2014-07-14 09:30:30 1207

原创 【设计模式】简单工厂模式

以面向对象的思想和简单工厂模式,写一个C++计算器程序,代码如下:#include using namespace std;class Operation {public: Operation(double left, double right) { lhs = left; rhs = right; } const doub

2014-07-13 13:05:52 1016

原创 【Nginx】epoll事件驱动模块

Linux 2.4版本的内核之前,Nginx的事件驱动方式是使用的poll、select函数。进程需要等待连接上有事件发生(收到数据)时,需要把所有连接都告诉内核,由内核找出哪些连接上有事件发生。由于需要把大量连接从用户空间拷贝到内核空间,所以开销巨大,因此,使用poll、select事件驱动方式,最大并发数量只能达到几千。Linux 2.6版本之后添加了epoll函数接口,使得最大并发数量可以达

2014-07-12 20:55:47 3136

原创 【操作系统】进程间通信

竞争条件两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。凡涉及到资源的共享时就容易发生这样的事情。解决的办法是设立临界区,让进程互斥地访问共享资源。一个好的避免竞争条件的方案,必须满足4个条件:任何两个进程不能同时处于临界区。不应对CPU的速度和数量做任何假设。临界区外运行的进程不得阻塞其它进程。不得让进程无限期等待进入临界区。忙

2014-07-12 17:24:28 1474

原创 【Nginx】ngx_event_core_module模块

ngx_event_core_module模块属于事件模块,它是其它事件类模块的基础。它主要完成以下任务:创建连接池决定使用哪些事件驱动机制初始化将要使用的事件模块下面分析该模块的代码。ngx_event_core_module的ngx_command_t数组定义如下:/* ngx_event_core_module对7个配置项感兴趣 */static ngx

2014-07-10 20:36:56 1695

原创 【操作系统】线程

进程用于把资源集中到一起,也就是资源管理的单位,而线程则是在CPU上被调度执行的实体。线程概念试图实现的是,共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一任务而共同工作。在有了多进程的情况下,还需要多线程的原因有以下几点:同一进程中的多个线程运行在相同的地址空间并共享所有可用数据,而进程则在互不相同的地址空间中。线程比进程更轻量级,创建和撤销也更快。使得多个不同操作的线程

2014-07-10 18:55:58 1085

原创 【Nginx】核心模块ngx_events_module

核心模块ngx_events_module是一个专门用于管理事件模块的模块。它的实现很简单,下面是该模块的定义:ngx_module_t ngx_events_module = { NGX_MODULE_V1, &ngx_events_module_ctx, /* module context */ ngx_events_comman

2014-07-09 20:47:46 2156

原创 【操作系统】进程

进程是一个正在执行程序的实例,它包括程序计数器、寄存器和变量的当前值。在单CPU的环境下,进程交替运行,CPU在多个进程间快速切换,让人感觉多个进程在同时执行,但同一时刻只有一个进程在运行,这就是所谓的伪并行。创建进程有四种创建进程的方法:系统初始化:操作系统启动时,会创建一些进程,包括前台进程和后台进程(守护进程)。正在运行的进程执行系统调用:一个进程发出系统调用创建

2014-07-09 14:32:52 1248

原创 可重定位目标文件

目标文件分三种格式可重定位目标文件:二进制代码和数据,由各个数据节(section)构成,从地址0开始。可执行目标文件:可运行的二进制代码和数据。共享目标文件:一种特殊类型的可重定位目标文件,动态加载链接。Linux上,目标文件的格式称为可执行和可链接格式(ELF)。gcc -c可以生成可重定位目标文件,然后用readelf -a可以查看文件内容。ELF

2014-07-09 10:43:02 10890 2

原创 关于结构体指针的细节

先来看段程序:gcc -S test.c -O1:

2014-07-09 10:37:39 807

原创 数据传送指令

C代码:汇编代码(部分):

2014-07-09 10:35:48 1000

空空如也

空空如也

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

TA关注的人

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