C++ iostream 迭代器

来源:互联网 发布:单桂敏淘宝店铺 编辑:程序博客网 时间:2024/06/16 12:53

1、流迭代器将它们对应的流当作一个特定类型的元素序列来处理。通过使用流迭代器,我们可以用泛型算法从流对象读取数据以及向其写入数据。当创建一个流迭代器时,必须指定迭代器将要读写的对象类型。

2、istream_iterator

2.1、尾后迭代器

当我们默认初始化输入流迭代器时,就创建了一个可以当作尾后值使用的空的流迭代器,从而可以当作尾后迭代器来使用,对于一个绑定到流的迭代器,一旦其关联的流遇到文件尾或遇到 IO 错误,迭代器的值就与尾后迭代器相等。

2.2、输入流迭代器支持自增运算符  ++it,it++  使用元素类型所定义的 >> 运算符从输入流中读取下一个值。与以往一样,前置版本返回一个指向递增后迭代器的引用,后置版本返回旧值。当然流迭代器是不支持自减运算符的,道理你懂。

2.3、实例演示(istream_iterator)

2.3.1、从流迭代器范围构造 vector

#include <iostream>#include <iterator>#include <vector>using namespace std;int main(void){istream_iterator<int> in(cin),eof;vector<int> vi(in, eof);for (int i : vi) {cout << i << ends;}}

输入1 2 3 4 e(流遇到e时出现io错误,迭代器与尾后迭代器相等)

输出1 2 3 4

2.3.2、算法操作流迭代器


#include <iostream>#include <iterator>#include <numeric>using namespace std;int main(void){istream_iterator<int> in(cin),eof;cout << accumulate(in, eof,0) << endl;}
1 2 3 e
6
请按任意键继续. . .
3、ostream_iterator

3.1、我们可以对任何具有输出运算符 << 的类型定义 ostream_iterator。当创建一个 ostream_iterator 时,我们可以提供(可选的)第二参数,它是一个字符串,在输出每个元素后都会打印此字符串。此字符串必须是一个C风格字符串(即,一个字符串字面常量或者一个指向以空字符结尾的字符数组的指针)。必须将 ostream_iterator 绑定到一个指定的流,不允许空的或表示尾后位置的 ostream_iterator。

3.2、输出流迭代器存在解引用(*)自增减(++ --)运算符,但没有任何作用,每个运算符都返回它本身

3.3、实例演示(ostream_iterator)

3.3.1、

#include <iostream>#include <iterator>#include <vector>using namespace std;int main(void){    ostream_iterator<int> out(cout," ");    vector<int> vi{ 1,2,3,4 };    for (int i : vi) {        *out++ = i;    }    cout << endl;}
1 2 3 4
请按任意键继续. . .

第10行中  * 和 ++ 对流迭代器无影响,《C++primer 5th》推荐上述写法,这样写与其他迭代器的使用保持一致,如果想改为操作其他迭代器类型,也容易修改,并且对于读者来说此写法也更清晰。

3.3.2、copy打印vec中的元素

#include <iostream>#include <iterator>#include <vector>using namespace std;int main(void){ostream_iterator<int> out(cout," ");vector<int> vi{ 1,2,3,4 };copy(vi.cbegin(), vi.cend(), out);cout << endl;}
1 2 3 4
请按任意键继续. . .




0 0