STL
看完此书,STL不再神秘!
一开始看完第一章,主要是STL的简介和一些语法知识,之后就直接跳到第四章开始看STL容器的底层实现了,从 vector, list, deque, stack, queue到关联式容器 map, set 等,看完直呼过瘾,容器底层实现了然于心。
后来又从第二章的空间配置器看,STL为了效率的考虑,直接把new的两步(配置内存,调用构造函数)分开了,采用两级内存配置 和 place new 来进行内存管理,同时搭配型别技术,提升效率!
而第三章的 traits 编程技法估计是精华了。STL提升效率很关键的一点就是将运行期的消耗,先丢给编译器去处理,从而提升了运行期的效率。另外进行型别检测,能够分别采取不同的操作,例如POD类型没必要重复调用析构函数,有些字符操作可以直接调用底层memcpy, 或是 memmove 来提升效率,这些有赖于模板的妙用,对标量数据类型进行模板的特化,从而实现型别检测。
后面的章节主要是一些算法和其他的,感觉没前面的章节描写得精彩。
看完此书,感觉STL不再陌生和神秘。
经典书籍比较多,其中最经典的就是《C++标准程序库:自修教程与参考手册》。
1、《C++标准程序库:自修教程与参考手册》
这本书作为学习STL的第一本书是绝对适合的,一开始就会有C++语言的必备知识,以免你一头扎进STL中直接淹死。
《The C++ Standard Library》(中文版《C++ 标准程序库》)不仅对每一个程序库组件提供范围广泛的说明,也对繁杂的感念提供清楚明亮的解释,并描述高效运用这些组件时需要的实际编程细节,提出一个又一个的范例程序。
这本包含最新资料的完整书籍,反映出被
ANSI/ISO C++ 语言标准规格书纳入的 C++ 标准程序库的结构。更明确地说,本书将焦点放在标准模板库(Standard
Template
Library)身上,检验其中的容器(containers)、迭代器(iterators)、仿函数(functors)和算法(algorithms)。
你还可以找到特殊容器、字符串(strings)、数值类别、国际化议题、IOStream。每一个组件都有深刻的呈现,包括其介绍、设计、运用实例、细部解说、陷阱、意想不到的危险,以及相关类别和函数的确切标记(signature)和定义。
一份见解深刻的基础概念介绍和一个程序库综合鸟瞰,会对新手带来快速的提升。
2、《Effective STL 中文版: 50条有效使用STL的经验》
说到Scott Meyers的大名,C++程序员应该是无人不知无人不晓,他开创性的写了两本C++巨著《Effective C++》和《More Effective C++》都是每一个C++程序员必备书籍。
这本书自然也不例外,其中讲解了50条容易将C++程序员引入歧途的错误案例和正确修正使用方法。每一个使用STL的程序员都必备该书。
3、《STL源码剖析》
侯捷先生出品的书籍,一般品质都有所保证。这也是侯捷先生自己原创的一本书,这本书主要是深入到SGI版本的STL实现中,将STL的代码抽丝剥茧,将最鲜血淋漓的那部分取出来给大家指导清除。阅读这本书。
学习STL是次要的,学习数据结构是次要的,主要是要学习侯捷先生治学的精神和分析源代码的方式方法,这才是最重要的。这本书一再印刷,销量已经证明了一切。各大图书商城有售。
4、《STL扩展技术手册(卷1):集合和迭代器》
相信一大群读者没有听说过这本书,但是这本书也是非常值得推荐的一本STL书籍,这本书既不是教你STL怎么用,也不是教你STL的实现是怎么样的,而是教你如何扩展你自己的STL组件。基本上是国内C++图书界中唯一一本讲解STL扩展的专著。
作者之前写过一本《Imperfact C++》的书,这本书不知道为什么在国内的销量也不好,但是该作者的C++技术造诣非常深厚,他的著作也是每一个想要深入学习C++的读者所必读的书籍。作者本来打算将STL 扩展技术手册分为1,2两卷出版,可惜第一卷出版后,第二卷再也出不来了。
5、介绍
STL(StandardTemplate Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++Standard Library)中,是ANSI/ISOC++标准中最新的也是极具革命性的一部分。
该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
从逻辑层次来看,在STL中体现了泛型化程序设计的思想(genericprogramming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。
与OOP(object-orientedprogramming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术;
从实现层次看,整个STL是以一种类型参数化(typeparameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。
如果查阅任何一个版本的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便;
6、STL的六大组件
· 容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
· 迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
· 算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
· 仿函数(Function object,仿函数(functor)又称之为函数对象(functionobject),其实就是重载了()操作符的struct,没有什么特别的地方
· 迭代适配器(Adaptor)
· 空间配制器(allocator)其中主要工作包括两部分:对象的创建与销毁和内存的获取与释放