2

我正在编写一个特殊的迭代器类,它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 引入了更改,我也有兴趣了解它们。

4

2 回答 2

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

于 2013-07-10T13:32:34.393 回答
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
于 2013-07-10T13:33:00.843 回答