摘要: 常用的设计模式 设计模式通常是对于某一类的软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的就在于要充分利用已有的软件开发经验。最常用的设计模式根据我的经验我把我经常用到的设计模式在这里做个总结,按照我的经验,它们的排序如下:1)单件模式、2)抽象工厂模式和工厂模式、3)适配器模式、4)装饰模式、5)观察者模式、6)外观模式单例模式 这是用的最多的模式,每一个正式的软件都要用它,全局配置、唯一资源、还有一个就是所有的工厂我都设计为单件模式,因此它的使用量大于工厂模式和抽象工厂模式之和。是用来创建一个需要全局唯一实例的模式。只是需要纠正一点。singleton模式中,... 阅读全文
posted @ 2013-10-30 19:02 xuefenhu 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 优化是一件非常重要的事情。作为一个程序设计者,你肯定希望自己的程序既小又快。DOS时代的许多书中都提到,“某某编译器能够生成非常紧凑的代码”,换言之,编译器会为你把代码尽可能地缩减,如果你能够正确地使用它提供的功能的话。目前,Intel x86体系上流行的C/C++编译器,包括Intel C/C++ Compiler, GNU C/C++ Compiler,以及最新的Microsoft和Borland编译器,都能够提供非常紧凑的代码。正确地使用这些编译器,则可以得到性能足够好的代码。但是,机器目前还不能像人那样做富于创造性的事情。因而,有些时候我们可能会不得不手工来做一些事情。使用汇编语言优化 阅读全文
posted @ 2013-10-30 18:55 xuefenhu 阅读(2243) 评论(0) 推荐(0) 编辑
摘要: 第一个需要讨论的大概就是粘包问题了。因为这个是TCP的个性问题,UDP通信时不存在这个问题的。首先看一下什么叫粘包:客户端采取与服务器的长连接方式建立通信(Open-Write/Read-Write/Read-……-Write/Read-Close)。即建立连接之后进行多次读写操作,最后才关闭。而且不是文件传输,而是数据结构的传输(文件传输发生粘包与没发生粘包都不会影响结果,反正都是字节流的按顺序写入本地文件)。举个例子来说明一下吧:两种数据结构:{give me something} {don't give me anything}则粘包是则是接受到{give me somethin 阅读全文
posted @ 2013-10-30 18:49 xuefenhu 阅读(1011) 评论(0) 推荐(0) 编辑
摘要: ---恢复内容开始---有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,那么我们可以在遍历时使用两个指针,看两个指针是否相等。方法一:使用p、q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。如图,当p从6走到3时,用了6步,此时若q从head出发,则只需两步就到3,因而步数不等,出现矛盾,存在环。方法二:使用p、q两个指针,p每次向前走一步,q每次向前走两步,若在某个时候p == q,则存在环。对于方法一,其实现代码为://if two pointer are equal, but t 阅读全文
posted @ 2013-10-30 18:28 xuefenhu 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是:解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造。还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错。解释二:虚函数的主要意义在于被派生类继承从而产生多态。派生类的构造函数中,编译器会加入构造基类的代码,如果基 阅读全文
posted @ 2013-10-30 17:32 xuefenhu 阅读(979) 评论(0) 推荐(0) 编辑
摘要: a.随机算法rang(Random Algorithm)利用软件或硬件的随机数发生器来确定主存储器中被替换的页面。这中算法最简单,而且容易实现。但是,这种算法完全没有利用主存储器中页面调度情况的历史信息,吗也没有反应程序的局部性,所以命中率较低。b.先进先出调度算法(FIFO)先进先出调度算法根据页面进入内存的时间 先后选择滔滔页面,本算法实现时需要将页面按照进入的时间先后组成一个队列,每次调度队首页面予以淘汰。他的优点是比较容易实现,能够利用主存储器中页面调度情况的历史信息,但是,他没有反映程序的局部性,因为最先调入主存的页面,很可能也是经常要使用的页面。c.最近最少调度算法 LFU先进先出 阅读全文
posted @ 2013-10-30 17:16 xuefenhu 阅读(1771) 评论(0) 推荐(0) 编辑
摘要: ---恢复内容开始---问题描述任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了几种方法来实现这道题,相信很多人可能见过下面的算法,但我相信很少有人见到本文中所有的算法。如果您上头上有更好的算法,或者本文没有提到的算法,请不要吝惜您的代码,分享的时候,也是学习和交流的时候。普通法我总是习惯叫普通法,因为我实在找不到一个合适的名字来描述它,其实就是最简单的方法,有点程序基础的人都能想得到,那就是移位+计数,很简单,不多说了,直接上代码, 阅读全文
posted @ 2013-10-30 16:45 xuefenhu 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 关联容器不同于顺序容器的是:顺序容器底层用数组实现,为线性结构;关联容器在实现中,用到的非线性存储方式; 顺序容器是通过元素在容器中的位置顺序存储和访问元素,而关联容器是通过键(key)存储和读取元素的。C++标准模板库中,关联容器有set、multiset、map、multimap。1.底层原理 我们已经说过,关联容器底层实现是用非线性存储方式,那么这种非线性存储方式是什么呢? 答案是“红黑树”(RB-Tree),红黑树是平衡二叉树的一种,其有以下特点: (1)所有左子树结点的值小于等于根节点的值,右子树节点的值大于根节点的值。 (2)没有一个节点深度过大。 通过上面,就可以... 阅读全文
posted @ 2013-10-30 16:20 xuefenhu 阅读(699) 评论(0) 推荐(1) 编辑
摘要: 目录====================================================第一章 容器第二章 Vector和string第三章 关联容器第四章 迭代器第五章 算法第六章 函数第七章 在程序中使用STL====================================================第1章 容器第1条:慎重选择容器类型。标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一“ 阅读全文
posted @ 2013-10-30 16:10 xuefenhu 阅读(587) 评论(0) 推荐(0) 编辑
摘要: my_container.erase(iter); 其中my_container是STL的某种容器,iter是指向这个容器中某个元素的迭代器。如果不是在for,while循环中,这种方式删除元素没有问题,如果是在for,while中对m_container迭代,删除其中符合条件的所有元素,就可能出现问题。如果是在for,while中对m_container迭代,删除其中符合条件的所有元素,就可能出现问题。 问题是: 在迭代容器的时候删除元素,可能导致迭代器失效(invalidation of iterators),产生未定义行为(undefined behavior);例如,对某个迭... 阅读全文
posted @ 2013-10-30 14:53 xuefenhu 阅读(891) 评论(0) 推荐(0) 编辑
摘要: 概括的说,指针其实就是可变数组的首地址,说是可变数组,是 指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充 分节约宝贵的内存资源。我一向喜欢一维数组,除非万不得已,我一 般是不用二维数组的,多维的则更是很少涉足了。因为一维简单,容 易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更 具有讨论的必要。 闲话少说,这里我就以三个二维数组的比较来展开讨论: (1)、int **Ptr; (2)、int *Ptr[ 5 ]; (3)、int ( *Ptr )[ 5 ]; 以上三例都是整数的二维数组,都可以用形如 Ptr[ 1 ][ 1 ] 的 方式访问其内容;但它们的差... 阅读全文
posted @ 2013-10-30 14:30 xuefenhu 阅读(195) 评论(0) 推荐(0) 编辑