摘要:
红黑树数据结构剖析红黑树是计算机科学内比较常用的一种数据结构,它使得对数据的搜索,插入和删除操作都能保持在O(lgn)的时间复杂度。然而,相比于一般的数据结构,红黑树的实现的难度有所增加。网络上关于红黑树的实现资料汗牛充栋,但是乏于系统介绍红黑树实现的资料。本文通过一个自己实现的红黑树数据结构以及必要的搜索,插入和删除操作算法,为大家更系统地剖析红黑树数据结构的实现。对于大部分数据结构,一般都会使用抽象数据类型的方式实现,C++提供的模板机制可以做到数据结构与具体数据类型无关,就像STL实现的那样。不过本文并非去实现STL中的红黑树,更重要的是透过红黑树的实现学习相关的算法和思想。当然,我们还 阅读全文
摘要:
一个简单的通用Makefile实现Makefile是Linux下程序开发的自动化编译工具,一个好的Makefile应该准确的识别编译目标与源文件的依赖关系,并且有着高效的编译效率,即每次重新make时只需要处理那些修改过的文件即可。Makefile拥有很多复杂的功能,这里不可能也没必要一一介绍,为了简化问题的复杂性,本文仅和大家讨论针对单目录下的C/C++项目开发,如何写一个通用的Makefile。首先,我们假设当前工程目录为prj/,该目录下有6个文件,分别是:main.c、abc.c、xyz.c、abc.h、xyz.h和Makefile。其中main.c包含头文件abc.h和xyz.h,a 阅读全文
摘要:
最简git Server配置如何保持多台计算机的项目代码的同步更新呢?通过在一个公用计算机上开启git服务,任何能与该计算机互联的终端都可以同步最新的项目代码。每个终端所负责的就是下载代码更新,修改代码,提交代码更新,这些工作产生的变化能全部反应到git服务器上。同时,这么做也能避免使用github导致的代码过早公布的弊端。从此代码的版本控制和备份问题得到完美解决!服务端配置:1.安装git:sudo apt-get install git-core2.安装ssh服务:sudo apt-get install openssh-server3.创建服务端仓库文件夹(用户root可以访问):mkd 阅读全文
摘要:
Lisp的本质(The Nature of Lisp)学习思考作者 Slava Akhmechet 译者 Alec Jang出处: http://www.defmacro.org/ramblings/lisp.html简介最初在web的某些角落偶然看到有人赞美Lisp时, 我那时已经是一个颇有经验的程序员。在我的履历上, 掌握的语言范围相当广泛, 象C++, Java, C#主流语言等等都不在话下, 我觉得我差不多知道所有的有关编程语言的事情。对待编程语言的问题上, 我觉得自己不太会遇到什么大问题。其实我大错特错了。我试着学了一下Lisp, 结果马上就撞了墙。我被那些范例代码吓坏了。我想很多初 阅读全文
摘要:
git使用小结很多人可能和我一样,起初对git是一无所知的。我也是因为一次偶然的机会接触到git,并被它强大的功能所蛰伏。git其实就是一种版本控制工具,就像svn一样,但是git是分布式的。我不想给git打广告,我们直入正题——git能帮我们做什么?1)源码版本控制。平常写一写demo程序可能和git打不上交道,但是当我们把程序写到10000行以上,一般一个人开发的话要持续一个多月。期间程序作者可能会保存了N多份程序不同时期的拷贝,一来是为了备份代码,二者是作者添加新的程序功能,一旦对新功能不满意时可以方便撤销。git能帮助我们保存每次提交源码更改时的历史记录,并在需要的时候帮助我们撤销回滚 阅读全文
摘要:
Linux内核源码分析方法一、内核源码之我见Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了解到的信息。Linux内核由无数开源社区的“大神们”精心维护,这些 阅读全文
摘要:
新手读懂五线谱一直以来都觉得五线谱好神秘,作为计算机专业的我,音乐水平也就停留在儿时“一闪一闪亮晶晶”的层次上。最近有幸认识了一位音乐方面的“大神”,难得抓住一个机会,好好请教一下。最终的结果还是对得起自己的音乐智商的,我也从一个对音乐无知的小白,变成了一个能看懂五线谱的菜鸟了(在这里需要特别的感谢这位无私的“大神”~)。如果你有兴趣也想了解五线谱的话,不如过来一起分享一下获得这些知识的快乐~我们按照三个步骤来学习:1.学习简谱的基本知识。2.学习五线谱的基本知识。3.找简谱和五线谱之间的对应关系。之所以这么做,是因为通过简谱可以方便得了解一些基本的乐理知识,假如你看得懂简谱,请跳过这一节。然 阅读全文
摘要:
《黑客与画家》读摘《黑客与画家》是“硅谷创业之父”Paul Graham的文集,作者是计算机“黑客”兼“画家”兼“作家”,同时也是世界首个互联网应用程序viaweb(已被Yahoo收购)开发创始人之一(另一个是世界首个蠕虫——“莫里斯蠕虫”的作者罗伯特·莫里斯)。正如本书的封底所附的书评中苹果机发明人之一Andy Hertzfeld所说:“他的文章清晰易懂、幽默生动,从艺术、科学、商业互相交织的角度谈论如何写出优秀的代码,充满了与众不同的看法和切实可行的高见。你甚至可能因为看了他的文章而改用Lisp编程哦!”的确,读完这位本书的确对我个人的一些想法和思维产生了不少影响和改变。比如它改 阅读全文
摘要:
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自于对标题中“vtordisp”的好奇。其实这个关键词也是来源于我最近查看对象模型的时候偶然发现的。我是一个喜欢深究问题根源的人(有点牛角尖吧),所以当我第一次发现vtordisp的时候,我也是很自然的把它输进google查找相关资料,但是结果令我不太满意。不过,即使如此,我还是把与它相关的资料整理如下,并结合自己的理解和大家分享一下,希望能共同学习进步。首先从产生“vtordisp”问题的那个例子开始。classBase{public:intbase;virtualvoidfun(){}};classDer:virtualpub. 阅读全文
摘要:
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特性,熟悉C++的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C++的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题,然而多重继承又会产生成员冲突的问题,虚继承在我看来更像是一种“不得已”的解决方案。多态让对象具有了运行时特性,并且它是软件设计复用的本质,虚函数的出现为多态性质提供了实现手段。如果说C语言的struct相当于对数据成员简单的排列(可能有对齐问题),那么C++的class让对象的数据的封装变得更加复杂。所有的这些问题来源于C++的一个关键字 阅读全文