【问题标题】:C++ Input IteratorC++ 输入迭代器
【发布时间】:2016-02-06 22:17:57
【问题描述】:

我正在阅读C++ Standard(部分输入迭代器),我很难将文本以粗体显示:

注意:对于输入迭代器,a == b 并不意味着 ++a == ++b。 (平等不保证替代 属性或引用透明度。)输入迭代器上的算法永远不应该尝试通过 通过相同的迭代器两次。它们应该是单通道算法。

我知道输入迭代器是单通道的,但我似乎无法在 C++ 代码中对其进行可视化。有人可以举例说明如何使迭代器成为单通道吗?

【问题讨论】:

  • “如何让迭代器变成单通”是什么意思?为什么他们是单程的?或者如何使用这样的迭代器?
  • 我不确定你在问什么。迭代器就是它们。他们不会“变成”任何东西。您是否在询问不是多遍的迭代器的示例?如果是这样,请考虑从stdin
  • @Revolver_Ocelot 抱歉不清楚,我想从头开始创建输入迭代器(不使用 STL 或 boost)进行学习。我只是不知道如何让我的输入迭代器类成为单通道(强制单通道)?据我了解,将迭代器作为输入或转发迭代器是底层容器或流 (stdin) 的工作,对吗?
  • 您不会强制迭代器单次通过,这通常是副作用,例如从读取输入一次并丢弃以前的值。
  • @ManiH。输入迭代器不强制单次通过。如果您尝试进行第二次传递,它们将无法按预期工作:流迭代器只会从流中读取下一个条目而不是返回较早的值,移动迭代器可能会在第二次传递时调用未定义的行为,等等。

标签: c++ iterator input-iterator


【解决方案1】:

假设您想从标准输入中读取整数。一种方法是使用

#include <iterator>
#include <iostream>
#include <vector>

using namespace std;

const vector<int> v{istream_iterator<int>{cin}, istream_iterator<int>{}};

这会将整数读入v(参见istream_iterator)。

在这种情况下,迭代器将是单次传递是很有意义的,因为范围是在用户输入内容时动态创建的,并且每个元素都被消耗和消失。你不能重复这个范围。


除此之外,不太清楚你的意思是什么

如何让迭代器变成单通?

  • 如果您的意思是“如何表示您正在编写的迭代器类具有此限制?”,则将其 iterator_category 设置为 input_iterator_tag

    struct my_iterator
    {
        using iterator_category = input_iterator_tag;
    };
    
  • 如果要(在编译时)查询迭代器类是否有此限制,请使用iterator_traits

【讨论】:

  • 前向迭代器是多通道的,你的意思是input_iterator_tag 吗?
  • @M.M 我需要多次感谢您的有用评论。非常感谢!
  • @AmiTavory 抱歉不清楚,我想从头开始创建输入迭代器(不使用 STL 或 boost)进行学习。我只是不知道如何使我的输入迭代器类成为单通道(强制单通道)?据我了解,将迭代器作为输入或转发迭代器是底层容器或流 (stdin) 的工作,对吗?
  • @ManiH。不完全——迭代器的工作是通知其他人它的功能是什么。建议你看一下this tutorial,我觉得挺好的。
猜你喜欢
  • 2014-01-20
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多