C++标准程序库笔记---迭代器

来源:互联网 发布:遗传算法c 实现 编辑:程序博客网 时间:2024/05/21 17:32

迭代器是一种能够遍历某个序列内所有元素的对象,它可以偷过于一般指针一直的接口来完成自己的工作,迭代器可以作为一种数据结构与算法解耦的手段使用,例如,某一算法可以通过迭代器来对顺序容器或二叉树做相同的操作。

迭代器种类:

迭代器类型能力供应者输入迭代器向前读取istream输出迭代器向前写入ostream,inserter前向迭代器向前读取和写入 双向迭代器向前和向后读取和写入list,set,multiset,map,multimap随机访问迭代器随机存取,可读取也可写入vector,deque,string,array

1. 输入迭代器

input迭代器只能一次一个向前读取元素,input跌打器只能读取元素一次。如果复制input迭代器,并使原input迭代器和新产生的副本都向前读取,可能会遍历到不同的值

纯粹input迭代器的一个典型例子就是“从标准输入装置(通常为键盘)读取数据”的迭代器。同一个值不会被读取两次。如果两个input迭代器占用同一个位置,则两者相等。但是,这并不意味着他们存取元素时就会传回相同的值。

表达式效果*iter读取实际元素iter->member读取实际元素的成员++iter向前步进(传回新位置)iter++向前步进(传回旧位置)iter1 == iter2判断两个迭代器是否相等iter1 != iter2判断两个迭代器是否不相等TYPE(iter)复制迭代器(copy构造函数)应该尽可能优先选用前置式递增操作符,因为性能更好,不需要传回旧值,所以也就不必花费一个临时对象来保存旧值。临时变量总是const的,所以后缀表达式不能做左值。

2.输出迭代器

output迭代器将元素值一个个写入,只能一个元素一个元素地赋新值,不能用output迭代器对统一序列进行两次遍历。这就好像将元素写到黑洞里,如果在相同位置上对着一个黑洞惊醒第二次写入,不能确保这次写入值会覆盖前一个值

表达式效果*iter = value将数值写到迭代器所指位置++iter向前步进(传回新位置)向前步进iter++向前步进(传回旧位置)TYPE(iter)复制迭代器(copy构造函数)
3.前向迭代器

forward迭代器是input迭代器和output迭代器的结合,具有input迭代器的全部功能和output迭代器的大部分功能

表达式效果*iter读取实际元素iter->member读取实际元素的成员++iter向前步进(传回新位置)iter++向前步进(传回旧位置)iter1 == iter2判断两个迭代器是否相等iter1 != iter2判断两个迭代器是否不相等TYPE(iter)复制迭代器(copy构造函数)TYPE()产生迭代器(default构造函数)iter1 = iter2赋值和input迭代器和output迭代器不同,forward迭代器能够多次指向同一群集(collection)中的同一元素, 并能多次处理同一元素

output迭代器无需检查是否抵达序列尾端,便可以直接写入数据,output迭代器不提供比较操作,所以不能将output迭代器和尾端迭代器想比较。

对于forward迭代器,必须在提取数据之前确保它有效,否则会发生未定义行为。

4.双向遍历器

Bidirectional迭代器在forward迭代器的基础上增加了回头遍历的能力。支持--iter和iter--操作

5.随机存取迭代器

random access爹哎器在bidirectional迭代器基础之上再增加随机存取能力。因此它必须提供“迭代器算术运算”,也就是说,它能加减某个偏移量、能处理距离问题,并能运用诸如<和>的相互关系运算操作符进行比较。

以下对象和型别支持random access迭代器

  • 可随机存取的容器(vector,deque)
  • string(字符串,string,wstring)
  • 一般array(指针)
算式效果iter[n]存取索引位置为n的元素iter += n向前跳n个元素(如果n是负数, 则向后跳)iter -= n向后跳n个元素(如果n是负数, 则向前跳)iter + n传回iter之后的第n个元素n + iter传回iter之后的第n个元素iter - n传回iter之前的第n个元素iter1-iter2传回iter1和iter2之间的距离iter1<iter2判断iter1是否在iter2之前iter1>iter2判断iter1是否在iter2之后iter1<=iter2判断iter1是否不在iter2之后iter1>=iter2判断iter1是否不在iter2之前

迭代器相关辅助函数

advance() 可将迭代器的位置增加,增加的幅度由参数决定,使迭代器一次前进或后退多个元素

#include <iterator>

void advance(InputIterator& pos, Dist n)

advance()并不检查迭代器是否超过序列的end()(因为迭代器通常不知道其所操作的容器,因此无从检查)。所以调用advance()可能导致未定义行为。

此函数总能根据迭代器类型采用最佳方案,这归功于迭代器特征(iterator traits)的运用。对于Random Access迭代器,此函数只是简单地调用pos += n,对于其他任何类型的迭代器,则调用++pos或--pos



原创粉丝点击