10.5 泛型算法结构

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的算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值