C++ primer plus 第16章string 类和标准模板库, 算法
C++ primer plus 第16章string 类和标准模板库, 算法
16.6 算法
STL包含很多处理容器的非成员函数,前面已经介绍过其中的一些:sort()、copy()、find()、random shufe()、set union()、set intersection()、set difference()和transform()。可能已经注意到,它们的总体设计是相同的,都使用迭代器来标识要处理的数据区间和结果的放置位置。有些函数还接受一个函数对象参数,并使用它来处理数据。
对于算法函数设计,有两个主要的通用部分。首先,它们都使用模板来提供泛型;其次,它们都使用迭代器来提供访问容器中数据的通用表示。因此,copy()函数可用于将double 值存储在数组中的容器、将string 值存储在链表中的容器,也可用于将用户定义的对象存储在树结构中(如set所使用的)的容器。因为指针是一种特殊的迭代器,因此诸如copy()等STL函数可用于常规数组。
统一的容器设计使得不同类型的容器之间具有明显关系。例如,可以使用copy()将常规数组中的值复制到 vector 对象中,将 vector 对象中的值复制到 list 对象中,将 list 对象中的值复制到 set 对象中。可以用来比较不同类型的容器,如 deque 和 vector。之所以能够这样做,是因为容器重载的运算符使用迭代器来比较内容,因此如果 deque 对象和 vector 对象的内容相同,并且排列顺序也相同,则它们是相等的。
16.6.1 算法组
STL将算法库分成4组:
- 非修改式序列操作;
- 修改式序列操作;
- 排序和相关操作:
- 通用数字运算。
前3组在头文件 algorithm(以前为 algo.h)中描述,第4组是专用于数值数据的,有自己的头文件,称为 numeric(以前它们也位于algol.h中)。
非修改式序列操作对区间中的每个元素进行操作。这些操作不修改容器的内容。例如,find()和for each()就属于这一类。
修改式序列操作也对区间中的每个元素进行操作。然而,顾名思义,它们可以修改容器的内容。可以修改值,也可以修改值的排列顺序。transform()、random_shume( )和 copy( )属于这一类。
排序和相关操作包括多个排序函数(包括sort())和其他各种函数,包括集合操作。数字操作包括将区间的内容累积、计算两个容器的内部乘积、计算小计、计算相邻对象差的函数。通常,这些都是数组的操作特性,因此vector是最有可能使用这些操作的容器。