STL stream_iterator

STL stream_iterator教程

STL 中的流迭代器也是一种迭代器适配器,不过和之前讲的迭代器适配器有所差别,它的操作对象不再是某个容器,而是流对象。即通过流迭代器,我们可以读取指定流对象中的数据,也可以将数据写入到流对象中。

通常情况下,我们经常使用的 cin、cout 就属于流对象,其中 cin 可以获取键盘输入的数据,cout 可以将指定数据输出到屏幕上。除此之外,更常见的还有文件 I/O 流等。

STL流迭代器分类

介于流对象又可细分为输入流对象(istream)和输出流对象(ostream),C++ STL 标准库中,也对应的提供了 2 类流迭代器:

  • 将绑定到输入流对象的迭代器称为输入流迭代器(istream_iterator),其可以用来读取输入流中的数据;
  • 将绑定到输出流对象的迭代器称为输出流迭代器(ostream_iterator),其用来将数据写入到输出流中。

STL stream_iterator头文件

说明

输入流迭代器用于直接从指定的输入流中读取元素,该类型迭代器本质上就是一个输入迭代器,这意味着假设 p 是一个输入流迭代器,则其只能进行 ++pp++*p 操作,同时输入迭代器之间也只能使用 == 和 != 运算符。

实际上,输入流迭代器的底层是通过重载 ++ 运算符实现的,该运算符内部会调用 operator >> 读取数据。也就是说,假设 iit 为输入流迭代器,则只需要执行 iit 或者 iit,即可读取一个指定类型的元素。

头文件

#include <iterator> using namespace std;

说明

stream_iterator 的模板类定义在 <iterator> 头文件,并位于 std 命名空间中。

创建流迭代器

语法一

std::istream_iterator<double> eos;

调用 istream_iterator 模板类的默认构造函数,可以创建出一个具有结束标志的输入流迭代器。要知道,当我们从输入流中不断提取数据时,总有将流中数据全部提取完的那一时刻,这一时刻就可以用此方式构建的输入流迭代器表示。

语法二

std::istream_iterator<double> iit(std::cin);

这里创建了一个可从标准输入流 cin 读取数据的输入流迭代器。值得注意的一点是,通过此方式创建的输入流迭代器,其调用的构造函数中,会自行尝试去指定流中读取一个指定类型的元素。

语法三

std::istream_iterator<double> iit2(iit1);

istream_iterator 模板类还支持用已创建好的 istream_iterator 迭代器为新建 istream_iterator 迭代器初始化,例如,在上面 iit 的基础上,再创建一个相同的 iit2 迭代器。

案例

使用stream_iterator

使用 stream_iterator 访问元素

#include <iostream> #include <iterator> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; double value1, value2; cout << "请输入 2 个小数: "; istream_iterator<double> eos; istream_iterator<double> iit(cin); if (iit != eos) { value1 = *iit; } iit++; if (iit != eos) { value2 = *iit; } cout << "value1 = " << value1 << endl; cout << "value2 = " << value2 << endl; return 0; }

我们在 Linux 下使用 g++ 进行编译,具体命令如下:

g++ istream_iterator.cpp -std=c++11

编译后,我们直接运行生成的二进制文件 a.out,如下图所示:

08_STL stream_iterator.png

我们使用了 stream_iterator 访问了元素。

STL stream_iterator总结

STL 中的流迭代器也是一种迭代器适配器,不过和之前讲的迭代器适配器有所差别,它的操作对象不再是某个容器,而是流对象。即通过流迭代器,我们可以读取指定流对象中的数据,也可以将数据写入到流对象中。