iostream迭代器是如何工作的
How do iostream iterators work?
从标准模板库中,我了解了istream
和ostream
迭代器。我不明白它们是怎么工作的。
我也不明白为什么要使用它们。为什么它们有用?
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"));
Ouput流迭代器在被分配给时执行它们的工作;其他操作不是操作。
有趣的是,没有一个流迭代器包装getline
;人们经常自己编写迭代器,因为迭代器接口在很多方面都很有用。
Stream迭代器允许您使用流作为某种算法的源或目标,该算法希望使用输入或输出迭代器。
它们主要用于为基本功能提供一个统一的接口,因此您不需要(例如)在内存中的某个集合中创建中间结果,然后将数据从那里复制到输出文件(输入也是如此)。
就它们的工作方式而言,istream_iterator通常在内部存储一个T对象。创建迭代器时,它从具有stream >> value;
的文件中读取(或尝试)一个T。operator *
允许您访问该值。operator++
读取下一个值。
类似地,当你分配给一个ostream_iterator时,它会向文件中写入一个项。由于流是自动前进的,operator++
通常不会真正做任何事情(除了返回对迭代器的引用)。如果你真的想深入研究细节(比如它们),你可以看看我不久前发布的infix_ostream_iterator
。
实际上,流迭代器本身并不有用。在迭代器上运行一组算法会使它们变得有用。
作为一个例子来展示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_iterator
和ostream_iterator
允许您在一行中编写相同的代码:
copy(istream_iterator<int>(fin), istream_iterator<int>(), ostream_iterator<int>(cout, "n"));
这避免了临时存储和潜在的循环条件错误(例如,如果要写入<=
而不是<
)。
由于标准算法使用迭代器,因此istream
s和ostream
s的迭代器允许使用具有许多常见算法的流。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个