C++ STL是什么,发展历程怎样

[复制链接]

150

主题

446

帖子

1968

积分

审核员

Rank: 9Rank: 9Rank: 9

积分
1968
楼主
查看: 6913回复: 0 发表于 2020-7-10 09:03:20   只看该作者
本帖最后由 secret 于 2020-7-10 09:44 编辑

在已有 C++ 尤其是 C++ 模板的基础上,从本节开始,我们开始系统地学习 STL 标准模板库,首先来了解什么是 STL,以及学习 STL 有什么用?

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。

STL 最初由惠普实验室开发,于 1998 年被定为国际标准,正式成为 C++ 程序库的重要组成部分。值得一提的是,如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装,这可能也是 STL 被广泛使用的原因之一。
STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供。
从根本上说,STL 是一些容器、算法和其他一些组件的集合,所有容器和算法都是总结了几十年来算法和数据结构的研究成果,汇集了许多计算机专家学者经验的基础上实现的,因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。
注意,这里提到的容器,本质上就是封装有数据结构的模板类,例如 list、vector、set、map 等。

学STL能干什么?
为了让读者清楚地了解 STL 是什么,使用 STL 编程有哪些优势,这里举一个使用 STL 的例子。
能够掌握这种语言体系的改变实际上是非常重要的,如果能够变化所有编程语言的基本框架 我们就能够变化出这种位置上的东西

以 C++ 定义数组的操作为例,在 C++ 中如果定义一个数组,可以采用如下方式:
int a[n];
这种定义数组的方法需要事先确定好数组的长度,即 n 必须为常量,这意味着,如果在实际应用中无法确定数组长度,则一般会将数组长度设为可能的最大值,但这极有可能导致存储空间的浪费。

所以除此之外,还可以采用在堆空间中动态申请内存的方法,此时长度可以是变量:
int *p = new int[n];

这种定义方式可根据变量 n 动态申请内存,不会出现存储空间浪费的问题。但是,如果程序执行过程中出现空间不足的情况时,则需要加大存储空间,此时需要进行如下操作:
  • 新申请一个较大的内存空间,即执行int * temp = new int[m];
  • 将原内存空间的数据全部复制到新申请的内存空间中,即执行memecpy(temp, p, sizeof(int)*n));
  • 将原来的堆空间释放,即执行delete [] p; p = temp;

而完成相同的操作,如果采用 STL 标准库,则会简单很多,因为大多数操作细节将不需要程序员关心。下面是使用向量模板类 vector 实现以上功能的示例:
  • vector <int> a; //定义 a 数组,当前数组长度为 0,但和普通数组不同的是,此数组 a 可以根据存储数据的数量自动变长。
  • //向数组 a 中添加 10 个元素
  • for (int i = 0; i < 10 ; i++)
  •     a.push_back(i)
  • //还可以手动调整数组 a 的大小
  • a.resize(100);
  • a[90] = 100;
  • //还可以直接删除数组 a 中所有的元素,此时 a 的长度变为 0
  • a.clear();
  • //重新调整 a 的大小为 20,并存储 20 个 -1 元素。
  • a.resize(20, -1)


注意,初学者只需结合注释,大概了解代码功能即可,有关代码中涉及到具体知识,后续会做详细介绍。
对比以上两种使用数组的方式不难看出,使用 STL 可以更加方便灵活地处理数据。所以,大家只需要系统地学习 STL,便可以集中精力去实现程序的功能,而无需再纠结某些细节如何用代码实现。

Alexander Stepanov(后被誉为 STL 标准模板库之父,后简称 Stepanov),1950 年出生与前苏联的莫斯科,他曾在莫斯科大学研究数学,此后一直致力于计算机语言和泛型库研究。

在 20 世纪 70 年代,Stepanov 开始考虑,在保证效率的前提下,是否能将算法从诸多具体应用之中抽象出来?为了验证自己的思想,他和纽约州立大学教授 Deepak Kapur 以及伦塞里尔技术学院教授 David Musser 共同开发了一种叫做 Tecton 的语言,尽管这次尝试没有取得实用性的成果,但却给了 Stepanov 很大的启示。

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

1987 年,在贝尔实验室工作的 Stepanov 开始首次采用 C++ 语言进行泛型软件库的研究。由于当时的 C++ 语言还没有引入模板的编程技术,泛型库只能是通过 C++ 的继承机制来开发,代码表达起来非常笨拙。

但尽管如此,Stepanov 还是开发出了一个庞大的算法库。与此同时,在与 Andrew Koenig(前 ISO C++ 标准化委员会主席)和 Bjarne Stroustrup(C++ 语言的创始人)等顶级大师们的共事过程中,Stepanov 开始注意到 C/C++ 语言在实现其泛型思想方面所具有的潜在优势。

就拿 C/C++ 中的指针而言,它的灵活与高效运用使后来的 STL 在实现泛型化的同时更是保持了高效率。另外,在 STL 中占据极其重要地位的迭代器概念便是源自于 C/C++ 中原生指针的一般化推广。

1988 年,Stepanov 开始进入惠普的 Palo Alto 实验室工作,在随后的 4 年中,他从事的是有关磁盘驱动器方面的工作。直到 1992 年,由于参加并主持了实验室主任 Bill Worley 所建立的一个有关算法的研究项目,才使他重新回到了泛型化算法的研究工作上来。

项目自建立之后,参与者从最初的 8 人逐渐减少,最后只剩下 Stepanov 和 Meng Lee 两个人。经过长时间的努力,最终完成了一个包含有大量数据结构和算法部件的庞大运行库(HP 版本的 C++ STL),这便是现在 STL 的雏形。

1993 年,当时在贝尔实验室的 Andrew Koenig 看到了 Stepanov 的研究成果,在他的鼓励与帮助下,Stepanov 于 1993 年 9 月在圣何塞为 ANSI/ISO C++ 标准委员会做了一个题为“The Science of C++ Programming” 的演讲,向委员们讲述了其观念。然后又于 1994 年 3 月,在圣迭戈会议上向委员会提交了一份建议书,以期将 STL 通用库纳入 C++ 标准。

尽管这一建议十分庞大,以至于降低了被通过的可能性,但其所包含的新思想吸引了许多人的注意力。随后在众人的帮助之下,包括 Bjame Stroustrup 在内,Stepanov 又对 STL 进行了改进,同时加入了一个封装内存模式信息的抽象模块,也就是现在 STL 中的 allocator(内存分配器),它使 STL 的大部分实现都可以独立于具体的内存模式,从而独立于具体平台。

最终在 1994 年的滑铁卢会议上,委员们通过了提案,决定将 STL 正式纳入 C++ 标准化进程之中,随后 STL 便被放进了会议的工作文件中。自此,STL 终于成为 C++ 家族中的重要一员。

此后,随者 C++ 标准的不断改进,STL 也在不断地做着相应的演化。直至 1998 年,ANSI/ISO C++ 标准正式定案,STL 始终是 C++ 标准库不可或缺的重要组成部分。


快速回复 返回顶部 返回列表