C++ STL 基础及应用(1)—STL历史、组成和使用方法

原文链接:https://blog.csdn.net/Raito__/article/details/51465106

  本章节主要介绍 STL 的历史和 STL 的基本组成内容,以及使用方法。


1、STL历史

  20世纪70年代,被誉为标准模板库(Standard Template Library,STL)之父的 Alexander Stepanov 开始考虑:在保证效率的前提下,将算法从诸多具体应用之中抽象出来的可能性,这便是后来泛型化思想的雏形。为了验证自己的思想,他和纽约州立大学教授 Deepak Kapur,伦塞里尔技术学院教授 David Musser 共同开发了一种叫做 Tecton 的语言。尽管这次尝试最终没有取得实用性的成果,但却给了 Stepanov 很大的启示。

  在随后的几年中,他又和 David Musser 等人先后用 Schema 语言(一种Lisp语言的变种)和 Ada 语言建立了一些大型程序库。这其间,Alexander Stepanov 开始意识到,在当时的面向对象程序设计思想中所存在的一些问题,比如抽象数据类型概念所存在的缺陷。Stepanov 希望通过对软件领域中各组成部分的分类,逐渐形成一种软件设计的概念性框架。

  1987年左右,在贝尔实验室工作的 Alexander Stepanov 开始首次采用 C++ 语言进行泛型软件库的研究。但遗憾的是,当时的 C++ 语言还没有引入模板(template)的语法,现在我们可以清楚的看到,模板概念之于STL实现,是何等重要。是时使然,采用继承机制是别无选择的。尽管如此,Stepanov 还是开发出了一个庞大的算法库。与此同时,在与 Andrew Koenig(前ISO C++标准化委员会主席)和 Bjarne Stroustrup(C++语言的创始人)等顶级大师们的共事过程中,Stepanov 开始注意到 C/C++ 语言在实现其泛型思想方面所具有的潜在优势。就拿 C/C++ 中的指针而言,它的灵活与高效运用,使后来的 STL 在实现泛型化的同时更是保持了高效率。另外,在 STL 中占据极其重要地位的迭代子概念便是源自于 C/C++ 中原生指针(native pointer)的抽象。

  1988年,Alexander Stepanov开始进入惠普的 Palo Alto 实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任 Bill Worley 所建立的一个有关算法的研究项目,才使他重新回到了泛型化算法的研究工作上来。项目自建立之后,参与者从最初的8人逐渐减少,最后只剩下两个人 —— Stepanove 本人和 Meng Lee。经过长时间的努力,最终,信念与汗水所换来的是一个包含有大量数据结构和算法部件的庞大运行库。这便是现在的 STL 的雏形(同时也是STL的一个实现版本–HP STL)。

  1993年,当时在贝尔实验室的 Andrew Koenig 看到了Stepanove的研究成果,很是兴奋。在他的鼓励与帮助下,Stepanove 于是年9月的圣何塞为ANSI/ISO C++标准委员会做了一个相关演讲(题为”The Science of C++ Programming”),向委员们讲述了其观念。然后又于次年3月,在圣迭戈会议上,向委员会提交了一份建议书,以期使STL成为 C++ 标准库的一部分。尽管这一建议十分庞大,以至于降低了被通过的可能性,但由于其所包含的新思想,投票结果以压倒多数的意见认为推迟对该建议的决定。

  随后,在众人的帮助之下,包括 Bjarne Stroustrup 在内,Stepanove 又对STL进行了改进。同时加入了一个封装内存模式信息的抽象模块,也就是现在 STL 中的 allocator,它使STL的大部分实现都可以独立于具体的内存模式,从而独立于具体平台。在同年夏季的滑铁卢会议上,委员们以80%赞成,20%反对,最终通过了提案,决定将 STL 正式纳入 C++ 标准化进程之中,随后 STL 便被放进了会议的工作文件中。自此,STL 终于成为了 C++ 家族中的重要一员。

  此后,随着C++标准的不断改进,STL也在不断地作着相应的演化。直至1998年,ANSI/ISO C++ 标准正式定案,STL 始终是 C++ 标准中不可或缺的一大部件。


STL家族谱系

扫描二维码关注公众号,回复: 2592480 查看本文章

2、STL内容

STL主要由容器、算法和迭代器三大部分组成。

常用STL包含文件如下:

索引 功能 包含文件 备注
1 迭代器 <iterator>
2 输入输出流 <iostream> 标准输入输出流
<fstream> 文件输入输出流
<sstream> 字符串输入输出流
3 字符串 <string>
4 函数对象 <functional>
5 通用容器 <vector> 向量容器
<deque> 双端队列
<list> 链表容器
<queue> 队列、优先队列
<stack> 堆栈
<set> 集合、多集合、位集合
<map> 映射、多映射
6 通用算法 <algorithm>
7 通用容器 <numeric>

3、STL使用方法

STL的头文件都不加扩展名,以便与C语言风格的”.h”头文件相区别。

STL命名空间名称为 std ,因此使用 STL 要加上 using namespace std 。

猜你喜欢

转载自blog.csdn.net/qq_34634812/article/details/81415495