STL(Standard Template Library)是C++提供的一组类模板,其中包含容器,迭代器,函数对象和算法。
容器(Container):用于保存一组数据的单元;迭代器(Iterator):用于在容器中移动以指向其中的不同数据,可类比于指针;函数对象(Function Objects):作用类似于函数的对象,可以使类对象或函数指针、函数名(函数名起函数指针的作用);算法(Algorithm):用于操作容器中数据的非成员函数。
①使用模板来支持广泛的数据类型;②使用迭代器来操作容器的对象。
这体现的是算法与数据分离的泛型程序设计思想。因为容器可以容纳各种数据类型,而算法与容器分离,因此算法和容器相互独立,在改变或增添容器或算法时,只需改变自身部分。
因为指针本身就是一种迭代器,所以算法也可以运用于内置数组。
STL将算法分成以下几类:
非修改性序列操作(Nonmodifying Sequence Operation ):如find(),for_each()。修改性序列操作(Mutating Sequence Operation):如transform(),random_shuffle(),copy()。排序和关系操作(Sorting and Relation Operation):如sort()。通用数字操作(Generalized Numeric Operation):如计算部分和,相邻元素之差的算法。前三类在头文件algorithm中描述,第四种在头文件numeric中描述。
从算法的操作结果去向来看可以分成两种:
就地算法(in-place algorithm):在输入容器中操作而不返回,如sort();复制算法(copying algorithm):不改变输入参数,将操作结果保存至输出容器中并返回一个迭代器,该迭代器指向复制的最后一个值的下一个位置,如copy()。但是有些算法可以可以同时改变输入容器并返回改变的结果。
在就地算法名后加上_copy可以使用对应的复制算法版本,例如:
template <class ForwardIterator, class T> void place (ForwardIterator first, ForwardIterator last, const T & old_value, const T & new_value);是就地算法,而
template <class InputIterator ,class OutputIterator, class T> OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T & old_value, const T & new_value);则是复制算法,结果会被复制到result中。
另外若在就地函数后面加入_if则根据条件判断是非复制,例如:
template <class ForwardIterator, class Predicate, class T> void place (ForwardIterator first, ForwardIterator last, Predicate pred, const T & old_value, const T & new_value);若函数应用于old_value的结果是true,则进行复制。
未完待续...