在C++中,双向迭代器是否应该保持递减状态

Should a bidirectional iterator having reached end remain decrementable in C++?

本文关键字:状态 是否 C++ 迭代器      更新时间:2023-10-16

我正在编写一个特殊的迭代器类,它的工作方式与std::istream_iterator和许多其他类类似,使用默认构造的实例来标记迭代结束。我想给它一个双向迭代器类别。运行以下代码后:

MyIterType i_cur(get_some_iter()), i_end;
while(i_cur != i_end) ++i_cur;

双向迭代器的标准要求是否强制要求以下内容有效?

  1. --i_cur
  2. ++i_cur
  3. --i_end++i_end

如果可能的话,感谢您引用标准。我使用C++03进行编译,但如果C++11引入了更改,我也有兴趣了解它们。

标准说你的问题的答案是肯定的:

[C++03]:24.1.4双向迭代器

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

在C++11中的24.2.6中,表110给出了对双向迭代器的额外要求。

特别地,如果存在s使得r == ++s,则--r必须是有效的,并且得到的r必须是可解引用的。此外:

  • CCD_ 10
  • CCD_ 11表示CCD_
  • &r == &--r

因此,除非get_some_iter返回的初始i_cur是一个结束迭代器,否则最终的i_cur有一个前置器,因此必须是可递减的。i_end也是如此,因为它是最终i_cur的前身的继承者。