STL包含很多处理容器的非成员函数,比如:sort()、 copy()、 find()、 random_shuffle()、 set_union、 set_intersection()、 set_difference()和transform()。
对于算法函数设计,有两个主要的通用部分。首先,它们都使用模板来提供泛型;其次它们都使用迭代器来提供访问容器中数据的通用表示。
算法组
STL将算法库分为4组:
• 非修改式序列操作;
• 修改式序列操作;
• 排序和相关操作;
• 通用数字运算;
前3组在头文件algorithm中描述,第4组是专用于数值数据的,头文件numeric。
算法的通用特征
STL函数使用迭代器和迭代器区间。
template<class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);
上述声明告诉我们,去加参数必须是输入迭代器或更高级别的迭代器,而指示接错存储位置的迭代器必须是输出迭代器或更高级别的迭代器。
对算法分类的方式之一是按结果放置的位置进行分类。有些算法就地完成工作可称为就地算法,有些则创建拷贝可称为复制算法。有些算法有两个版本:就地版本和复制版本。STL的约定是,复制版本的名称将以_copy结尾。复制版本将接受一个额外的输出迭代器参数,该参数指定结果的放置位置。并返回一个迭代器,该迭代器指向复制的最后一个值的后面的一个位置。
有些函数有这样的的版本,即根据将函数应用于容器元素得到的结果来执行操作,这些版本的名称通常以_if结尾。
函数和容器方法
有时可以选择使用STL方法或STL函数。通常方法是更好的选择。首先,它更适合于特定的容器;其次,作为成员函数,它可以使用模板类的内存管理工具,从而在需要时调整容器的长度。
尽管方法通常更合适,但非方法的函数更通用,可以将它们用于数组、string对象、STL容器,还可以用它们来处理混合的容器类型。
STL通用、灵活的设计将节省大量工作。另外,STL设计者就是非常关心效率的算法人员,算法是经过仔细选择的,并且是内联的。
其它库
为复数提供的类模板:complex
随机数功能:random
vector模板类是一个容器类和算法系统的一部分,它支持面向容器的操作,如排序、插入、重新排序、搜索、将数据转移到其它容器中等。
valarray类模板是面向数值计算的,不是STL的一部分。
array是为替代内置数组而设计的,它通过提供更好、更安全的接口,让数组更紧凑,效率更高。
模板initializer_list(C++11)
模板initializer_list是C++11新增的,使用初始化列表语法将STL容器初始化为一系列值:
std::vector<double>payments ({45.33, 39.1, 16.2, 44.1});
上述的代码可行是因为容器类包含将initializer_list作为参数的构造函数。
在代码中使用initializer_list对象,必须包含头文件initializer_list。提供它的初衷是旨在能够将一系列值传递给构造函数或其它函数。