到达终点的双向迭代器是否应该在C ++中减少?

时间:2013-07-10 13:16:19

标签: c++ iterator standards bidirectional

我正在编写一个特殊的迭代器类,其工作方式与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
  4. 感谢您尽可能引用该标准。我在C ++ 03中编译,但如果C ++ 11引入了更改,我也有兴趣了解它们。

2 个答案:

答案 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)

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

[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