C ++双向迭代器前缀增量

时间:2012-08-10 20:13:14

标签: c++ iterator bidirectional

观察1:C ++输出迭代器需要&r == &++r,而输入迭代器不提及此要求。见[C ++ 11:24.2。{3,4}]

观察2:正向,双向和随机访问迭代器满足输入迭代器要求[24.2。{5,6,7}:1],但不一定是输出迭代器要求,除非它们可变 [24.2.1:4]。

观察3:双向迭代器添加前缀减量操作,需求为&r == &--r [24.2.6]。

那么,常量双向迭代器必须满足&r == &--r但不一定是&r == &++r,而可变双向迭代器必须满足既?

您能否说明此要求可能会如何影响实施?


下面的MvG,问我真正想要的问题:

  • 什么时候常量正向迭代器不满足&r == &++r

2 个答案:

答案 0 :(得分:1)

这是制定需求的间接方式,没有明确指定特定实现。特别是&r == &++r是一种说++r无法返回代理对象的方式。结果必须是相同的迭代器。

这里mutable与通常方式的const不完全相反,但意味着可写,并且再次引用输出迭代器的要求。

双向迭代器当然必须同时支持++p--p(根据定义),但不必是可写/可变的。

类别在读/写和向前/向后移动之间并不是完全正交的,因此个别要求不是独立的,因为它们本来可以。这会引起一些混乱。

我不确定你的结论是否来自观察结果,但不认为它是实施的重要自由。您必须支持*++p*p++等内容的事实设置了大部分限制。

答案 1 :(得分:1)

  

您能否说明此要求可能会如何影响实施?

显而易见的答案是,operator++()operator--()方法必须return *this,而单独的函数Foo& operator++(Foo& arg)必须返回其参数。因为在任何情况下这都是理智的事情,大多数实现都不必担心。

更复杂的问题是“什么时候(<正向输入)迭代器对而不是遵循上述方法有意义”。我还没有想出一个合理的例子。即使对于常量输入迭代器,++r类型也必须是对迭代器类型的引用。因此,任何形式的“代理对象”,如his answer中提到的@Bo Persson,只有在代理对象是迭代器类的子类时才有效。似乎没有多大意义。

我觉得输出迭代器案例只是忘记了请求&r == &++r。我怀疑规范的作者是否有任何具体的用例,这些要求无法满足。但我猜,所以我期待对这个问题有一个更可靠的答案。