注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一路

To find the final symmetry & beauty

 
 
 

日志

 
 
 
 

SGI STL源码阅读笔记1,准备工作[原创]  

2011-02-14 12:44:18|  分类: c++学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    又重新仔细读了SGI STL的代码,真是大师的作品,收获很多。写一些笔记,方便自己以后查看或是给可能需要的人方便吧,注意本笔记中有很多是我自己的理解,可能与主流书籍中的观点并不相同,读者还是自己取用吧,不要因为我的观点而误了别人,J

    SGI STL是STL代码的经典实现版本,虽然很多编译器不直接使用这个版本,但是很多却在此基础之上进行改进的。比如GNU C++的标准库就是在此基础之上改进的。这份代码还有一个好处是有注释,代码书写非常规范,只要花些时间读懂它并非难事。注意,读STL代码并不是一个学习使用STL的方法,如果你想学会使用STL则不必读懂STL的代码,但是读懂这份代码却能使你更加灵活的运用STL,在读代码之前你一定要对STL己经比较熟悉,知道其中一些概念并且C++基础水平还算可以。STL用到了很多C++语言中的特性,这些特性在平时并不十分常见。C++ primer是一本十分值得初学者阅读的书,还有一本书叫c++ primer plus,这本书也不错,是比较简单的一本书,用它入门非常不错。C++ primer这本书的内容比较全面,真的值得仔细读一遍,它也应该是高手手边的常备参考手册,我在此特别推荐。

一、代码下载

    下面是一个sgi stl的文件列表,你可以从sti的官方网站下载得到,http://www.sgi.com/tech/stl/ 是sgi stl的官方网站。

algo.h pair.h stl_iterator_base.h

algobase.h pthread_alloc stl_list.h

algorithm pthread_alloc.h stl_map.h

alloc.h queue stl_multimap.h

bitset rope stl_multiset.h

bvector.h rope.h stl_numeric.h

char_traits.h ropeimpl.h stl_pair.h

concept_checks.h sequence_concepts.h stl_queue.h

container_concepts.h set stl_range_errors.h

defalloc.h set.h stl_raw_storage_iter.h

deque slist stl_relops.h

deque.h slist.h stl_rope.h

function.h stack stl_set.h

functional stack.h stl_slist.h

hash_map stdexcept stl_stack.h

hash_map.h stl_algo.h stl_string_fwd.h

hash_set stl_algobase.h stl_tempbuf.h

hash_set.h stl_alloc.h stl_threads.h

hashtable.h stl_bvector.h stl_tree.h

heap.h stl_config.h stl_uninitialized.h

iterator stl_construct.h stl_vector.h

iterator.h stl_ctraits_fns.h string

limits stl_deque.h tempbuf.h

list stl_exception.h tree.h

list.h stl_function.h type_traits.h

map stl_hash_fun.h utility

map.h stl_hash_map.h valarray

memory stl_hash_set.h vector

multimap.h stl_hashtable.h vector.h

multiset.h stl_heap.h

numeric stl_iterator.h

二、软件工具

阅读代码要有工具,个人推荐source insight和notepad++,其中source insignt是一个非常不错的工具,应用非常广。值得一提的是notepad++是一个开源免费软件,十分小巧好用。而对于代码编辑工具我用的是gvim. 这个工具可以说是代码编辑的神器,不过初学者可能用起来不是很习惯。如果不能使用gvim,那么直接使用notepad++也是不错的,对于代码编辑工具可以查看wikipedia的相关页面。

http://en.wikipedia.org/wiki/List_of_text_editors

这是一个代码编辑器的列表,非常详细

http://en.wikipedia.org/wiki/Comparison_of_text_editors

这是各种代码编辑器的比较,也非常详细

三、参考书籍

    cplusplus.com是一个十分优秀的对一个关于C++标准库说明的网站,学习使用STL可参考这个网站。《C++ Standard Library, The: A Tutorial and Reference》这本是学习STL使用的经典书籍,值得备在手边。台湾C++专家侯捷有一本《STL源码剖析》,是一本十分不错的关于SGI STL的书。作者功底很深,绝不是大陆的水货砖家的书可比,我边读这本书边看sgi stl代码,收获很大。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3225.pdf这个是C++0x的最新标准文档,是C++的标准说明文件,各编译器厂商都可参考此文档来编写编译器,此文档对于学习C++的重要性可想而知,但是此文件内容十分学术,不易读懂,但是还是把它放在电脑里吧,可随时查阅。

在此也提醒真正想成为计算机界人才的同学,不要读大陆的关于计算机的书籍,包括翻译的。大陆书籍哪有原创,其本都是抄袭国外书籍,而且抄袭质量很差,粗制滥造,还有对于原创的引用都不写,序中感谢也没有,偷盗而不知耻,天朝砖家叫兽真是牛B。其中被很多人奉为经典的《数据结构,(C语言版)》,书中也只是把一些已知常见的数据结构和算法总结一遍,制作一份详细的列表,更可气的是其中还编造很多硬性概念,内容十分僵化,就算是有人可以熟读此书,全部记住书中的各种结构和算法,也不能明白什么是算法,如何设计与分析算法。更难以在此基础之上进行扩展,此书顶多算上是一个类似元素周期表式的查找书册。而翻译的书更加过分,很多书籍是叫兽译一小部分,大部分是其研究生翻译甚至还有本科生翻译的,其质量可想而知。就拿《算法导论》中文翻译版一书,这本书我在书店看着不错而且此书早就盛名远播,于是就掏银子买了。回来读了一部分之后就感觉不对,书中前五章还算不错,就错是出错也只是一些拼写的小毛病,但是越到后来真是不能忍了。我怀疑译者是不是真的读懂了此书,是否详细推到过书中的公式和分析过书中的图表。下标混乱,图表颜色深浅错乱随处可见。真是败坏了原书的名声,让人气愤,译书者根本不懂原书内容,这是大陆翻译的现状,唉,没有办法,多读英文书吧。

四、文件依赖顺序图

    我用软件生成了下面的一张sgi stl各文件的相互引用依赖图表,我们想一窥sgi stl的奥秘当然是从其中最核心的文件如手。擒贼先擒王,打蛇打七寸嘛。没错,我们最先要搞定的是stl_config.h文件和concept_checks.h文件。

SGI STL源码阅读笔记1,准备工作[原创] - saturnman - 一路
 

从这张图也可看出STL的特点,各文件结合的相当紧密。我还是重复一下别人的话,对于m种容器和n种算法,一般的库要实现m*n个单位函数,但是STL确是m+n个,这其中就是泛型算法的魔力。读sgi stl你看到的最多的不是继承,而是泛型。泛型这特性在平时应用中它的威力根本没有发挥出来,以至于很多人认为其威力不如继承强大。泛型和继承都是实现多态性的方法,但是泛型来算编译时的计算,不会对最终的代码带来任何性能上的伤害,它还有很多比继承更加强大的能力,读懂了sgi stl的代码你就会见识到其真的正威力了。

五、编译器

  为了测试代码,编译器当然不能少了,我选用的编译器是VS2010和mingw gcc,4.5 这两个编译器是windows上的主流编译工器,且对最新C++标准C++0x有一定的支持,而且许多STL的实现细节要依赖编译器的某些对标准特性的支持,选用最新的编译器会带来不少方便。

Ref:

SGI STL 源码  http:// www.sgi.com/tech/stl/

候捷 STL源码剖析》

  评论这张
 
阅读(5174)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017