我正在实现自定义随机访问stl迭代器。 ATL类的包装器,如CArray
。所以我有索引而不是指针。我的end()
- 迭代器的索引为-1。
正如我所见writable,必须实施比较“少于”的运算符。
我的问题是;如果其中一个比较参数是end()
- 迭代器,结果应该是什么?它是否定义了行为?
VS2015像这样实现vector_iterator
;
bool operator<(const _Myiter& _Right) const
{ // test if this < _Right
_Compat(_Right);
return (_Ptr < _Right._Ptr);
}
但如果_Right
或*this
是end()
- 迭代器,我不确定会发生什么。
修改:end()
索引为-1
的想法很糟糕。现在我使用容器大小作为end()
- 迭代器的索引。
答案 0 :(得分:4)
Michael Burr的评论基本上是正确的答案。
operator<(LeftIter,RightIter)
应为true 当且仅当存在严格正数N时才LeftIter+N == RightIter
。
对于位置P
的元素,LeftIter
将是container.begin()+P
,所以确实存在这样的数字N.它是container.size()-P
,这确实是总是大于0。
如何实现这一点取决于您,标准只描述了可见行为。
答案 1 :(得分:2)
*this
是end()
迭代器,则返回false; _Right
是end()
迭代器,则返回true; 并且有一个好主意通过方式实现end()
迭代器,函数compare具有这种行为,没有任何特殊情况(1-2)。