SGISTL源码阅读 算法 前言

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种,他们之间的继承关系我们之前提到过,如下图)。如果某个算法不支持这种迭代器,而却传入了,这显然是一种错误。但是我们知道迭代器的类型是一种型别参数,并不能保证能够在编译时期就被发现。

SGISTL源码阅读 算法 前言

总结

接下来让我们分析STL中的算法。