1.泛型算法是独立于容器的;泛型算法不执行容器操作,也绝对不会改变容器的大小;泛型算法只通过迭代器与容器联系。
2.泛型算法可分为三类:1).只读算法,只是读取迭代器范围内的值不做任何修改,例如:find find_first_of accumulate;2).写算法,不仅读取而且还会修改迭代器范围内的值,这里需要注意泛型算法不负责被写入迭代器范围大小,使用者需要自己确保空间足够,例如:fill fill_n copy replace replace_copy;3).排序算法,对迭代器范围内的数据进行排序,例如:sort stable_sort。
3.谓词(谓词函数):一些算法允许用户自定义实用函数来判断迭代器范围内的值是否满足条件,这种函数被称为谓词,谓词函数的参数个数和类型由使用它的算法和处理的数据决定。
4.插入迭代器:插入迭代器不同于普通迭代器,插入迭代器具有插入的效果,会为容器插入一个指定值。back_inserter函数会产生一个效果等同push_back的插入迭代器,需要目标容器支持push_back函数;front_inserter函数会产生一个效果等同push_front的插入迭代器,需要目标容器支持push_front函数; inserter函数会产生一个效果等同insert插入迭代器,需要目标容器支持insert函数。
5.流迭代器:ios也具有迭代器istream_iterator和ostream_iterator,其中istream_iterator只能用于读取数据,ostream_iterator只能用于写数据。流迭代器是模板,只要某一类型支持>>就可以定义istream_iterator,支持<<就可以定义ostream_iterator,流迭代器使用++操作符持续读写数据。istream_iterator定义时不提供参数则生成流末尾下一位的迭代器,ostream_iterator没有末尾可无限输出。
6.逆序迭代器:逆序迭代器与正常的迭代器正好相反,适合从尾到头访问一个容器。特别需要注意的是,逆序迭代器是右闭合,所以与正常迭代器的转换为:rbegin = end - 1,rend = begin - 1,也可以通过riter.base()来取得相对应的正常迭代器的值。
7.五种迭代器:STL中迭代器可以分为五种迭代器
名称 | 支持操作 | 举例 |
输入迭代器 | == != ++ * ->,只读(不可比较大小,不能后退) | istream_iterator |
输出迭代器 | ++ *,只写(不可比较大小,不能后退,不能判断相等) | ostream_iterator |
单项迭代器 | == != ++ * ->,读写(不可比较大小,不能后退) | |
双向迭代器 | == != ++ -- * ->,读写(不可比较大小) | list map set |
随机访问迭代器 | == != ++ -- * -> + += - -= > >= < <= [],读写(全部运算) | vector deque string |
STL中的容器的迭代器至少为双向迭代器,除了输出迭代器之外,其余四个排成一个由低到高的序列,算法要求的迭代器类型由低向高兼容。
8.list容器的迭代器是双向迭代器,不可随机访问,所以对于list不能使用很多泛型函数。所以在list中,定义了很多成员函数来补充这一空缺,比如说sort unique reverse等等,使用时需要注意。