C++ 标准模板库(STL)----简介

   参考链接:http://www.cnblogs.com/giszhang/archive/2010/02/02/1661844.html
一、C/C++ 与 STL ?
1.什么是 STL?
STL -- 数据结构和算法的分离,模板(GP);

STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常
通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容
器和数组;

STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和
虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,
但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得
生成的代码短小高效;

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它
被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命
性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序
员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft 
Visual C++ 中的MFC(Microsoft Foundation Class Library),或者是Borland C++ Builder中的
VCL(Visual Component Library);

从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名
词,比如像需求(requirements),概念(concept),模型(model),容器(container),
算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态
(polymorphism)一样,泛型也是一种软件的复用技术;

从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个
在早先C++标准中没有出现的语言特性--模板(template)。如果查阅任何一个版本的STL源代码, 你就
会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL
的实现提供了方便;

STL中六大组件:
1)容器(Container),是一种数据结构,如 list, vector, 和deques, 以模板类的方法提供。为了访问容
器中的数据,可以使用由容器类输出的迭代器;
2)迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的
一定范围的对象。迭代器如同一个指针。事实上,C++ 的指针也是一种迭代器。但是,迭代器也可以是
那些定义了 operator*() 以及其他类似于指针的操作符的方法的类对象;
3)算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL 用 sort() 来对一个 vector中的数
据进行排序,用 find() 来搜索一个list 中的对象,函数本身与他们操作的数据的结构和类型无关,因此
他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
4)仿函数(Function object);
5)迭代器适配器(Adaptor);
6)空间配置器(allocator);

2.C++ 标准库
作为C++,其标准库包括以下内容:
(1)C标准函数库,基本保持了与原有C语言程序库的良好兼容,尽管有些微变化。人们总会忍不住留恋过
去的美好岁月,如果你曾经是一个C程序员,对这一点一定体会颇深。或许有一点会让你觉得奇怪,那就
是在C++标准库中存在两套C的函数库,一套是带有.h扩展名的(比如),而另一套则没有比
)。它们确实没有太大的不同。

(2)语言支持(language support)部分,包含了一些标准类型的定义以及其他特性的定义,这些内容,
被用于标准库的其他地方或是具体的应用程序中。 

(3)诊断(diagnostics)部分,提供了用于程序诊断和报错的功能,包含了
异常处理(exception handling),断言(assertions),错误代码(error number codes)三种方
式。

(4)通用工具(general utilities)部分,这部分内容为C++标准库的其他部分提供支持,当然你也可以
在自己的程序中调用相应功能。比如:动态内存管理工具,日期/时间处理工具。记住,这里的内容也已
经被泛化了(即采用了模板机制)。

(5)字符串(string)部分,用来代表和处理文本。它提供了足够丰富的功能。事实上,文本是一个
string对象,它可以被看作是一个字符序列,字符类型可能是char,或者wchar_t等等。string可以被转
换成 char*类型,这样便可以和以前所写的C/C++代码和平共处了。因为那时侯除了char*,没有别的。

(6)国际化(internationalization)部分,作为OOP特性之一的封装机制在这里扮演着消除文化和地域
差异的角色,采用locale和facet可以为程序提供众多国际化支持,包括对各种字符集的支持,日期和时
间的表示,数值和货币的处理等等。毕竟,在中国和在美国,人们表示日期的习惯是不同的。

(7)容器(containers)部分,STL的一个重要组成部分,涵盖了许多数据结构,比如前面曾经提到的链
表,还有:vector(类似于大小可动态增加的数组)、queue(队列)、stack(堆栈)……。string也可
以看作是一个容器,适用于容器的方法同样也适用于string。现在你可以轻松的完成数据结构课程的家
庭作业了。

(8)算法(algorithms)部分,STL的一个重要组成部分,包含了大约 70个通用算法,用于操控各种容
器,同时也可以操控内建数组。比如:find用于在容器中查找等于某个特定值的元素,for_each用于将
某个函数应用到容器中的各个元素上,sort用于对容器中的元素排序。所有这些操作都是在保证执行效
率的前提下进行的,所以,如果在你使用了这些算法之后程序变得效率底下,首先一定不要怀疑这些算
法本身,仔细检查一下程序的其他地方。

(9)迭代器(iterators)部分,STL的一个重要组成部分,如果没有迭代器的撮合,容器和算法便无法结合
的如此完美。事实上,每个容器都有自己的迭代器,只有容器自己才知道如何访问自己的元素。它有点像
指针,算法通过迭代器来定位和操控容器中的元素。

(10)数值(numerics)部分,包含了一些数学运算功能,提供了复数运算的支持。

(11)输入/输出(input/output)部分,就是经过模板化了的原有标准库中的iostream部分,它提供了对
C++程序输入输出的基本支持。在功能上保持了与原有iostream的兼容,并且增加了异常处理的机制,并
支持国际化(internationalization)。

总体上,在C++标准函数库中,STL主要包含了容器、算法、迭代器。string也可以算做是STL的一部分。

        C++ 标准模板库(STL)----简介_第1张图片

简单来讲,STL是作为C++标准库的一部分存在的(据统计,STL的代码占到了整个C++标准库的80%);

STL用到了C++中的模板机制(泛型编程的思想)、函数重载、命名空间等特性,从其诞生的过程来看,
STL与C++可以说是相辅相成的;

STL的背后蕴含着泛型化程序设计(GP)的思想,在这种思想里,大部分基本算法被抽象,被泛化,独立
于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。这一思想和面向对象的程序设计
思想(OOP)不尽相同,因为,在OOP中更注重的是对数据的抽象,即所谓抽象数据类型(Abstract 
Data Type),而算法则通常被附属于数据类型之中。几乎所有的事情都可以被看作类或者对象(即类的
实例),通常,我们所看到的算法被作为成员函数(member function)包含在类(class)中,类和类
则构成了错综复杂的继承体系。




你可能感兴趣的:(标准(ISO),C++)