C++中的STL简介及使用说明

一、C++中的STL的简介


引言:作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。

           这篇博客的目的是传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,倒也是件让人愉快的事情。


1、一个最关心的问题:什么是STL?

全称为  Standard Template Library  ,即标准模板库。

坦率的讲:要指望用短短数言将这个问题阐述清楚,绝非易事。

STL是Standard Template Library的缩写,即标准模板库,是一个具有工业强度的,高效的C++标准程序库。

它是ANSI/SO C++标准中最新的也是最具革命性的一部分。

该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们 提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象类似于Microsoft Visual c++中的MFC(Microsoft Foundation Library),或者是Borland C++ Builder中的VCL(Visual Component Library),对于此二者,大家一定不会陌生吧。

从逻辑层次来看,在STL中体现了泛型化程序设计的思想,引入了诸多的新名词,比如像需求、概念、模型、容器、算法、迭代器等。泛型也是一种软件复用技术。

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


2、追根溯源:STL的历史

被誉为STL之父的Alexander Stepanov,出生于苏联莫斯科,早在20世纪70年代后半期,他便开始考虑,在保证效率的前提下,将算法从诸多具体应用中抽象出来的可能性,这便是后来泛型化思想的雏形。

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)的抽象。  

经过长时间的努力,最终,信念与汗水所换来的是一个包含有大量数据结构和算法部件的庞大运行库。这便是现在的STL的雏形(同时也是STL的一个实现版本--HP STL)。   

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

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

二、STL的使用及使用说明

1、什么时候用STL?

    如果,有的时候,你要在程序中用到堆、栈、队列、链表等一些基本的算法,而你又实在不想自己去实现数据结构教科书中那些繁琐的算法,那么你就可以考虑使用STL。

    另外,STL作为一种标准,便于交流,掌握它,一方面可以让你写的程序,易于让别人理解,另一方面你也能够比较容易地理解别人写的程序。


2、STL六大组件:

1、容器(containers:各种数据结构,如vector, list, deque, set, map,用来存放数据 。STL容器是一种class template

2、算法(algorithms:各种常用的算法入如sort, search, copy, erease...STL算法是一种function template

3、迭代器(iterators:扮演容器与算法之间的胶合剂,是所谓的“泛型编程”。它主要是对与指针相关操作予以重载的class template。原生指针也是一种迭代器。

4、仿函数(functors):行为类似函数,可作为算法的某种策略。仿函数是一种重载了operator{}classclass template。一般的函数指针可视为狭义的仿函数。

5、配接器(adapters:一种用来修饰容器或仿函数或迭代器接口的东西。大陆也叫适配器,例如常见的stack, queue等。

6、配置器(attocators):也叫空间接线器,负责空间配置与管理。配置器是一个实现了都能动态空间配置、空间管理、空间释放的class template


3、STL中几个重要的概念

        容器:可以把它理解为存放数据的地方,常用的一些容器有 链表(list) 栈(stack) 动态数组 (vector) 双端队列(deque) 队列(queue) 映射(map)。

        游标(iterator):可以把它理解为指针类型,STL中的许多函数需要用到它们作为参数。

        算法:它们通常需要与容器和游标配合使用,使用它们,你可以方便地对容器中的数据进行各种常见的操作,如排序操作,寻找最大元素的操作等。


4、容器模板的使用

大致有下面六个步骤:

        1.添加相应的头文件(如 #include <list> )( 注意,没有 .h )

        2.添加std命名空间(用 using namespace std; )

        3.赋予模板具体的使用类型(如 typedef list<string> LISTSTR; )

        4.实例化模板(如 LISTSTR test; )

        5.实例化游标(如 LISTSTR::iterator i; )

        6.通过迭代器对象访问模板对象,例如

            // 逐个输出链表test中的元素
            for ( i =  test.begin(); i != test.end(); ++i )
                cout << *i << " ;


5、容器模板中的常用函数

    assign()           赋值

   empty()            容器为空则返回非0值

   erase()            删除指定位置或指定范围内的元素

   push_front()   从容器头部插入元素  

   push_back()   从容器尾部插入元素

   pop_front()     删除第一个元素

   pop_back()     删除最后一个元素

   back()              返回最后一个元素的引用

   front()              返回第一个元素的引用

   begin()             返回指向第一个元素的游标 (与迭代器配合使用)

   end()                返回指向最后一个元素的后一个位置的游标(最后一个元素再加1)(与迭代器配合使用) 

 

三、STL六大组件之间的交互关系以及一些名词解释

(1)、容器通过配置器取得数据存储空间,算法通过迭代器存取容器里面的内容,仿函数可以协助算法完成不同的策略变化,配接器可以完成套接仿函数。

(2)、一些名词解释:

1、GNU: 代表GNU is Not Unix(最著名的软件包括EmassGCC)

2、GPL:广泛开放授权,GNU以所谓的GPL来保护或者说控制其成员。使用者可以自由阅读与修改GPL软件的源代码,但如果使用者要传播借助GPL软件而完成的软件,他们也必须同一GPL的规范。

3、Cygnus是一家商业公司,为GCC提供资金的支持,但并不控制GCCEGCS是维护GCC的唯一官方机构。

4、HP实现版本:时所有STL实现版本的始祖,每一个HP STL头文件都有如下一份声明,允许任何人免费使用、拷贝、修改、传播、贩卖这份软件及其说明文件,唯一需要遵守的是,必须在所有文件中加上HP的版本声明和运用权限声明。这种授权并不属于GUN GPL范畴,但属于open source 范畴。

5、PJ STL版本继承自HP版本,所以它在每一个头文件都有HP的版本声明,此外还加上PJ Plauger的个人版权声明。这个版本既不属于open source范畴,更不是GNU GPL。这也是合法的。

6、还有很多版本,不做一一说明。

7、STL标准头文件是无扩展名的。C++  Standard定案前,HP规范的STL头文件是带有扩展名的(扩展名.h

8、常见编译器:VC6 ,CB4GCC等。

    


   





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值