2017-05-16 103 views
1

我正在实现自定义随机访问stl迭代器。 ATL类的包装器,如CArray。所以我有索引而不是指针。我的end() - 迭代器的索引为-1。如何为随机访问迭代器实现“少于运算符”?

正如我所见here比较运算符如“小于”必须实现。

我的问题是;如果其中一个比较参数是end() -Iterator,结果如何?它是否定义了行为?

VS2015 implements vector_iterator这样;

bool operator<(const _Myiter& _Right) const 
{ // test if this < _Right 
    _Compat(_Right); 
    return (_Ptr < _Right._Ptr); 
} 

,但我不知道什么会被happend,如果_Right*thisend() - 迭代器。

编辑end()索引为-1的想法很糟糕。现在我使用容器大小作为end() -iterator的索引。

+0

这真的取决于你的迭代器是如何实现的。没有代码,所以没有人可以回答这个问题。 – ForEveR

+0

@ForEveR,但我要问一个行为。 Is end()

+2

'end()'是一个迭代器,它指向一个容器的最后一个元素(因为迭代器是在指针上建模的,而一个指向数组的常规指针必须允许一个值超过数组的末尾,因此任何有效的迭代器都会小于容器的'end()'迭代器。当比较两个具有'end()'值的迭代器时,两者都不会少于另一个。简单地说,只要'iter'引用容器的一个元素,'iter

回答

4

迈克尔伯尔的评论本质上是正确的答案。

operator<(LeftIter,RightIter)应该是真的当且仅当有一个严格的正数N使得LeftIter+N == RightIter

对于以P位置的元素,LeftItercontainer.begin()+P,所以确实是这样一些N.这是container.size()-P,这确实是总是大于0

如何实现这是你的标准只是描述了可见的行为。

+2

在来自两个不同容器的迭代器上调用'operator <'是未定义的行为。作为'operator <'的作者,这意味着你可以假设他们指向同一个容器, – MSalters

2
  1. 如果*thisend()迭代器,则返回false;
  2. 如果_Rightend()的迭代器,则返回true;
  3. 在相反的情况下返回比较结果。

有一个好主意,通过方式实现end()迭代器,该函数比较有这种行为,没有任何特殊情况下(1-2)。

+0

这应该是真的,但它在任何地方记录? –

+2

它由Iterators库部分中的标准以非常*间接的方式记录。用于比较两个迭代器的'<'运算符是根据'-'运算符来定义的,该运算符是根据'+'运算符定义的,该运算符根据'+ ='运算符定义(输入和双向迭代器变体的)'++'和'--'运算符。输入迭代器的前'++'运算符被定义为可能导致“过去 - 结束”迭代器值(这是'end()'返回的值)。呼。 –

+0

@MichaelBurr评论对我来说是正确的答案。 –

相关问题