c++标准库泛型算法(二)
划分与排序算法
对于序列中的元素进行排序,排序和划分算法提供了多种策略。
每个排序和划分算法都提供稳定和不稳定版本。稳定算法保证保持相等元素的相对顺序。由于稳定算法会做更多的工作,可能比不稳定版本慢得多,并消耗更多内存。
划分算法
一个划分算法将输入范围中的元素分为两组。第一组包含满足给定谓词的元素,第二组包含不满足谓词的元素。这些算法都要求双向迭代器。
1 | //若所有满足unaryPred的元素都在不满足unaryPred的元素之前,则返回true,若序列为空也返回true。 |
排序算法
这些算法要求随机访问迭代器。每个都提供两个重载的版本。一个用”<”来比较,另一个版本接受一个额外参数来指定排序关系。
partial_sort和nth_element算法都只进行部分重排工作,其效率比重排整个序列要高。
1 | //重排整个范围。 |
通用重排操作
这些算法重排输入序列中元素的顺序。remove与unique会重排序列,使得排在序列第一部分的元素满足某种标准,它们返回一个迭代器,标记子序列的末尾。
而其他的一些算法会重排整个输入序列。
使用正向迭代器的重排算法
这些重排算法要求其迭代器是正向迭代器。
1 | //从序列中删除元素,采用的方式是用保留的元素覆盖要删除的元素,删除"=="val或满足unaryPred的元素。 |
使用双向迭代器的重排算法
这些算法要反向处理数据,因此需要双向迭代器。
1 | //翻转序列中的元素。revese返回void,revese_copy返回一个迭代器,指向拷贝到目的序列的尾后位置。 |
使用随机访问迭代器的重排算法
以下算法使用随机重排元素,所以要求随机迭代器。
1 | //混洗输入序列中的元素。 |
排列算法
排列算法生成序列的字典排序。这些算法假定序列中的元素是唯一的。
为了生成排列,须使用双向迭代器。
1 | //如果第二个序列的某个排列和第一个序列具有相同数目的元素,且元素都相等,则返回true。 |
有序序列的集合算法
这些算法实现了有序序列上的一般集合操作。这些算法与标准库set容器不同。这些算法提供了普通顺序容器(vector,list等)或其他序列(输入流等)上的类集合行为。
这些算法顺序处理元素,因此要求输入迭代器。他们还接受一个表示目的序列的输出迭代器,唯一例外是includes。这些算法返回递增后的dest迭代器,表示写入dest的最后一个元素之后的位置。
每种算法都有重载版本,第一个使用”<”,第二个使用给定的比较操作。
1 | //如果第二个序列中的每个元素都包含在输入序列中,则返回true,否则返回false。 |
最小值和最大值
这些算法使用”<”或给定的比较操作。第一组算法对值而非序列进行操作。第二组算法接受一个序列。
要求输入迭代器。
1 | //返回val1、val2中最小/大值,或init_list中的最小/大值。 |
字典序比较
此算法比较两个序列,根据第一对不相等的元素的相对大小来返回结果。算法使用”<”或给定的比较操作。两个序列都要求输入迭代器。
1 | //若第一个序列·在字典序中小于第二个序列,则返回true,若否返回false。 |
数值算法
这些算法都定义在头文件numeric中。要求输入迭代器;若算法输出数据,则使用输出迭代器表示目的位置。
1 | //返回输入序列中所有元素之和,和的初值由init指定,init须与序列元素的类型相同。 |
参考资料
C++primer中文版(第五版) 电子工业出版社。