
经典书籍比较多,其中最经典的就是《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)其中主要工作包括两部分:对象的创建与销毁和内存的获取与释放
C++强大的功能来源于其丰富的类库及库函数资源。C++标准库的内容总共在50个标准头文件中定义。在C++开发中,要尽可能地利用标准库完成。这样做的直接好处有:
(1)成本:已经作为标准提供,何苦再花费时间、人力重新开发呢;
(2)质量:标准库的都是经过严格测试的,正确性有保证;
(3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平;
(4)良好的编程风格:采用行业中普遍的做法进行开发。
在C++程序设计课程中,尤其是作为第一门程序设计课程,我们注重了语法、语言的机制等方面的内容。程序设计能力的培养有个过程,跨过基本的原理性知识直接进入到工程中的普遍做法,由于跨度决定了其难度。再者,在掌握了基本原理的基础上,在认识标准库的问题上完全可以凭借实践,逐步地掌握。标准库的学习不需要认认真真地读书,需要的是在了解概貌的情况下,在实践中深入。
这个任务就是要知道C++程序设计课程中不讲的,但对程序设计又很重要的这部分内容。至少我们要能先回答出“有什么”的问题。
一、C++标准库
C++标准库的内容分为10类,分别是(建议在阅读中,将你已经用过或听说过的头文件划出来):
贺谨 C1. 标准库中与语言支持功能相关的头文件
C2. 支持流输入/输出的头文件
C3. 与诊断功能相关的头文件
C4. 定义工具函数的头文件
C5. 支持字符串处理的头文件
C6. 定义容器类的模板的头文件
C7. 支持迭代器的头文件
C8. 有关算法的头文件
C9. 有关数值 *** 作的头文件
C10. 有关本地化的头文件
C++标准库的所有头文件都没有扩展名。C++标准库以<cname>形式的标准头文件提供。在 <cname>形式标准的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明。在C++中还可以使用name.h形式的标准C库头文件名。
二、标准模板库STL简介[1]
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
1、算法
函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成禅竖基。<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历 *** 作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些 *** 作。<functional>中则定义了一些模板类,用以声明函数对象。
2、容器
在实际的开发过程中,纤斗数据结构本身的重要性不会逊于 *** 作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。
经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。
容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。
3、迭代器
迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一些。软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,<iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
三、后记
对于STL的使用,也普遍存在着两种观点。第一种认为STL的最大作用在于充当经典的数据结构和算法教材,因为它的源代码涉及了许多具体实现方面的问题。第二种则认为STL的初衷乃是为了简化设计,避免重复劳动,提高编程效率,因此应该是“应用至上”的,对于源代码则不必深究。对于初学者而言,通过分析源代码,提高对其应用的理解其意义也不同凡响。
曾经想着设计几个上机题目,让同学们体会一下利用STL编程。写出一个适合初学者的,规模又不能太大,还要有足够引导的题目,实在是一件非常费时费力的事,加上有其他事还得应急,就将此帐欠下,日后再说。要给同学们提的建议是,不少C++的经典教材对STL都有非常好的讲解,可以选一本去读。在读书时,要开始学着挑着读,跳着读,不必从头到尾,逐页去读。在这个阶段,可以首先学习迭代器utility、在C++编程中建议替代数组的vector,以及实现双向链表的list。vector和list与本周任务1和任务2似乎有些相关。再者,发扬我们一贯特别能实践的精神,及时找些题目或者自编题目进行实践。
扩展C++语言的基本功能,提供常用的编程构件:容器,迭代器,算法。这三种构件可以互相配合完成你在编程中常用的功能。简少了代码量,提高了程序可读性;当然,标准库都是经过测试和验证的,可以放心使用;如果没有标准库,你可能经常要重新抡起锤子造车,当然这是比较恶心的,如兄闷侍果你经常写一些曾经写过的大差不罩旁差的代码的话。C++的标准库叫STL,还有一个权威的非标准的库:BOOST,这两个库羡吵你都可以自学并使用,很多功能方便的让你爱不释手。当然,任何库都是方便大家写各种程序的,如果你是个懒蛋,懒的去学,如果你是个自恋狂,认为自己写的代码总是很牛X,那估计你不会去理会所谓的神马标准库,准标准库的东东。你可能会鄙视各种语言或者膜拜各种语言,然后觉得没什么好学的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)