1

我目前正在尝试理解一些想法。C ++迭代器,我一直在想......

给定一个Incremental / Single Pass / Input / Output Iterator,是否真的存在这样一个迭代器的一个过去的位置/元素,或者所有 InputIteratorend()迭代器“自然地”某种形式的奇异值受到特殊待遇operator==

我想我的意思是:对于“向上”的ForwardIteratoroperator==中的任何内容,有一个简单的方法来检查两个迭代器对象是否指向同一个元素,而不管end-ness 是否指向同一个元素,这是完全有意义的。这对 InputIterator 有意义吗?

4

2 回答 2

3

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

通常,仅比较来自“相同序列”的迭代器是有效的(也就是说,一个可以从另一个访问)。对于您正在谈论的迭代器,这意味着唯一有效的比较是:

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

您不能(通过此接口的保证)比较两个不相等的非结束迭代器,因为您永远不会有两个有效的非结束迭代器,其中一个可以从另一个访问。“后面”的那个已经失效了。

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

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

于 2014-03-09T22:13:36.130 回答
3

典型的例子是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 迭代器都是等效的,独立于它们来自的流。这些迭代器是一个例子,其中“单数”(= 不与任何容器关联)和“一个过去的”(= 增加最后一个可取消引用的迭代器的结果)意味着相同的事情。

于 2014-03-09T21:53:08.770 回答