本篇文章关于STL的概述主要从以下几个方面来介绍:
STL产生原因
STL发展过程
STL基本概念
STL六大组件简介
STL优点
一、STL产生原因
长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented),为的就是复用性的提升。
复用性必须建立在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorithm)都未能有一套标准。大量程序员被迫从事大量重复的工作,竟然是为了完成前人已经完成而自己手上并未拥有的程序代码,这不仅是人力资源的浪费,也是挫折与痛苦的来源。
为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。
二、STL发展过程
标准模板库系由Alexander Stepanov创造于1979年前后,这也正是比雅尼·斯特劳斯特鲁普创造C++的年代。
标准模板库设计人Stepanov早期从事教育工作,1970年代研究泛型程序设计,那时他与其同事Deepak Kapur、David Musser一起在GE公司开发出一个新的程序语言——Tecton。
1983年,Stepanov先生转至Polytechnic大学教书,继续研究泛型程序设计,同时写了许多Scheme的程序,应用在graph与network的算法上,1985年又转至GE公司专门教授高阶程序设计,并将graph与network的Scheme程序,改用Ada写,用了Ada以后,他发现到一个动态(dynamically)类型的程序(如Scheme)与强制(strongly)类型的程序(如Ada)有多么的不同。
1987 年, Stepanov 开始首次采用 C++语言进行泛型软件库的研究。由于当时的 C++ 语言还没有引入模板的编程技术,泛型库只能是通过 C++ 的继承机制来开发,代码表达起来非常笨拙。但尽管如此,Stepanov 还是开发出了一个庞大的算法库。与此同时,在与 Andrew Koenig(前 ISO C++ 标准化委员会主席)和 Bjarne Stroustrup(C++ 语言的创始人)等顶级大师们的共事过程中,Stepanov 开始注意到 C/C++ 语言在实现其泛型思想方面所具有的潜在优势。
1988年Stepanov先生转至HP公司运行开发泛型程序库的工作。此时,他已经认识C语言中指针(pointer)的威力,他表示一个程序员只要有些许硬件知识,就很容易接受C语言中指针的观念,同时也了解到C语言的所有数据结构均可以指针间接表示,这点是C与Ada、Scheme的最大不同。
Stepanov并认为,虽然C++中的继承功能可以表示泛型设计,但终究有个限制。虽然可以在基础类型(superclass)定义算法和接口,但不可能要求所有对象皆是继承这些,而且庞大的继承体系将减低虚拟(virtual)函数的运行效率,这便违反的前面所说的“效率”原则。
到了C++模板观念,Stepanov参加了许多有关的研讨会,与C++之父Bjarne讨论模板的设计细节。如,Stepanov认为C++的函数模板(function template)应该像Ada一样,在声明其函数原型后,应该显式的声明一个函数模板之实例(instance);Bjarne则不然,他认为可以通过C++的重载(overloading)功能来表达。
1992年Meng Lee加入Alex的项目,成为另一位主要贡献者。
1992年,HP泛型程序库项目结束,小组解散,只剩下Stepanov先生与Meng Lee小姐(她是东方人,标准模板库的英文名称其实是取STepanov与Lee而来),Lee先前研究的是编译器的制作,对C++的模板很熟,第一版的标准模板库中许多程序都是Lee的杰作。
1993年,Andy Koenig到史丹佛演讲,Stepanov便向他介绍标准模板库,Koenig听后,随即邀请Stepanov参加1993年11月的ANSI/ISO C++标准化会议,并发表演讲。
Bell实验室的Andrew Koenig于1993年知道标准模板库研究计划后,邀请Alex于是年11月的ANSI/ISO C++标准委员会会议上展示其观念。并获得与会者热烈的回应。
1994年1月6日,Koenig寄封电子邮件给Stepanov,表示如果Stepanov愿意将标准模板库的帮助文档撰写齐全,在1月25日前提出,便可能成为标准C++的一部分。Stepanov回信道:"Andy, are you crazy?" 。 Koenig便说:"Well, yes I am crazy,but why not try it?"。
Alex于是在次年夏天在Waterloo举行的会议前完成其正式的提案,并以百分之八十压倒性多数,一举让这个巨大的计划成为C++ Standard的一部分。
标准模板库于1994年2月年正式成为ANSI/ISO C++的一部分,它的出现,促使C++程序员的思维方式更朝向泛型编程(generic program)发展。
(发展过程部分参考百度百科)。
三、 STL基本概念
STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统 称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。 STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
STL(Standard Template Library)标准模板库,在我们 c++标准程序库中隶属于 STL 的占到了 80%以上。
四、 STL六大组件简介
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。 算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte. 迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator--等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。 空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
五、 STL优点
STL 是 C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。 STL 的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作 程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL就 OK 了。这样他们就可以把精力放在程序开发的别的方面。 STL 具有高可重用性,高性能,高移植性,跨平台的优点。 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的知 识,已经给大家介绍了。 高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。 高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。
更多关于网络安全培训的问题,欢迎咨询千锋教育在线名师,如果想要了解我们的师资、课程、项目实操的话可以点击咨询课程顾问,获取试听资格来试听我们的课程,在线零距离接触千锋教育大咖名师,让你轻松从入门到精通。