自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Double Dispatch and visitor patten-双重分发与访问者模式

如果你研究过visitor pattern,很可能会涉及到一个Double Dispatch的概念,这里我们就叫它双重分发吧,双重分发是一种思想,而访问者模式则是一种具体实现。本文会尽量以一种通俗的语言来描述这些概念(本文以C++为例)。首先我们梳理一下比较熟悉的两个基本概念:静态类型(static type)与动态类型(dynamic type)。静态类型是在编译期需要确定并进行检查的,检查...

2019-11-12 12:54:13 566

原创 linux系统函数pthread_atfork

函数的原型是这样的:include <pthread.h>int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));说明:该函数用于注册三个回调函数,后面用户调用fork函数时,才真正执行。调用fork时,内部创建子进程前在父进程中会调用prepare,内部创建子...

2019-10-18 20:09:32 254

原创 topK算法

一个不错的topK的示例代码!class Solution {public: void adjust(vector<int> &arr, int index, int len) { int left = 2 * index + 1; int right = 2 * index + 2; int max_index ...

2019-09-11 14:54:03 189

原创 C++控制反转(IOC)

项目开发中,会经常遇到这样的问题:最开始,需求简单,所有用户统一使用程序proxy对外提供的一种功能。但随着用户需求增多,程序proxy想要满足不同用户需求,就要连接后端多种不同的服务。此时,proxy典型的一种架构就是用一个基类对前端提供一个统一的接口,再从这个基类派生出不同的派生类,连接后端不同的服务。然后将某些用户的一类需求和某个派生类的服务关联起来(可以使用配置文件,记录用户id和类名ke...

2019-06-03 20:47:31 2203

原创 使用C++11实现类似C#的属性概念设计

原文地址在这:http://www.cnblogs.com/feng-sc/p/5742689.html实现挺有意思的,看懂了代码也可以加深对C++知识的理解,是不错的小技巧,记录下来。#include#define property_setter(variableType) [&](variableType value)#define property_getter(variable

2016-08-15 16:22:42 1327

原创 用堆实现优先级队列

用堆实现优先级队列

2016-06-14 14:34:50 457 1

原创 设计模式笔记-Interpreter解释器模式

这个模式讲真我理解不是很清楚,它的应用也是非常非常少,因为没用过,也不清楚它的应用场景。为了完结这一系列文章,还是把它写一写!解释器嘛,对一个文法或表达式进行解释,好比编译系统对编程语言的解释,计算系统对计算模型的解释。举个列子,公司要对大数据进行处理,根据不同的需求,会建立很多不同的模型,a+b-c; a+b+c-e; a-b 等等。有人可能会想,我直接写计算表达式呗,有一个模型就写一个表达

2016-06-07 19:27:50 377

原创 设计模式笔记-Iterator迭代器模式

迭代器我们都用过,不管是C++,PHP等等,它们是标准库给我们实现好的,通过它能访问像vector, list这样的容器。如果我们自己有一个对象集合,你也想提供这样的接口,那就要自己实现。迭代器模式:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 , 而又不需暴露该对象的内部结构。如果不用该模式,你可以在聚合对象中添加遍历的函数,这增加了聚合对象

2016-06-07 13:07:57 384

原创 设计模式笔记-Chain of Responsibility职责链模式

这个模式我觉得是很简单的--单例模式还有很多陷阱呢,职责链模式在你了解了使用场景以及它的实现之后,一切都是顺理成章的事。请假--大家都举这个例子,3天以内组长批,3-7天部门经理批,7天以上总经理批。请假的人只管把假条交上就行了,批假的处理不用管,这就实现了请求和处理的解耦(这话怎么好多模式都这么说)。在实现上就是,要在处理类中组合一个上一级的对象指针就行了,自己处理不了交给它处理。该模式的好

2016-06-06 18:29:19 388

原创 设计模式笔记-Visitor访问者模式

访问者模式

2016-06-05 16:41:53 480

原创 设计模式笔记-Command命令模式

命令模式

2016-06-03 20:15:53 422

原创 设计模式笔记-Mediator

中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。这个定义说白了,两个对象要交互(或者说通信,随便怎么说吧),直接组合对方的类指针的话耦合性太高。中间用一个类包装一下,这样,相互通信的类里面直接通过这个包装类操作就行了!说实在的,我没有实际用过这个模式,也没体会过它的好处,我就通过总结网上别人的帖子来写一下。

2016-06-02 16:32:42 320

原创 设计模式笔记-Memento模式

备忘录模式

2016-06-01 17:18:57 314

原创 设计模式笔记-Observer模式

观察者模式,项目中用的很多,因为它的逻辑比较清晰,实现方法比较统一,所以也挺好理解的!观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。这句话中对象间就是某个被观察的东西Subject和观察者Observer,一个Subject可以有一个或多个Observer(下图只画了一个);状态改变,也就是Subject的状态改变时(通过

2016-06-01 11:29:11 401

原创 设计模式笔记-State模式

状态模式:事物在不同状态下会有不同表现(动作),经过不同动作后,又会转移到下一个不同的状态。这种问题可以用Switch/Case(if-else)搞定, 但如果case语句很多,就很麻烦,这种实现也没有将逻辑和动作分离,后期维护得不到保证!加case语句要修改原来代码,违反了“对扩展开放,对修改关闭”的原则!State 模式将每一个case分支都封装到独立的类中!状态模式的具体实现类中有一

2016-05-31 21:07:45 363

原创 设计模式笔记-Strategy策略模式

策略模式,它解决的问题与前一篇Template模式类似,都是为了给逻辑(算法)具体实现和抽象接口之间的解耦。策略模式将将接口的实现放在被组合对象中,将抽象接口放在组合类中。策略模式使得算法可以在不影响到客户端的情况下进行替换。以缓冲区替换算法为例,UML图如下:有几点:1. 在Cache类中组合了一个ReplaceAlgorithm *类型的指针。这时候在Client中使用时,需要

2016-05-30 20:35:59 314

原创 设计模式笔记-Template模式

模板模式,逻辑很清晰,容易实现,用的也多!需求情景就是:对一个业务逻辑/算法实现,在不同对象中有不同的细节实现,但是逻辑的框架是相同的!就是说它们的操作步骤/接口是相同的,以继承的方式实现!看下图UML就明白了:到公司应聘,公司给每人发一个简历表,让大家填,而不是直接用每个人自己带的简历!有几点:1. 将逻辑框架放在抽象基类中,并定义好细节的接口,子类中实现细节! 这和Strategy

2016-05-30 16:30:26 307

原创 设计模式笔记-Proxy模式

代理模式,顾名思义,代替某个东西去完成某事!GOF书上分为四类:远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象延迟的真正需要时才创建。比如:如果一个很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在

2016-05-30 15:03:24 297

原创 设计模式笔记-Facade外观模式

外观模式

2016-05-30 11:11:43 334

原创 设计模式笔记-Flywight模式

享元模式。Flywight是轻量级的意思,翻译成享元算是意译吧!其定义为:运用共享技术有效地支持大量细粒度的对象!举个例子,文档编辑器程序中如果一个字符对应一个对象,那一篇文档所有字符对象将非常的耗费内存。实际上,所有字符的个数是有限的,只是有些地方字符的一些属性:颜色、大小等不太一样!因此,可以将有限的字符对象构建后共享出来,这些是他们的内部状态,存储在flywight中;其它如颜色、大小等属性

2016-05-29 22:36:06 710

原创 设计模式笔记-Composite模式

组合模式,UML图和装饰模式非常像,但二者代表的意义是不同的. 装饰主要用来在已有的类中添加功能; 组合模式主要是:在开发中会遇到一些树形组织结构的现实对象,比如:电脑主板,包括:CPU,芯片组,I/O设备等;其中的芯片组包括:声卡芯片,显卡芯片;I/O设备包括:USB I/O,  VGA I/O等。这里的cpu, 声卡芯片等可以看作是叶节点。芯片组、I/O设备可看作是组合元件。再比如,一个大公司

2016-05-29 19:56:28 290

原创 设计模式笔记-Decorator模式

装饰模式,通过组合而不是继承的方式,动态地给类增加功能的方法!这句话不好理解,边看下图例子边说话吧:Streams是大多数I / O设备的基础抽象结构,它提供了将对象转换成为字节或字符流的操作接口,使我们可以将一个对象转变成一个文件或内存中的字符串。一个简单直接的方法是定义一个抽象的Stream类,它有两个子类MemoryStream与FileStream。但假定我们还希望能够做下面一些事情(添加

2016-05-28 16:01:57 384

原创 设计模式笔记-Adapter模式

适配器模式,顾名思义,适配两个不同的东西!实事上,它的用处更多的确实是用在:当前项目开发,用到第三方的库,我们自己的项目接口已经设计好,但它与第三方库的接口不一致,为了这些接口不兼容的类能一起工作,就需要用到Adapter模式将第三方库的接口转化为用户希望的接口形式!说通俗一点:我们的类A

2016-05-27 22:24:42 350

原创 设计模式笔记-Bridge模式

桥接模式的原理是:将抽象部分与实现部分分离,使他们可以独立地变化! 这里的实现不是指具体子类对抽象基类中的虚函数的实现,而是指用户需求变化的具体实现操作!比如有多种型号的计算机和多种操作系统,假设他们的装机方式各不相同,其UML图(来自网络)如下:抽象与实现之间不用继承,而是通过组合的方式实现的!如果用继承,你想,3种电脑*3种OS,得有9个继承子类来实现装系统的方法!像这种有笛卡尔积

2016-05-27 15:11:58 251

原创 设计模式笔记-Prototype模式

Prototype模式-原形模式,就是自我复制,一个clone函数的事。先把UML图贴出来。不同的语言实现可能不同,在C++中,一般clone的实现是:Prototype* ConcretPrototype::Clone() const{ return new ConcretPrototype(*this);}这一句很简单,但是它依赖于复制构造函数中对深拷贝和浅拷贝的完

2016-05-27 10:42:11 348

原创 设计模式笔记-单例模式

单例模式在系统开发时很常见,一个系统中可能会有多个单例模式的运用!它比全局变量的好处?1.能控制生成时间,保证初始化顺序?2. 容易保证线程安全(全局变量需要多线程client单独控制并发,单例在类实现中已经做到,无需client再处理)?3. 减少函数模块之间的耦合,减少命名冲突,便于管理? 可能这些都是好处吧!我的项目开发过程中,经常会把单例模式和简单工厂模式结合起来使用!比如:cla

2016-05-26 17:09:22 388

原创 设计模式笔记-xx工厂模式

一, 简单工厂模式主要特点是需要在工厂类中用多个case分支做判断,根据传递进来的参数创造相应的产品。当增加新的产品时,当然也得修改工厂类,就是在其中添加case分支。在平时开发的小项目里,由于对象类型单一、个数基本确定,所以基本采用这种方法来实现!并且它会和单例模式放在一起,比如我项目中就采用下面的方法:class OPTSOLVER_API CGasElementFactory{

2016-05-26 11:30:17 309

原创 设计模式笔记-builder 模式

首先贴出一篇不错的关于builder模式的博文:点击打开链接 文中举的第一个反例的博文在这里:点击打开链接修改后的UML图如下:整个图反映了作者的思想,重点就在Director中的CreateEQP中,也就是说把由Builder继承来生成子类的方法,改在CreateEQP中进行。我个人特别不理解的是:builder子类相当于一个创建某类东西的模板,按作者的意思,不能因为某个特点不同

2016-05-24 18:43:42 332

原创 树形DP解 POJ3342-Party at Hali-Bula

参考:http://blog.csdn.net/sdjzping/article/details/13131611第一次接触树形DP的题目,这种题解题思路还挺固定的,深度优先搜索+动态规划。这点比较好理解,dp[i][j]保存节点i在状态j下的最多参加宴会人数,状态j其实就两种状态,也就是只有2种取值,0代表不参加,1代表参加。首先赋初值,dp[i][0]=0,就结点i一人来说,不参加,人

2016-02-11 12:21:57 432

原创 状态压缩DP解POJ3254-Corn Fields

本文内容转自:http://blog.csdn.net/harrypoirot/article/details/23163485?utm_source=tuicool&utm_medium=referral对状态压缩DP有了初步的认识,自己做个记录,方便以后回忆时查看。有些自己当时不太好理解的地方加上注释。想从0开始看的童鞋先看上面的链接。先贴代码,这是poj上的一道题的题解:http:/

2016-02-03 12:32:03 432

原创 后缀数组的应用

想要了解后缀数组,可以在网上搜索罗同学的论文,这里的代码更容易理解些。构造后缀数组并求这些数组的最长公共前缀是基本操作,就用途来说没有意义,一般都是利用这个结果进行其它操作,它在很多OJ题或面试题里的字符串操作中会用到,下面是一些例子:1. 求一个字符串所有不同的子串个数(子串意味着是连续的)。比如“abaaba”,它的字串包括:a, b, aa, ab, ba, aba, baa,  aab

2016-01-18 12:32:59 690

原创 manacher算法求最长回文子串(Longest Palindromic Substring)

经典的快速求最长回文子串的算法是manacher算法(俗称“马拉车”),时间复杂度o(n),感觉能在o(n)时间内解决问题的算法都是神啊。不过这个算法用处比较单一,思想也不具有普遍性。回文这个东西,本来用的就不多,看看理解一下就好。推两篇博文:博文一,博文二。一是英文,二是中文,看完之后就应该能理解的差不多了,其中博文二在博文一的参考文献里,外国人居然也看中文博客,惊奇!下面自己对一些比较

2016-01-14 12:17:25 412

原创 倍增算法的另一种解法

网上一搜索倍增算法,基本就是罗穗骞同学的介绍。这同学高中时期就研究这么深入,让我这研究生毕业的人汗颜,慢慢爬坑吧。不过说实在的,这代码写的实在看着有点费劲。网上又有人整理了下。不过我看的还是一头雾水,希望有明白人能说明一下。要想了解倍增算法,最好先对RMQ和基数排序算法有一定了解,还要了解一下后缀数组。下面把代码贴过来。例子图如下:但是代码的实现和这个图出入很大,不好理解。

2016-01-08 15:28:40 4153

原创 RMQ算法

RMQ(Range Max/Min Query)算法,即区间最大/最小值查询算法。给定一个长度为n的数串A,RMQ(A,i,j)即是查找A中第i到第j个数中间最大/最小的数(1设A是要求区间最值的数串,F[i, j]表示从第i个数起连续2^j个数中的最大值。注:同其它动态规划状态数组类似,下标都是从1开始,下标0为初始化值,初始化值则根据问题不同,取值不同。例如:A数列为:3

2015-12-31 16:40:32 1707

原创 最长公共子序列(LCS)和最长公共子串(LCS)

最长公共子序列(Longest Common Subsequence)和最长公共子串( Longest Common Substring),虽然它们都简称为LCS,但含义不同,前者是可以不连续的,而后者要求是一个连续的字符串。比如:X="bdcaba";Y="abcbdab"X和Y的Longest Common Sequence为,长度为4 X和Y的Longest Comm

2015-12-23 19:13:54 652

原创 linux不知道的一些事儿

关于PRId64Linux里,int64_t(64位整数)经常被用来表示时间戳,因为int32_t只能表示到格林威治时间2038年01月19日03时14分07秒,而64位整数表示的时间要长很多。但int64_t类型在32位系统中是long long int,在64位系统中是long int,这就带来了问题,在打印int64_t的格式化方法时:printf("%ld", value)

2015-11-22 01:18:11 469

原创 C++时间类型详解

Unix时间戳(Unix timestamp),定义为从格林威治时间,1970年01月01日00时00分00秒起至现在的总秒数。目前相当一部分操作系统使用32位二进制数字表示时间。此类系统的Unix时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制:01111111 11111111 11111111 11111111)。其后一秒,二进制数字会变为100000

2015-11-21 22:17:10 577

原创 C++线程局部存储(TLS)

基本类型(如(unsigned) int,long, char,指针,c类型的结构体等 )可以采用用 __thread修饰符来定义线程局部变量.示例如下:__thread int i;extern __thread struct state s;static __thread char *p;像 string 等类是不能直接用 __thread 修符的,只能用其指针类型的.即:

2015-10-16 12:32:42 4351 1

原创 由is_base_of看C++中的SFINAE

SFINAE, 全称为"匹配失败并不是一种错误(Substitution Failure Is Not An Error). 这个源码看着还是有点费劲的!先举个例子。templatestruct if_ { static const int value = 1; };templatestruct if_ { static const int value

2015-09-21 15:41:54 3666

原创 动态规划法解0-1背包问题

背包问题0-1背包: 有N件物品和一个重量为M的背包。完全背包: 有N种物品和一个重量为M的背包,每种物品都有无限件可用。多重背包: 有N种物品和一个重量为M的背包。

2014-12-11 09:48:31 763

空空如也

空空如也

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

TA关注的人

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