在C++中,双向迭代器是否应该保持递减状态
Should a bidirectional iterator having reached end remain decrementable in C++?
我正在编写一个特殊的迭代器类,它的工作方式与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引入了更改,我也有兴趣了解它们。
标准说你的问题的答案是肯定的:
[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
的前身的继承者。
相关文章:
- boost 是否有按特殊类型值编码状态"compact optional"?
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 是否很好地使用状态模式来维护当前选定的对象?
- GCC9是否允许避免std::变量的无值状态
- 如何确定boost msm中的特定状态是否为活动状态
- grpcc++异步服务器示例,在处理状态下是否需要互斥
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 对于每个线程,random_device是否以不同的状态启动?
- 对无状态派生类进行切片是否安全?
- 检测是否按下了某个键,而不是检测它是否始终处于关闭状态
- 检查特定应用程序的窗口是否处于最小化状态
- 如何在C API中检查MySql连接是否处于活动状态
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- HTTP响应标头是否可以不以状态行开头
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- pclose() 返回管道的终止状态是否在所有平台上都向左移动了 8 位?
- c++ 14中语句(void)f()的状态是否格式错误?如果不是,f()部分是否为丢弃值
- 检测表单中任何小部件的状态是否发生了变化
- 存储可移动物体的"有效性"状态是否是一种好的做法?