如何为随机访问迭代器实现“小于运算符”?

时间:2017-05-16 08:38:59

标签: c++ stl iterator operator-overloading random-access

我正在实现自定义随机访问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*thisend() - 迭代器,我不确定会发生什么。

修改end()索引为-1的想法很糟糕。现在我使用容器大小作为end() - 迭代器的索引。

2 个答案:

答案 0 :(得分:4)

Michael Burr的评论基本上是正确的答案。

operator<(LeftIter,RightIter)应为true 当且仅当存在严格正数N时才LeftIter+N == RightIter

对于位置P的元素,LeftIter将是container.begin()+P,所以确实存在这样的数字N.它是container.size()-P,这确实是总是大于0。

如何实现这一点取决于您,标准只描述了可见行为。

答案 1 :(得分:2)

  1. 如果*thisend()迭代器,则返回false;
  2. 如果_Rightend()迭代器,则返回true;
  3. 在相反的情况下返回比较结果。
  4. 并且有一个好主意通过方式实现end()迭代器,函数compare具有这种行为,没有任何特殊情况(1-2)。