- 博客(38)
- 收藏
- 关注
原创 之前几个月做的事情
自从csdn blog改版,几次都发布了文章, 所以也就很少上了,今天终于再可以上来了. 简要总结一下之前一段时间读的东西。版本控制之道 : 虽然用cvs良久,但是一直还不怎么会用,混混沌沌。 看了这个小册子之后, 恍然大悟, cvs确实可以减少很多时间。 强烈推荐!Unix编程艺术: raymond作为资深黑客,的确说的上对unix极其精通了, 虽然其在这本书中表现的过为狂热,不过对于很少了解
2007-05-16 17:38:00
1594
原创 算法导论第十三章
红黑树是一种较为平衡的搜索树, 当然满足所有搜索树应该具有的特点.红黑树的几个性质:1. 节点或红或黑 2. 根是黑的 3. 叶是黑的(叶均为nil, 是所谓的外节点, 而有值的节点均为内节点)4. 如果一个节点是红的,则它的子女均为黑的 5. 对于任何节点, 从该节点到该节点的子孙叶节点的所有路径上所包含的黑节点数量相同。从定义可以得到定理:一颗n个内节点的红黑树高度最多2lg(
2007-05-16 17:15:00
2017
1
原创 算法导论第十二章
二叉查找树: 定义为任何父亲节点数据的大小都大于左子女, 小于右子女。 这样, 中序遍历树即可拿到树的一个排序。插入节点的过程就是建树的过程。 为了使树的结构能更趋于平衡, 在插入前, 将序列随机化是一个非常不错的办法。 主要实现了insert, delete, maxmum, minimum, next, previous方法, 以下是我的实现. 用节点作树的存储结构:其中TreeNode是节点
2007-02-08 15:02:00
1850
原创 写二叉树时候的一个感悟
今天看到搜索2叉树一章, 后面还有红黑树等等, 于是想, 所有树的遍历方式都雷同, 干脆写一个叫做BinaryTree的抽象类, 并实现基本的二叉树行为, 比如遍历等。 针对Tree写traverse, insert, delete等虚函数, 然后其他树派生,可以替换不同的Tree来实现。 想到就做, 写到traverse的实现, 应该是这样子的:templateclass BinaryTree{
2007-02-08 15:00:00
2363
1
原创 算法导论十一章
散列表: 本章介绍了散列表的各种问题。散列函数:除法散列,乘法散列,全域散列。 其中除法散列是简单的mod. 乘法散列为h(k) = m(kA mod 1). 即关键字k乘常数A, 然后取小数部分, 乘以m. 全域散列是一组散列函数,这些函数都可以将关键字域U映射到相同的集合中, 同时对k, l 属于U. 满足h(k) = h(l)的散列函数的个数最多是: 散列函数的数目/集合的大小. 散列
2007-02-08 14:59:00
2280
原创 Modern c++ design 总结
总结: 今天终于看完了Modern C++ Design. 从第一天看时候的激动不已, 到如今看完之后, 长出一口气。 这本书的确是想搞懂C++的一本必读之物。 模板,模板特化,模板元编程是贯穿整本书的技术灵魂, 多继承是实现policy的手段, 并利用编译器编程实现了泛化的模式。 第一篇:技术policy的设计概念激动人心, 确实是一种全新的策略, 类似于多态,strategy模式, 却
2007-02-08 14:57:00
3352
1
原创 2007.1月总结
模式与重构: java写的一本书, 最近一段时间都不太想看模式的东西了, 毕竟看过不少,而且如果没有实践, 模式也就是模式而已,滥用的机会更多。 不过对于重构, 兴趣却增大了。 这本书的喧头就是模式+重构, 为了这种思想读了一遍, 不过并没有特别的精读。 从这本书中,还是感悟到了一点它的思想, 通过重构代码来精进代码, 根据实践来发现模式。 这种思想不错。重阅c++, 距第一次看过c++ p
2007-02-08 14:57:00
1741
原创 modern c++ design 第十一章
本章介绍了经常遇到的双分派的一种泛型解决方案。 C++在语法上实现了单分派, 即虚函数, 通过动态机制选择相应的函数。 双分派是形如fun(Object1* a, Object2* b). 根据a和b的实际类型动态自动分派一个处理函数。 最容易想到的方案,蛮干法: 写一大堆重载函数. 不过这种方法会有很强的依赖性。 也提供了一种泛化蛮干法的实现: Executor是实现了各种具体实现的类, 其中
2007-01-30 12:07:00
2224
原创 Modern c++ design 第十章
Visitor 一个鸡肋型的模式, 属于最有争议的模式, 设计模式的设计者都将visitor排在最不推荐的模式之一。 在某些领域, visitor可以提高灵活性, 但是却又牺牲了一些别的。 本章作者介绍了visitor的特性,并用泛型实现了一个visitor.作者的角度看来, visitor可以轻松的添加虚函数, 但是很难添加类。 使用visitor的目的是, 当不需要添加类, 却很需要添加虚函数
2007-01-24 23:44:00
1963
原创 Modern c++ design 第九章
Abstract Factory 抽象工厂: 抽象工厂的主要目的就是生成一系列相关对象, 可以在运行期根据情况生成不同组的一系列对象。本章主要目的是生成一个泛化的Abstract Factory. 工具是typelist, GenScatterHierarachy, GenLinearHierarachy. 这几个类结构都可以在第三章找到详细论述。GenScatterHierarachy用来生成一
2007-01-23 22:31:00
1934
原创 Modern c++ design 第8章
Object Factories. 抽象工厂, 基于多态的实现, 面向接口的设计, 为了避免在实现中对具体的派生类的引用。通常使用Object Factories来生成具体对象。 通常的最简单实现方法是, 给Factory传入一个identifyId, 根据id, factory生成一个具体的对象, 返回基类接口。 但是这样的做法, 工厂还是对具体类有依赖, 而且每次加一个新的对象
2007-01-23 12:15:00
2171
原创 做一个好的程序员
前两天买了程序员修炼之道, 是作为近十年最有影响的十本计算机书买的。 拿起来一看, 却再也放不下去, 周末两天看完后, 舒了一口气, 果然是一本对程序员大有影响之书。 看书之前,以为也就是如“代码大全”类似的软件工程方面的书,可能会讲程序员在开发项目中,应当如何如何才能做好,也无非是方法论。 看后才知, 差别却是很大,此书的目的是不同的, 面向的是程序员, 而非其它。 书中各项内容都
2007-01-22 10:54:00
2246
原创 Modern c++ design 第七章
Smart Points:一个C++ classs, 在语法和某些语义上模拟一般指针,以提供更多功能, 比如std::auto_ptr. 本章介绍的内容就是介绍smart points的各种问题,以及如何写一个smart points. 实现smart points, 必须要实现operator*, operator->这两个操作符, 以及value语义, 即拷贝赋值和构造。 首先考虑smart
2007-01-20 20:56:00
1882
原创 Modern C++ design 第六章
Singleton实作技术 Singleton, 是一种描述非常简单, 应用和实现却很复杂的奇异模式, 有大量文献对Singleton做过讨论, “设计与模式”一书也用了很大的笔墨描述了Singleton的滥用所引发的问题, 并介绍了一些对Singleton的看法,以及去掉已存在的不合理Singleton的解决方法。 当然, 本书只是讨论Singleton的实现问题, 并不涉及模式的应用。
2007-01-19 14:01:00
1983
原创 算法导论: 第九章
这章介绍了中位数和顺序统计学中位数即一个序列中最中间的数字, 在快速排序中非常有意义, 在其它的一些应用中也很有效, 因为可以2分序列, 这样会有更好的效率。 这章主要介绍如何不排序来找到序列的顺序, 由于不需要排序, 可以减少很多比较的操作, 最终可以获得一些线性的算法, 得到排名第i的数字。 算法的基础是首先利用快速排序中的partition, 将序列2分, 然后其中不包括i的序列就
2007-01-18 12:04:00
2003
原创 Modern C++ design 第五章
本章介绍泛化仿函数,是一种可以将C++所允许的任何处理请求封装起来, 并可以获得“型别安全性质”的高级对象。 特性:可封装任何处理请求,比如函数指针,成员函数指针,仿函数, 其它泛化仿函数,并连同参数。具备类型安全, 不会讲错误的类型匹配到错误的函数。具备值语义, 即支持拷贝,赋值, 传值。泛化仿函数具有的特性是封装处理请求,和设计模式中的Command模式意义相近,都可以延迟执行。 泛化仿函
2007-01-17 14:58:00
2038
原创 算法导论: 第八章 线性时间排序
本章介绍了决策树, 根据决策树证明了交换排序的下界。 介绍了计数排序, 基数排序和桶排序,这三个排序的特点为: 线性排序, 需要大量额外存储空间, 有特定的条件要求。 故而在一些特殊环境下可以提高排序的效率, 不过不适合用于通用的算法。
2007-01-16 12:52:00
1991
原创 将项目从VC6转到VC Express
原来项目是用VC6的, 但是用着用着发现VC6的编译器和标准库差的很远, 于是诺到VC Express, 别的都还顺利, 就是cppunit突然链接不上dll, 试了一阵子没有成功, 就build成静态链接库, 搞定。
2007-01-16 10:45:00
1667
原创 算法导论:第七章 快速排序
这章介绍了应用广泛的快速排序算法。 快速排序的最坏性能是O(n*n), 但是平均性能 却不错,而且系数较小。 故而被广泛使用。 因为快速排序本身很简单, 所以本章的重点在于算法性能的分析。 算法性能并不是本次算法学习的重心, 所以只是读了证明, 习题中的算法性能分析部分只是略略看过, 以后各章的性能分析恐怕也不能花太多功夫, 毕竟不是在求学阶段, 太过基础的东西,很难静下心来慢慢看过了, 实用意
2007-01-15 17:08:00
1749
原创 算法导论: 第六章 堆排序算法
堆排序, 一种基础算法, 实现了一个二叉树, 根节点的值大于子节点, 就是最大堆。 小于子节点, 就是最小堆。 堆排序的性能是O(nlg(n)). 插入, 取值都是O(lg(n)). 优先级队列经常用堆排序来实现。 以下是我的实现:inline int heapLeft(int i) {return 2 * i + 1;}inline int heapRight(int i) {
2007-01-15 11:16:00
816
原创 Modern C++ design第四章
本章介绍了一个小型对象分配器. 因为过多的小型对象( 例如仿函数, 智能指针)的分配释放, 会导致内存碎片, 内存耗费过多, 分配速度过慢等问题。 故而在需要大量小型对象的系统中, 一个分配器是非常必要的。本章介绍的这个分配策略共由四层组成, 第一层是Chunk , 一块大内存。 一个Chunk可以分配最多255个小型对象。 Chunk内的可用内存, 通过一个链表连接起来。 第二层是F
2007-01-15 10:26:00
679
原创 Modern C++ design 第三章 (下)
产生了typelist之后, 该轮到typelist的一些应用了, 那就是用typelist自动产生class。 typelist就是产生class的基础。 GenScatterHierarchy : 产生散乱的继承体系, 最后其实是一个多重继承。 定义: template class Unit> class GenScatterHierarchy;生成的继承体系的基类
2007-01-12 11:41:00
805
原创 Modern C++ design 第三章 (上)
从哪里来看,这章都是这整本书的重中之重: 介绍了模板元编程, 编译期间编程的利器。 同时实现了typelist这个整本书为之基石的类。 虽说模板元编程晦涩难懂, 但是作者以渐进的方式, typelist为例, 将之阐述的条例清楚, 只要有一定的template基础, 还是能够看明白的了。 typelist的目的: 是为了用同样的代码来泛型处理不同类型, 只需要提供一系列的类型,那么就会自动为
2007-01-12 11:13:00
981
原创 算法导论: 附录A,B, C
相对于刚看完的两章,这两章算是看的相当舒服了。附录A: 求和 主要讲关于求和的一些公式和概念, 当年微积分学的还不错, 轻松看完。附录B: 集合等离散数据结构 介绍了集合、图、树的各种概念,以及少量的证明, 主要是些结构的概念。 以前看过不少算法书, 基本也都知道。 不过最后的几个习题确是不太简单, 属于离散数学的范畴, 也没有啥例子。 以前没有系统学过离散, 证明起来有点头疼,
2007-01-11 12:54:00
3095
原创 算法导论: 第五章
概率分析和随机算法本章介绍了指示器随机变量的分析方法, 以及对随机方法作了简要介绍, 这些都是以后的算法分析的基础。最后一节更深入介绍了概率分析和指示器随机变量。练习5.4-5, 5.4-6, 5.4-7都没有精力看下去了。 留待以后再考虑吧, 毕竟是数学问题,概率放下挺久了, 考虑起来有点吃力。
2007-01-10 15:19:00
956
原创 Modern c++ design 第二章:技术
本章介绍许多在本书中要用到的高级技术。1. 编译器Assertion. 不同于以往的运行期的Assert. 这个Assertion是用来判断那些可以在编译器确定的关系, 比如类型转换, sizeof等。 利用一个模版类, 在模版参数为true时,给出实现,而false时,不给出实现。 那么当STATIC_CHECK的参数为false, 就不能生成相应的函数。(因为没有实现), 最后还作了
2007-01-10 10:35:00
1209
原创 算法导论:前四章
第一章:算法介绍,简略而过第二章:算法入门,介绍了算法的基本, 很简单。 我实现了其中的算法。第三章:函数的增长, 详细描述了各种渐进符号, 以及用渐进符号对算法进行分析, 虽然以前对这些都很熟悉,不过这次在做练习的时候,发现还是很不熟悉, 前前后后翻了不少次定义, 不过对于这几个渐进符号的理解和对于算法的性能有了更好的理解(非常有用)。第四章:递归式 主要描述了如何分析递归式的性能,
2007-01-09 14:35:00
700
原创 算法导论: 计划
之前, 看过五花八门的四五本算法书, 动手很少。 这次下定决心,以这本富盛名的算法书为内容, 争取仔细推敲内中所有的定理证明, 完成其中所述算法, 并可以完成所有练习。 放下浮躁的心情, 计划3-6个月完成。
2007-01-09 14:23:00
593
原创 基于Policy的Class设计, 读后感
多重继承欠缺技术, 模板有丰富的技术. 多重继承缺乏型别姓习, 模板中却大量存在. 模板的特化无法扩张, 多重继承却很容易扩张. 所以, 用这两种技术组合起来, 可以产生非常具弹性的设备.policy: 是用来定义一个class或class template的接口, 该接口由下列之一或全部组成:内隐型别定义, 成员函数和成员变量.policy是一种策略, policy需要定义一个接口, 这个接口是
2007-01-08 19:57:00
1499
原创 stl_iterator.h 二
六. istream_iteratoristream_iterator的目的是从输入流中读取数据, 迭代器类型:input_iterator_tag. 接收一个输入流为参数, istream_iterator保存这个输入流,并且每次operator++的时候从输入流中读取一个数据, operator*取到所读取数据的值, operator->是取得所读取数据的引用。 从源码来看,一个输入流传
2007-01-08 18:03:00
1173
原创 stl_iterator.h 一
一. back_insert_iterator功能:用于在后部插入元素, 迭代器类型: output_iterator_tag. 实现:template class back_insert_iterator {protected: _Container* container;public: typedef _Container container_type; ty
2007-01-08 17:24:00
1135
原创 stl_iterator_base.h
定义了5种基本的迭代器类型:输入,输出,前向, 双向,随机迭代器, 相互关系及定义如下。struct input_iterator_tag {};struct output_iterator_tag {};struct forward_iterator_tag : public input_iterator_tag {};struct bidirectional_iterator_tag :
2007-01-08 16:08:00
996
原创 Modern c++ design
前些日子看到china-pub上推荐modern design是必看之书, 买了一本回家。 这两天看了一下才知道, 所言非虚阿, 第一章,就完全展现出了一个c++编程、设计的全新领域。 好好再仔细琢模一下。
2007-01-08 16:08:00
2089
原创 traits技巧
traits意思为特性, traits技巧就是根据迭代器的类型萃取出迭代器相关的类型。 为了实现这个目标, 迭代器需要定义一些类型名称value_type, difference_type, pointer, reference, iterator_category, 然后通过偏特化, 也可以对原生指针有很好的支持. 如果某个迭代器没有遵行stl的类型定义约定,那么这个迭代器就不能兼容于整个s
2007-01-08 16:07:00
663
原创 stl_alloc.h
sgi stl的allocate由2级配置器组成, 默认为第二级, 第二级配置器分配内存的时候, 首先查看需要分配的内存块大小,如果大于160, 调用第一级配置器, 否则用内存池来分配内存。 这样对小块内存的分配效率高,不容易产生内存碎片。一级配置器:template class __malloc_alloc_template {二级配置器template class __default_allo
2007-01-08 16:04:00
2401
原创 发现对标准库的理解不够
今天准备写一个最简单的插入排序,最开始打算实现如下函数:templatevoid insertionSort(Iter first, Iter last, Function f)在写得时候,突然发现, 因为插入排序,需要定义一个临时变量,这个变量的类型应该是*Iter所代表的类型, 但是, 在这里拿不到。 有点发晕, 查了一下标准库算法的一些实现, 发现标准库的实现中, 类型是用trait
2007-01-08 16:03:00
859
1
原创 研究算法的一些想法
以前学习算法,通常是书一看而过, 好像很明白,简单一点的算法说起来也清清楚楚, 复杂一点的概念清晰, 特别难得一窍不通。 这种感觉让人很闷, 应该是因为动手不够, 所以越发复杂, 不动手的话,基本就难以理解了, 而如果要自己写一个算法来实现, 就算概念清晰,清清楚楚, 也要花不少时间, 还要查若干资料。 要在实践中选择应用更加有效的算法, 更是难上加难了。所以很有欲望写一个算法的项目
2007-01-08 16:02:00
907
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人