我正在编写一个特殊的迭代器类,其工作方式与std::istream_iterator
和其他许多类似,使用默认构造的实例来标记迭代结束。我想给它双向迭代器类别。运行以下代码后:
MyIterType i_cur(get_some_iter()), i_end;
while(i_cur != i_end) ++i_cur;
双向迭代器的标准要求是否使以下内容有效?
--i_cur
++i_cur
--i_end
或++i_end
感谢您尽可能引用该标准。我在C ++ 03中编译,但如果C ++ 11引入了更改,我也有兴趣了解它们。
答案 0 :(得分:1)
在C ++ 11的24.2.6中,表110给出了双向迭代器的附加要求。
特别是,如果s
存在r == ++s
,则--r
必须有效且生成的r
必须是可解除引用的。另外:
--(++r) == r
。--r == --s
隐含r == s
。&r == &--r
。因此,除非i_cur
返回的初始get_some_iter
是一个过去的迭代器,否则最后的i_cur
有一个前任,因此必须是可递减的。同样适用于i_end
,因为它是最终i_cur
的前身的继承者。
答案 1 :(得分:1)
标准说你的问题的答案是肯定的:
Table 75—Bidirectional iterator requirements (in addition to forward iterator)
expression return type operational assertion/note
semantics pre/post-coindition
======== ============ ============ ====================
--r X& pre: there exists s such
that r == ++s.
post: s is dereferenceable.
--(++r) == r.
--r == --s implies r
== s.
&r == &--r