SGISTL源码阅读 算法 前言
STL有六大组件,我们已经分析了空间配置器、迭代器和容器,现在将进入对算法的学习。
STL中实现了很多极具复用价值的算法,排序(sorting
),查找(searching
),排列组合(permutation
),用于数据移动、复制、删除、比较、组合、运算等的算法。所有STL算法都作用在由迭代器[first,last)所标示出来的范围内,在进入正式分析算法之前,我们先对其整体做一个了解。
所有的数值(numeric
)算法都实现于SGI<stl_numeric.h>
中,用户必须包含上层的<numeric>
才能调用里面的算法,因为<stl_numeric.h>
是一个内部文件。其他STL算法都实现于<stl_algo.h>
和<stl_algobase.h>
文件中,它们也都是内部文件,需要使用必须包含上层相关头文件<algorithm>
。
许多STL算法不只支持一个版本,这一类算法的某个版本采用缺省运算行为,另一个版本提供额外参数,接受外界传入的一个仿函数,之后将要介绍的很多算法都有两个版本。
算法分类
我们可以将STL中的算法分为以下两类。
质变算法(mulating algorithms
)
质变算法是指运算过程中会改变迭代器所指区间的元素内容,也就是会改变操作对象的值,例如插入,删除,替换等。
质变算法也分为了两种
- in-place(就地进行版)
就地改变其操作对象 - copy(另地进行版)
将操作对象的内容复制一份副本,饭后在副本上进行修改并返回副本。(copy版总是以_copy作为函数名称尾词)
非质变算法(nomulating algorithms
)
质变算法是指运算过程中不会改变迭代器所指区间的元素内容。例如查找,遍历,比较等。
算法的泛化过程
之前学习过很多不同的容器,他们都拥有不同的数据结构,却需要进行一些类似的操作,如果针对每一个容器都制定一个不同的算法,那将会出现很多重复的代码块。之前提到过,迭代器是算法和数据结构之间的粘合剂,我们通过将操作对象的型别加以抽象化,把操作对象的标示法和区间目标移动行为抽象化,整个算法就在一个抽象的层面上工作, 而不用考虑其数据结构,这样的过程就是泛型化。
每一个STL算法的声明,都表现出它所需要的最低程度的迭代器类型,也可以接受更高类型(继承最低程度的迭代器类型)的迭代器。(迭代器有5种,他们之间的继承关系我们之前提到过,如下图)。如果某个算法不支持这种迭代器,而却传入了,这显然是一种错误。但是我们知道迭代器的类型是一种型别参数,并不能保证能够在编译时期就被发现。
总结
接下来让我们分析STL中的算法。