c++标准库泛型算法(一)
介绍
标准库并未给每个容器定义成员函数来实现各种操作,而定义了一些泛型算法,其实现了一些算法的公共接口。
大部分泛型算法被定义在头文件algorithm中。还在头文件numeric中定义了一些数值相关的泛型算法。
下文简单介绍了标准库中的算法,在下面的描述中:
- beg和end表示元素范围的迭代器。
- beg2是表示第二个输入序列开始位置的迭代器。end2表示第二个输入序列的末尾位置。若没有end2则假定beg2表示的序列与beg和end表示的序列一样大。beg与beg2的数据类型不必相同,但必须保证对两个序列中的元素都可以执行相同的操作。
- dest表示目的序列的迭代器。算法生成多少数据其大小必须保证保存相同的元素。
- unaryPred和binaryPred表示一元和二元谓词,分别接受一个和两个参数,都是来自输入序列中的元素,两个谓词都返回可用作条件的类型。
- comp是一个二元谓词,满足关联容器中对关键字序的要求。详情可观看谓词。
- unaryOp和binaryOp是可调用对象(lambda表达式或bind),可分别使用来自输入序列的一个两个实参来调用。
查找对象的算法
这些算法在一个输入序列中搜索一个指定值或一个值的序列。
每个算法都提供两个重载版本,第一个版本使用底层运算符(==)来比较元素;第二个版本使用用户给定的unaryPred和binaryPred(一元谓词与二元谓词)比较元素。
简单查找
这些算法查找指定值,要求输入迭代器。
1 | //返回一个迭代器,指向输入序列中第一个等于val的元素,在未找到时返回end。 |
查找重复值
以下算法要求正向迭代器,在输入序列中查找重复元素。
1 | //返回指向第一对相邻重复元素的迭代器。若序列中不存在,则返回end。 |
查找子序列算法
以下算法中除了find_fist_of用输入迭代器表第一序列,正向迭代器表第二个序列之外都要求两个正向迭代器。
1 | //返回第二个子序列在第一个序列中出现的位置。若不存在返回end1。 |
其他只读算法
以下算法要求输入迭代器
1 | //对序列中每个元素应用unaryPred,unaryPred返回值被忽略。若迭代器允许通过解引用向序列中写入,则可能修改元素。 |
二分搜索算法
这些算法都要求正向迭代器,但也可以提供随机访问迭代器会使其性能更好。
这些算法要求序列元素是有序的。默认使用”<”来检测或comp(x, y)成功。
1 | //返回一个迭代器,表第一个小于等于val的元素,若不存在返回end。 |
写容器算法
许多算法向给定序列中的元素写入新值。这些算法可以通过表示输入序列的迭代器类型来区分;或通过写入输入序列中的元素还是写入给定的位置来区分。
只写不读
这些算法要求一个输入迭代器,表目的位置。_n结尾的版本接受第二个实参表写入的元素数目,并将给定数目的元素写入到目的位置中。
1 | //给输入序列中每个元素赋一个新值。fill将val赋予元素;generate执行生成器对象Gen()生成新值。生成器是一个可调用对象。 |
使用输入迭代器的写算法
这些算法读取一个输入序列,将值写入到一个输出序列中。其要求一个名为dest的输出迭代器,表输入范围的迭代器必须是输入迭代器。
1 | //从输入范围将元素拷贝到dest指定的序列中。 |
使用正向迭代器的写算法
这些算法要求正向迭代器,由于它们要向序列中写入元素,迭代器必须有写入元素的权限。
1 | //交换iter1和iter2所表达的元素,或将输入范围中所有元素与beg2开始的第二个序列中所有元素进行交换。两个范围不能重叠。 |
使用双向迭代器的写算法
这些算法需要在序列中有反向移动的能力,以此其要求双向迭代器。
1 | //从输入范围中拷贝或移动元素到指定位置。与其他算法不同,dest是输入序列的尾后迭代器。 |
参考资料
C++primer中文版(第五版) 电子工业出版社。