10.5 泛型算法结构

文章目录

    • 5类迭代器
    • 算法形参模式
      • 接受单个目标迭代器
      • 接受第二个输入序列的算法
    • 算法命名规范
      • 一些算法使用重载形式传递一个谓词
      • _if版本的算法
      • 区分拷贝元素的版本和不拷贝元素的版本

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

你可能感兴趣的:(C++,数据结构,c++)