C++ STL编程轻松入门 2

1.3.3 STL和GP,GP和OOP html

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

  尽管在象C++这样的程序设计语言中,你还能够用全局函数来表示算法,可是在相似于Java这样的纯面向对象的语言中,全局函数已经被"勒令禁止"了。所以,用Java来模拟GP思想是颇为困难的。若是你对前述的STL历史还有印象的话,应该记得Alexander Stepanove也曾用基于OOP的语言尝试过实现GP思想,可是效果并很差,包括没有引入模板以前的C++语言。站在巨人的肩膀上,咱们能够得出这样的结论,在OOP中所体现的思想与GP的思想确实是相异的。C++并非一种纯面向对象的程序设计语言,它的绝妙之处,就在于既知足了OOP,又成全了GP。对于后者,模板立下了汗马功劳。另外,须要指出的是,尽管GP和OOP有诸多不一样,但这种不一样还不至于到"水火不容"的地步。而且,在实际运用的时候,二者的结合使用每每可使问题的解决更为有效。做为GP思想实例的STL自己即是一个很好的范例,若是没有继承,不知道STL会是什么样子,彷佛没有人作过这样的试验。web

  1.4 STL的不一样实现版本算法

  相信你对STL的感性认识应该有所提升了,是该作一些实际的工做了,那么咱们首先来了解一下STL的不一样实现版本。ANSI/ISO C++文件中的STL是一个仅被描述在纸上的标准,对于诸多C++编译器而言,须要有各自实际的STL,它们或多或少的实现了标准中所描述的内容,这样才可以为咱们所用。之因此有不一样的实现版本,则存在诸多缘由,有历史的缘由,也有各自编译器生产厂商的缘由。如下是几个常见的STL实现版本。数据结构

  1.4.1 HP STL函数

  HP STL是全部其它STL实现版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto实验室工做时,和Meng Lee共同完成的,是第一个STL的实现版本(参见1.2节)。这个STL是开放源码的,因此它容许任何人无偿使用、复制、修改、发布和销售该软件和相关文档,前提是必须在全部相关文件中加入HP STL的版本信息和受权信息。如今已经不多直接使用这个版本的STL了。性能

  1.4.2 P.J. Plauger STL网站

  P. J. Plauger STL属于我的做品,由P. J. Plauger本人实现,是HP STL的一个继承版本,所以在其全部头文件中都含有HP STL的相关声明,同时还有P. J. Plauger本人的版权声明。P. J. Plauger是标准C中stdio库的早期实现者,如今是C/C++ User's Journal的主编,与Microsoft保持着良好的关系。P. J. Plauger STL即是被用于Microsoft的Visual C++中的。在Windows平台下的同类版本中,其性能不错,可是queue组件(队列,一种容器)的效率不理想,同时因为Visual C++对C++语言标准的支持不是很好(至少直到VC6.0为止,仍是如此),所以必定程度上影响了P. J. Plauger STL的性能。此外,该版本的源代码可读性较差,你能够在VC的Include子目录下找到全部源文件(好比:C:\Program Files\Microsoft Visual Studio\VC98\Include)。由于不是开放源码的(open source),因此这些源代码是不能修改和销售的,目前P.J. Plauger STL由Dinkumware公司提供相关服务,详情请见http://www.dinkumware.comVisualStudiohashset容器。ui

  1.4.3 Rouge Wave STLspa

  Rouge Wave STL是由Rouge Wave公司实现的,也是HP STL的一个继承版本,除了HP STL的相关声明以外,还有Rouge Wave公司的版权声明。同时,它也不是开放源码的,所以没法修改和销售。该版本被Borland C++ Builder所采用,你能够在C++ Builder的Include子目录下找到全部头文件(好比:C:\Program Files\Borland\Cbuilder5\Include)。尽管Rouge Wave STL的性能不是很好,但因为C++ Builder对C++语言标准的支持还算不错,使其表如今必定程度上得以改善。此外,其源代码的可读性较好。能够从以下网站获得更详细的状况介绍:http://www.rougewave.com源代码C:Program Files\Borland\Cbuilder6\Include\oldstl)。

  1.4.4 STLport

  STLport最初源于俄国人Boris Fomitchev的一个开发项目,主要用于将SGI STL的基本代码移植到其余诸如C++Builder或者是Visual C++这样的主流编译器上。由于SGI STL属于开放源码,因此STLport才有权这样作。目前STLport的最新版本是4.5。能够从以下网站获得更详细的状况介绍:http://www.stlport.org免费下载VC中的STL要快。比Rouge Wave STL更符合标准,也更容易移植。Borland C++ Builder已经在其6.0版中加入了对STLport的支持,它使用的STLport就是4.5版的,C++ Builder 6.0同时还提供了STLport的使用说明。你能够在C++ Builder的Include\Stlport子目录下找到全部头文件(好比:C:\Program Files\Borland\Cbuilder6\Include\Stlport)。

  1.4.5 SGI STL

  SGI STL是由Silicon Graphics Computer System, Inc公司实现的,其设计者和编写者包括Alexander Stepanov和Matt Austern,一样它也是HP STL的一个继承版本。它属于开放源码,所以你能够修改和销售它。SGI STL被GCC(linux下的C++编译器)所采用,你能够在GCC的Include子目录下找到全部头文件(好比:C:\cygnus\cygwin-b20\include\g++\include)。因为GCC对C++语言标准的支持很好,SGI STL在linux平台上的性能至关出色。此外,其源代码的可读性也很好。能够从以下网站获得更详细的状况介绍:http://www.sgi.com新版本是3.3。

图2:STL家族的谱系
相关文章
相关标签/搜索