输入迭代器的例子,其中`end()`实际上表示一个结束?

时间:2014-03-09 21:49:51

标签: c++ stl iterator boost-range

我目前正试图了解some ideas wrt。 C ++迭代器,我一直想知道......

给定一个Incremental / Single Pass / Input / Output Iterator,对于这样的迭代器,实际上是否存在一个过去的结束位置/元素,或者都是InputIterator end()迭代器“自然地”某种形式的奇异值由operator==特别处理?

我认为我的意思是这样的:对于ForwardIterator上的“向上”的任何内容,只需要检查两个迭代器对象是否为operator==就可以了。 {1}} - ness,指向相同的元素。这对于InputIterator是否有意义?

2 个答案:

答案 0 :(得分:2)

不是InputIterator的{​​{1}}是递增它使前一个值无效的意思(意味着具有相同值的任何迭代器,即原始的任何副本)。

通常,仅比较“相同序列”的迭代器(即,可以从另一个序列中访问一个)是有效的。对于你所谈论的迭代器,这意味着唯一有效的比较是:

  • 两个相等的非端迭代器
  • 两个结束迭代器
  • 结束迭代器和非结束迭代器

你不能(通过这个接口的保证)比较两个不相等的非端迭代器,因为你从来没有两个有效的非端迭代器,其中一个可以从另一个到达。那个“落后”的人已经失效了。

因此,似乎可以实现迭代器,使其包含一个数据成员,该成员在结束迭代器中具有一个值,在非结束迭代器中具有不同的值。对于流迭代器的典型示例,该数据成员可以是ForwardIterator。然后bool isEndOfStream不需要包含任何特殊情况代码,它只需要比较该字段。然后,所有端迭代器都可以互换:这个字段是唯一可以使用的字段。

它可能很有效率,因为迭代器成为结束迭代器的频率远远低于迭代器的比较频率,因此在极少数情况下写入以允许常见情况只是读取和比较似乎是明智的。对于任何两个非结束迭代器,这样的迭代器比较都会返回true,但这很好,因为要么它们真正相等(在这种情况下返回true是正确的),要么比较它们是无效的(在这种情况下行为是未定义的)。

答案 1 :(得分:1)

规范示例是istream_iterator(模板),当底层流提取失败时,它变为单数。这可以通过与相同类型的默认构造迭代器进行比较来检测,该迭代器等效于单数迭代器。例如:

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

这相当于:

std::vector<int> v;
for (int n; std::cin >> n; ) { v.push_back(n); }

再次强调:所有一对一的istream迭代器都是等价的,与它们来自的流无关。这些迭代器是一个例子,其中“单数”(=与任何容器无关)和“一个接一个”(=递增最后一个可解除引用的迭代器的结果)意味着同样的事情。