5类迭代器
算法基本特性是它要求其迭代器提供哪些操作。算法所要求的迭代器操作可分为5个迭代器类别。(366)
类型 | 说明 |
---|---|
输入迭代器 | 只读不写,单遍扫描,递增。需要有相等、递增、解引用运算符。输入迭代器只用于单遍扫描的顺序访问算法,如find和accumulate中。istream_iterator是输入迭代器。 |
输出迭代器 | 只写不读,单遍扫描,递增。需要递增和解引用运算符。只用于单遍扫描算法,如copy的第三个参数。ostream_iterator是输出迭代器。 |
前向迭代器 | 可读写,多遍扫描,递增。支持所有输入输出迭代器操作,沿一个方向运动,可以多次读写同一个元素,保存前向迭代器的状态,并对序列进行多次扫描,如replace(string中的函数)中需要。forward_list上的迭代器是前向迭代器。 |
双向迭代器 | 可读写,多遍扫描,可递增递减。支持前向迭代器操作,此外还支持递减,reverse中需要。除forward_list外其他容器迭代器。 |
随机访问迭代器 | 可读写,多遍扫描,支持全部迭代器运算,包括比较关系、与整数加减换算迭代器位置,两个迭代器求距离,下标运算符等。提供常量时间内访问序列中任意元素的能力,sort中需要。array、deque、string、vector、访问内置元素的指针的迭代器。 |
算法形参模式
大多数算法具有以下4种形式:
> alg(beg,end,other args);
> alg(beg,end,dest,other args);
> alg(beg,end,beg2,other args);
> alg(beg,end,beg2,end2,other args);
接受单个目标迭代器
dest参数是一个表示算法可以写入的目的位置的迭代器。(算法假定:按其需要写入数据,不管写入多少个元素都是安全的。)
向输出迭代器写入数据的算法都假定目标空间足够容纳写入的数据。
如果dest是一个直接指向容器的迭代器,那么算法将输出数据写到容器中已存在的元素内。更常见的情况是,dest被绑定到一个插入迭代器或是一个ostream_ iterator。插入迭代器会将新元素添加到容器中,因而保证空间是足够的。ostream_ iterator会将数据写入到一个输出流,同样不管要写入多少个元素都没有问题。
接受第二个输入序列的算法
接受单独beg2的算法假定从beg2开始的序列与beg和end所表示的范围至少一样大。
算法命名规范
一些算法使用重载形式传递一个谓词
unique(beg,end);
unique(beg,end,comp);
_if版本的算法
find(beg,end,val);//查找范围中第一次val出现的位置。
find_if(beg,end,pred);//查找第一个让pred为真的元素。
区分拷贝元素的版本和不拷贝元素的版本
某些函数提供另外一个版本,一般是重排算法,将元素写道一个指定的输出目的位置。这种函数会在名字后边加上_copy:
reverse(beg,end);
reverse_copy(beg,end,dest);
甚至也还存在reverse_copy_if的算法