流迭代器为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; 人们经常自己编写一个,因为迭代器接口在很多方面都很有用.
流迭代器允许您将流用作源或目标,例如期望使用输入或输出迭代器的算法.
它们主要用于为基本功能提供统一的接口,因此您不需要(例如)在内存中的某些集合中创建中间结果,然后将数据从那里复制到输出文件(同样使用输入).
就它们的工作方式而言,istream_iterator通常在内部存储一个T对象.当你创建一个迭代器,它会读取(或试图)1吨来自与文件stream >> value;.operator *允许您访问该值.operator++读取下一个值.
同样,ostream_iterator在分配给文件时会将项目写入文件.由于流自动前进,operator++通常不会做任何事情(除了返回对迭代器的引用).如果你真的想深入研究细节(例如它们),你可以看一下infix_ostream_iterator我前一段时间发布的内容.
| 归档时间: |
|
| 查看次数: |
482 次 |
| 最近记录: |