C++ STL简介
当前位置:以往代写 > C/C++ 教程 >C++ STL简介
2019-06-13

C++ STL简介

C++ STL简介

一、STL简介

STL(Standard Template Library,尺度模板库)是惠普尝试室开拓的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普尝试室事情时所开拓出来的。此刻虽说它主要呈此刻C++中,但在被引入C++之前该技能就已经存在了很长的一段时间。

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),险些所有的代码都回收了模板类和模版函数的方法,这对比于传统的由函数和类构成的库来说提供了更好的代码重用时机。在C++尺度中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。以下笔者就简朴先容一下STL各个部门的主要特点。

二、算法

各人都能取得的一个共鸣是函数库对数据范例的选择对其可重用性起着至关重要的浸染。举例来说,一个求方根的函数,在利用浮点数作为其参数范例的环境下的可重用性必定比利用整型作为它的参数类性要高。而C++通过模板的机制答允推迟对某些范例的选择,直到真正想利用模板可能说对模板举办特化的时候,STL就操作了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——你可以将所有的范例分别为少数的几类,然后就可以在模版的参数中利用一种范例替换掉同一种类中的其他范例。

STL提供了约莫100个实现算法的模版函数,好比算法for_each将为指定序列中的每一个元素挪用指定的函数,stable_sort以你所指定的法则对序罗列办不变性排序等等。这样一来,只要我们熟悉了STL之后,很多代码可以被大大的化简,只需要通过挪用一两个算法模板,就可以完成所需要的成果并大大地晋升效率。

算法部门主要由头文件<algorithm>,<numeric>和<functional>构成。<algorithm>是所有STL头文件中最大的一个(尽量它很好领略),它是由一大堆模版函数构成的,可以认为每个函数在很洪流平上都是独立的,个中常用到的成果范畴涉及到较量、互换、查找、遍历操纵、复制、修改、移除、反转、排序、归并等等。<numeric>体积很小,只包罗几个在序列上面举办简朴数学运算的模板函数,包罗加法和乘法在序列上的一些操纵。<functional>中则界说了一些模板类,用以声明函数工具。

三、容器

在实际的开拓进程中,数据布局自己的重要性不会逊于操纵于数据布局的算法的重要性,当措施中存在着对时间要求很高的部门时,数据布局的选择就显得越发重要。

经典的数据布局数量有限,可是我们经常反复着一些为了实现向量、链表等布局而编写的代码,这些代码都十分相似,只是为了适应差异数据的变革而在细节上有所进出。STL容器就为我们提供了这样的利便,它答允我们反复操作已有的实现结构本身的特定范例下的数据布局,通过配置一些模版类,STL容器对最常用的数据布局提供了支持,这些模板的参数答允我们指定容器中元素的数据范例,可以将我们很多反复而乏味的事情简化。

容器部门主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>构成。对付常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应干系。

数据布局 描写 实现头文件
向量(vector) 持续存储的元素 <vector>
列表(list) 由节点构成的双向链表,每个结点包括着一个元素 <list>
双行列(deque) 持续存储的指向差异元素的指针所构成的数组 <deque>
荟萃(set) 由节点构成的红黑树,每个节点都包括着一个元素,节点之间以某种浸染于元素对的谓词分列,没有两个差异的元素可以或许拥有沟通的序次 <set>
多重荟萃(multiset) 答允存在两个序次相等的元素的荟萃 <set>
栈(stack) 后进先出的值的分列 <stack>
行列(queue) 先进先出的执的分列 <queue>
优先行列(priority_queue) 元素的序次是由浸染于所存储的值对上的某种谓词抉择的的一种行列 <queue>
映射(map) 由{键,值}对构成的荟萃,以某种浸染于键对上的谓词分列 <map>
多重映射(multimap) 答允键对有相等的序次的映射 <map>

四、迭代器

#p#分页标题#e#

下面要说的迭代器从浸染上来说是最根基的部门,但是领略起来比前两者都要艰辛一些(至少笔者是这样)。软件设计有一个根基原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。归纳综合来说,迭代器在STL顶用来将算法和容器接洽起来,起着一种黏和剂的浸染。险些STL提供的所有算法都是通过迭代器存取元素序罗列办事情的,每一个容器都界说了其自己所专有的迭代器,用以存取容器中的元素。

迭代器部门主要由头文件<utility>,<iterator>和<memory>构成。<utility>是一个很小的头文件,它包罗了贯串利用在STL中的几个模板的声明,<iterator>中提供了迭代器利用的很多要领,而对付<memory>的描写则十分的坚苦,它以差异寻常的方法为容器中的元素分派存储空间,同时也为某些算法执行期间发生的姑且工具提供机制,<memory>中的主要部门是模板类allocator,它认真发生所有容器中的默认分派器。

五、对初学者进修STL的一点发起

对付之前不太相识STL的读者来说,上面的文字只是十分归纳综合地描写了一下STL的框架,对您领略STL的机制以致利用STL所起到的辅佐微乎甚微,这不仅是因为深入STL需要对C++的高级应用有较量全面的相识,更因为STL的三个部门算法、容器和迭代器三部门是相互牵制可能说是细密团结的。从观念上讲最基本的部门是迭代器,但是直接进修迭代器会碰着很多抽象枯燥和繁琐的细节,然而不真正领略迭代器又是无法直接进入另两部门的进修的(至少对分解源码来说是这样)。可以说,适应STL处理惩罚问题的要领是需要耗费必然的时间的,可是以此为价钱,STL取得了一种十分难堪的独立性,它通过迭代器能在尽大概少地知道某种数据布局的环境下完成对这一布局的运算,所以下刻意钻研STL的伴侣们千万不要被一时的坚苦击倒。其实STL运用的模式相对统一,只要适应了它,从一个STL东西到另一个东西,都不会有什么大的变革。

对付STL的利用,也普遍存在着两种概念。第一种认为STL的最大浸染在于充当经典的数据布局和算法课本,因为它的源代码涉及了很多详细实现方面的问题。第二种则认为STL的初志乃是为了简化设计,制止反复劳动,提高编程效率,因此应该是“应用至上”的,对付源代码则不必深究。笔者则认为阐明源代码和应用并不抵牾,通过阐明源代码也能提高我们对其应用的领略,虽然按照详细的目标也可以有差异的偏重。

最后要说的是,STL是ANSI/ISO C++尺度的一部门,所以对付一个可以有多种C++实现的进程,首先思量的应该是STL提供的模板(高效且可移植性好),其次才是各个厂商各自相应的库(高效但可移植性欠好)以及本身去编写代码(可移植性好但低效)。

    关键字:

在线提交作业