iostream迭代器如何工作?

时间:2014-01-02 18:45:51

标签: c++ c++11 iterator iostream

从标准模板库中我了解了istreamostream迭代器。我无法理解它们是如何工作的。

我也不明白为什么使用它们。为什么它们有用?

4 个答案:

答案 0 :(得分:8)

流迭代器为iostream的格式化提取/插入操作提供迭代器接口。例如,请考虑以下事项:

std::vector<int> v;

for (int n; std::cin >> n; )
    v.push_back(n);

这相当于:

std::vector<int> v(std::istream_iterator<int>(std::cin), 
                   std::istream_iterator<int>{});

推进迭代器执行一次提取,类似于std::cin >> n;如果提取失败,则迭代器采用奇异状态,这也是默认构造的迭代器的状态。

就其本质而言,这些流迭代器是单通道,即最弱的迭代器:你只能访问“范围”中的每个元素一次,永远不会回去;从同一个流构建的两个非结束迭代器比较相等,尽管对于解除引用的值没有任何意义。 (但请注意,如果你没有取消引用迭代器,那么是否会尝试第一次提取是否存在奇怪的缺乏特异性。)

为了完整性,输出流迭代器可以类似地用于将流转换为“容器”,对于使用迭代器的算法非常有用:

std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));

输出流迭代器在分配时执行其工作;其他操作都是无操作。


有趣的是,没有包含getline的流迭代器;人们经常自己写一个,因为迭代器接口在很多方面都很有用。

答案 1 :(得分:5)

流迭代器允许您将流用作源或目标,例如期望使用输入或输出迭代器的算法。

它们主要用于为基本功能提供统一的接口,因此您不需要(例如)在内存中的某些集合中创建中间结果,然后将数据从那里复制到输出文件(同样有输入)。

就它们的工作方式而言,istream_iterator通常在内部存储一个T对象。创建迭代器时,它会使用stream >> value;从文件中读取(或尝试)一个T. operator *可让您访问该值。 operator++读取下一个值。

同样,ostream_iterator在分配给文件时会将项目写入文件。由于流自动前进,operator++通常不会做任何事情(除了返回对迭代器的引用)。如果你真的想深入研究细节(例如它们),你可以看一下我前一段时间发布的infix_ostream_iterator

答案 2 :(得分:2)

实际上,流迭代器本身并没有用。在迭代器上运行一组算法会使它们变得有用。

答案 3 :(得分:1)

举例说明Kerrek和Jerry已经说过:

而不是写这样的东西:

std::vector<int> vInts;
int n;
while (fin >> n) // where fin is an open ifstream
    vInts.push_back(n);
// ...
for (int i = 0; i < vInts.size(); ++i)
    cout << vInts[i] << endl;

istream_iteratorostream_iterator允许您编写在同一行中执行相同操作的代码:

copy(istream_iterator<int>(fin), istream_iterator<int>(), ostream_iterator<int>(cout, "\n"));

这可以避免临时存储和潜在的循环条件错误(例如,如果您要编写<=而不是<)。

由于标准算法使用迭代器,因此使用istreamostream的迭代器可以使用具有许多常用算法的流。

相关问题