流迭代器(Stream Iterators)
1 输出流迭代器(Ostream Iterators)
输出流迭代器可以把指定的内容直接写入指定的ostream。Ostream Iterator的实现原理跟Insert Iterator非常相似,唯一的区别就是Ostream Iterator利用<<输出操作符把值输出到了ostream对象。通过流迭代器,算法就可以使用通用的迭代器接口把相应的内容输出到流对象。
下面列出了Ostream Iterator可以进行的所有操作:
操作表达式 | 作用效果 |
---|---|
ostream_iterator(ostream) | 针对ostream创建一个Ostream Iterator |
ostream_iterator(ostream, delim) | 针对ostream创建一个Ostream Iterator,同时指定输出元素之见的间隔符为delim(类型为const char *) |
*iter | No-op(just return iter) |
iter=value | 把value值输出到ostream:ostream << value (如果设置了delim分隔符,则后跟分隔符) |
iter++ | No-op(just return iter) |
++iter | No-op(just return iter) |
下面是一个使用ostream iterator的例子:
View Code
//ostriter.cpp #include <iostream> #include <iterator> #include <vector> #include <algorithm> using namespace std; int main() { //create a ostream iterator for cout stream ostream_iterator<int> iter(cout, "\n"); //write some elements to cout with ostream iterator *iter = 1; iter++; *iter = 2; iter++; *iter = 3; iter++; //define a vecotr container col1 vector<int> col1; //insert some elements into col1 for(int i = 1; i <= 9; ++i) { col1.push_back(i); } //copy all elements of col1 to standard output copy(col1.begin(), col1.end(), ostream_iterator<int>(cout)); cout << endl; //copy all elements of col1 to standard output with " < " delim copy(col1.begin(), col1.end(), ostream_iterator<int>(cout, " < ")); cout << endl; } 执行结果是: 1 2 3 123456789 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 <
2 输入流迭代器(Istream Iterators)
Istream Iterators从一个输入流(Input stream)读取元素,借助输入流迭代器,C++标准库中的算法可以直接从一个流(stream)中读取数据。
在创建一个输入流迭代器时,通常要提供一个输入流(istream)对象来进行初始化,以便从这个流中读取数据,然后就可以使用统一的迭代器接口(Interface)来逐个元素地读取流中的数据了。但是,读取元素的操作可能是会失败的(流结束或者发生错误),并且C++标准库中的很多算法是需要提供迭代器范围(half-open range)来标识元素集合。为了解决这个问题,输入流迭代器特意设计了一个特殊的Istream Iterator: end-of-stream iterator,end-of-stream iterator使用输入流迭代器的缺省构造函数来创建。当使用一个Istream Iterator来读取流时,当读取到达流结尾或者发生了错误读取失败,当前的输入流迭代器都会变成end-of-stream iterator。因此每当进行一次读取后,都应该跟end-of-stream iterator来进行比较以判断下一次读取是否有效。
通常,输入流迭代器的构造函数打开输入流并且读取第一个元素,但是在具体实现上也可能是直到第一次调用*操作符时才读取第一个元素,这依赖于具体的实现。
操作表达式 | 作用效果 |
---|---|
istream_iterator() | 创建一个end-of-stream输入流迭代器 |
istream_iterator(istream) | 为istream流对象创建一个输入流迭代器(构造函数可以设计成读取第一个元素,也可以设计成不读取,这取决于具体实现) |
*iter | 返回当前元素的值,该元素之前已经从流对象中读取(如果构造函数设计成不读取第一个元素,则在第一次进行该操作时读取第一个元素) |
iter->member | 返回当前元素的一个成员,该元素之前已经从流对象中读取 |
iter++ | 返回当前元素的iterator位置,并读取下一个元素 |
++iter | 读取下一个元素并返回它的iterator位置 |
iter1 == iter2 | 测试iter1和iter2是否相等 |
iter1 != iter2 | 测试iter1和iter2是否不相等 |
下面看一个使用输入流迭代器的例子:
View Code
//istriter.cpp #include <iostream> #include <iterator> using namespace std; int main() { //create a istream iterator for cin stream object istream_iterator<int> intReader(cin); //create a end-of-stream iterator istream_iterator<int> EndOfReader; while(intReader != EndOfReader) { cout << "once: " << *intReader << endl; cout << "agine: " << *intReader << endl; ++intReader; } } 如果输入是:1 2 3 4 f 5 6 那么执行结果是: once: 1 agine: 1 once: 2 agine: 2 once: 3 agine: 3 once: 4 agine: 4 可以看到字符f终止了输入流的读取,当intReader读取到f时,因为格式错误,intReader变成了end-of-stream iterator,所以循环退出,程序结束。