【发布时间】:2015-09-13 17:54:55
【问题描述】:
我认为这个问题很容易解释。
如果我有std::vector<int> v = {1,2,3},那么v.end() - 1 或v.end()-- 是有效的表达式吗?
我知道大多数迭代器都支持它,但问题是,它是定义的行为吗?不幸的是,很难找到有关它的信息。没有迭代器规范吗?标准本身似乎对此非常模糊,或者我只是错过了在如此低的水平上定义它们的段落。
例如看:http://www.cplusplus.com/reference/vector/vector/end/
“它不指向任何元素,因此不应被取消引用。” std::end() 显然不如 (v.begin() + 1) 通用,后者是最通用的,支持所有操作。所以这就引出了一个问题,哪些操作是分别为 std::end() 和 std::begin() 定义的行为。
我需要这个来编写我自己的库。鉴于v.end()-- 是一个有效的表达式,一些更高级的惰性求值迭代器很难编写,因为如果不遍历它或跟踪迭代器本身的“结束”,就不会真正知道“结束”,这使得整个复杂得多,因为您需要对迭代器实现中的几乎所有内容进行特殊处理。
v.end()-- 让我头疼的事实让我怀疑它是否被允许;)。不幸的是,由于频繁的使用模式,“结束”必须非常有效,所以它必须是恒定的时间,这就是让事情变得如此困难的原因。
【问题讨论】:
标签: c++11 iterator c++-standard-library