泛型算法(3)——迭代器

ぃ、小莉子 提交于 2020-03-04 05:27:32

迭代器

除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额为几种迭代器,包括以下几种

插入迭代器

绑定到一个容器上,可用来向容器插入元素

流迭代器

绑定到输入或输出流上,可用来遍历所关联的IO流

反向迭代器

向后而不是向前移动,除了forward_list之外的标准库都有反向迭代器

移动迭代器

不是拷贝其中的元素,而是移动它们

1、插入迭代器

back_inserter

front_inserter

inserter

只有在容器支持push_front的情况下,才可以使用front_inserter。同理,

只有在容器支持push_back的情况下,才可以使用back_inserter。

插入迭代器操作

it=t

在it指定的当前位置插入值t

*it,++it,it++

不会对it做任何事情

 

2、iostream迭代器

标准库定义了可以用于IO类型对象的迭代器

istream_iterator读取输入流;ostream_iterator向一个输出流写入数据。

通过使用流迭代器,可以用泛型算法从流对象读取数据以及向其写入数据.

istream_iterator操作

istream_iterator<T> in(is)

in从输入流is读取类型为T的值

istream_iterator<T> end

读取类型为T的值的istream_iterator迭代器,表示尾后位置

in1==in2

in1和in2必须读取相同类型。如果它们都是尾后迭代器,或绑定到相同的输入,则两者相等。

in1 != in2

*in

返回从流中读取的值

in->men

等价于 (*in).men

++in,in++

前缀版本使用迭代器在流中向前移动,并返回对加 1   后的迭代器的引用。而后缀版本使迭代器在流中向前移动后,返回原值

 

ostream_iterator 对象必须与特定的流绑定在一起,不允许空的或表示尾后位置的ostream_iterator

otream_iterator操作

ostream_iterator<T> out(os)

out将类型为T的值写到输出流os中

istream_oterator<T> out(os,d)

out将类型为T的值都写到输出流os中,每个值后面都输出一个d。d指向一个空字符结尾的字符数组

out=val

用<<运算符将val写入到out所绑定的ostream中。val的类型必须与out可写的内容兼容。

*out,++out,out++

存在但不对out做任何事情,每个运算符都返回out

 

3、反向迭代器

在容器中从尾元素向首元素反向移动的迭代器,递增(以及递减)操作的含义会颠倒过来。除了forward_list之外,其他容器都支持反向迭代器。

反向迭代器需要递减运算符。

调用reverse_iterator的base成员可以将反向迭代器返回其对应的普通迭代器。

算法要求的迭代器操作分为五个类别,分别对应表列出的五种迭代器。

迭代器种类

Input  iterator(输入迭代器)

读,不能写;只支持自增运算

Output  iterator(输出迭代器)

写,不能读;只支持自增运算

Forward  iterator(前向迭代器)

读和写;只支持自增运算

Bidirectional  iterator(双向迭代器)

读和写;支持自增和自减运算

Random  access iterator(随机访问迭代器)

读和写;支持完整的迭代器算术运算

 

1、输入迭代器可用于读取容器中的元素,但是不保证能支持容器的写入操作。输入迭代器必须至少提供下列支持。

  •  相等和不等操作符(==,!=),比较两个迭代器;
  • 前置和后置的自增运算(++),使迭代器向前递进指向下一个元素;
  • 用于读取元素的解引用操作符(*),此操作符只能出现在赋值运算的右操作数上。
  • 箭头操作符(->),这是 (*it).member 的同义语,也就是说,对迭代器进行解引用来获取其所关联的对象的成员。

 

2、输出迭代器可视为与输入迭代器功能互补的迭代器;输出迭代器可用于向容器写入元素,但是不保证能支持读取容器内容。输出迭代器一般用作算法的第三个实参,标记起始写入的位置。输出迭代器要求:

  • 前置和后置的自增运算(++),使迭代器向前递进指向下一个元素。
  • 解引用操作符(*),引操作符只能出现在赋值运算的左操作数上。给解引用的输出迭代器赋值,将对该迭代器所指向的元素做写入操作。

 

3、前向迭代器 用于读写指定的容器。这类迭代器只会以一个方向遍历序列。前向迭代器支持输入迭代器和输出迭代器提供的所有操作,除此之外,还支持对同一个元素的多次读写。

 

4、双向迭代器 从两个方向读写容器。除了提供前向迭代器的全部操作之外,双向迭代器还提供前置和后置的自减运算(--)。

 

5、随机访问迭代器 提供在常量时间内访问容器任意位置的功能。这种迭代器除了支持双向迭代器的所有功能之外,还支持下面的操作:

  • 关系操作符 <、<=、> 和 >=,比较两个迭代器的相对位置。
  • 迭代器与整型数值 n 之间的加法和减法操作符 +、+=、- 和 -=,结果是迭代器在容器中向前(或退回)n 个元素。
  • 两个迭代器之间的减法操作符(--),得到两个迭代器间的距离。
  • 下标操作符 iter[n],这是 *(iter + n) 的同义词。

 

除了输出迭代器,其他类别的迭代器形成了一个层次结构:需要低级类别迭代器的地方,可使用任意一种更高级的迭代器。对于需要输入迭代器的算法,可传递前向、双向或随机访问迭代器调用该算法。调用需要随机访问迭代器的算法时,必须传递随机访问迭代器。

 

map、set 和 list 类型提供双向迭代器,而 string、vector 和 deque 容器上定义的迭代器都是随机访问迭代器都是随机访问迭代器,用作访问内置数组元素的指针也是随机访问迭代器。istream_iterator 是输入迭代器,而ostream_iterator 则是输出迭代器。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!