流型迭代器(Stream Iterator)是一种迭代器配接器。程序员可以把流型迭代器当成算法的原点和终点。流型迭代器是特殊用途的输入型和输出型迭代器,程序通过流型迭代器能管理与I/O流相关的数据。插入型迭代器和逆向型迭代器均由迭代器适配器形成。一个输入流型(Istream)迭代器可用来从输入流中读取元素,而输出流型(Ostream)迭代器可以用来对输出流写入元素。流型迭代器的特殊形式是所谓的流缓冲区迭代器,用来对流缓冲区进行直接读取和写入操作。
(1)输出流型迭代器
输出流型迭代器可以将被赋予的值写入输出流中。其各项操作见表5-5。输出流型迭代器将赋值操作转化为运算符operator<<。算法就可以使用一般的迭代器接口直接对流执行写动作。
表5-5 输出流型迭代器的各项操作
注:delim为分隔符。
生成迭代器时,必须提供一个输出流作为参数,迭代器将会把元素写至该输出流身上。另一个参数可有可无,是个字符串,作为每个元素值之间的分隔符。分隔符的型别是const char∗。如果使用string的对象(变量),在使用时一定要使用成员函数c_str()以获得该对象的内容。例如,
流型迭代器的模板为:
其中第一个参数代表被插入至流的数据类型;第二个参数的默认值是char;第三个参数是可选的,其默认值是char_traits<CharType>。
输出流型迭代器必须满足输出型迭代器的所有要求,在算法中使用输出流型迭代器时,可以直接访问输出流。
例5-4
例5-4的执行效果如图5-5所示。
(2)输入流型迭代器
输入流型迭代器是输出流型迭代器的“伙伴”,用于从输入流中读取元素。通过输入流型迭代器,算法可以从流中直接读取元素。然而,输入流型迭代器较输出流型迭代器稍微复杂一些。
产生输入流型迭代器时,必须提供一个输入流作为参数,迭代器将从中读取数据(一般经由输入型迭代器的通用接口,利用operator>>读取元素)。读取动作可能会失败,此外算法需要知道区间是否到达终点。为了解决这些问题,可使用end-of-stream迭代器,可利用输入流型迭代器的默认构造函数生成。只要读取一次失败,所有输入流型迭代器都会变成end-of-stream迭代器。所以,每次读取结束后,应该将输入流型迭代器和end-of-stream迭代器比较,观察迭代器是否合理合法。(www.xing528.com)
输入流型迭代器的构造函数会将流打开,并读取第一个元素。在确实需要用到一个输入流型迭代器之前,不要过早定义它。上述做法是必要的,否则一旦operator∗被调用,将无法传回第一个元素。这和软件版本有关系,某些版本会延缓第一次读取操作,直到第一次operator∗被调用。输入流型迭代器的各项操作见表5-6。
图5-5 例5-4的执行效果
表5-6 输入流型迭代器的各项操作
输入流型迭代器类模板如下:
其中第一个参数是数据类型;第二个参数和第三个参数确定流的型别,第四个参数用来指定迭代器距离的表示型别。
两个输入流型迭代器相等的条件如下:
1)两者都是end-of-stream迭代器。
2)两者均可进行读取操作,并指向相同的流。
例5-5
例5-5的执行效果如图5-6所示。
图5-6 例5-5的执行效果
在例5-5中,所定义的流型迭代器的输入数据类型为int,一旦输入非int型数据时,输入即面临结束,while循环退出。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。