输入迭代器的示例`end()`实际上表示一个past-end-end

Example of Input Iterator where `end()` actually denotes one-past-the end?

本文关键字:表示 一个 past-end-end 实际上 迭代器 end 输入      更新时间:2023-10-16

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

给定一个增量/单个通过/输入/输出迭代器,实际上可以存在这样的迭代器的一正式位置/元素,或者都是Inputiterator end()迭代器"自然"operator==特别处理的单数值?

我认为我的意思是:对于"向上"上的任何东西,拥有一个微不足道的operator==可以是完全有意义。对于输入术语,这是否有意义?

不是 ForwardIteratorInputIterator是将其增量无效的 CC_6(含义具有相同值的任何迭代器,即原始值的任何副本)。

)。

通常,只能从"相同序列"(即一个可以从另一个序列到达)比较迭代器。对于您要谈论的迭代器,这意味着唯一有效的比较是:

  • 两个平等的非终端迭代
  • 两端迭代器
  • 终端迭代器和非末端迭代器

您无法(通过此接口的保证)比较两个不平等的非终端迭代器,因为您永远没有两个有效的非迭代器,其中一个迭代器可从另一个迭代器。"背后"的一个已经无效。

因此,您似乎可以实现迭代器,以便它包含一个具有最终迭代剂值的数据成员,而在非终端迭代器中具有不同的值。对于流迭代器的典型示例,数据成员可以是bool isEndOfStream。那么operator==不需要包含任何特殊案例代码,它只需要比较该字段即可。然后,所有最终迭代器都可以互换是很自然的:该领域是唯一可以使用的东西。

这很可能是有效的,因为迭代器变得比迭代剂的结局频率要少得多,因此,在极少数情况下,允许常见案例的写作只是读取和比较似乎是明智的。这样的迭代器比较将对任何两个非终端迭代器返回true,但这很好,因为它们是真正平等的(在这种情况下返回true是正确的),或者比较它们是无效的(在这种情况下,行为不确定)。

规范示例是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); }

再次强调:所有一端的末端迭代迭代器都是等效的,独立于它们的流。这些迭代器是一个示例,其中"单数"(=与任何容器没有关联)和"一式末端"(=递增最后一个不可定述的迭代器的结果)是相同的。