iostream迭代器如何工作?

Lev*_* 31 8 c++ iterator iostream c++11

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

我也不明白他们为什么被使用.它们为什么有用?

Ker*_* SB 8

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

std::vector<int> v;

for (int n; std::cin >> n; )
    v.push_back(n);
Run Code Online (Sandbox Code Playgroud)

这相当于:

std::vector<int> v(std::istream_iterator<int>(std::cin), 
                   std::istream_iterator<int>{});
Run Code Online (Sandbox Code Playgroud)

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

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

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

std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));
Run Code Online (Sandbox Code Playgroud)

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


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


Jer*_*fin 5

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

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

就它们的工作方式而言,istream_iterator通常在内部存储一个T对象.当你创建一个迭代器,它会读取(或试图)1吨来自与文件stream >> value;.operator *允许您访问该值.operator++读取下一个值.

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