【问题标题】:How to implement "less than operator" for random access iterator?如何为随机访问迭代器实现“小于运算符”?
【发布时间】:2017-10-15 05:40:17
【问题描述】:

我正在实现自定义随机访问 stl 迭代器。 ATL 类的包装器,例如 CArray。所以我有索引而不是指针。我的end()-Iterator 的索引为-1。

我看到here 必须实现“小于”之类的比较运算符。

我的问题是;如果比较参数之一是end()-Iterator,结果应该是什么?它是定义的行为吗?

VS2015这样实现vector_iterator

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

但我不确定会发生什么,如果 _Right*thisend()-Iterator。

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

【问题讨论】:

  • 这真的取决于你的迭代器是如何实现的。没有代码,所以没有人能回答这个问题。
  • @ForEveR 但我问的是一种行为。是 end()
  • end() 是一个迭代器,它“指向”容器的最后一个元素(因为迭代器是根据指针建模的,并且指向数组的常规指针必须允许指向超出容器末尾的值)数组以明确定义的方式),因此容器元素的任何有效迭代器都将小于该容器的 end() 迭代器。当比较两个都具有end() 值的迭代器时,两者都不会小于另一个。简单地说,只要iter 引用容器的元素,iter &lt; end() 就会为真。
  • 以下划线开头后跟大写字母的名称(_Myiter_Right_Compat_Ptr)和包含两个连续下划线的名称保留供实现使用.不要在你的代码中使用它们。
  • 哎呀,对不起;不小心阅读。你的帖子确实这么说。

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


【解决方案1】:

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

operator&lt;(LeftIter,RightIter) 应该为真当且仅当存在严格的正数 N 使得 LeftIter+N == RightIter

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

如何实现这取决于您,标准仅描述可见行为。

【讨论】:

  • 在来自两个不同容器的迭代器上调用 operator&lt; 是未定义行为。作为operator&lt; 的作者,这意味着您可以假设它们指向同一个容器,
【解决方案2】:
  1. 如果*thisend()迭代器,则返回false;
  2. 如果_Rightend()迭代器,则返回true;
  3. 在相反的情况下返回比较结果。

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

【讨论】:

  • 这应该是真的,但它是否记录在任何地方?
  • Iterators library 部分的标准以非常间接的方式记录了它。用于比较两个迭代器的 &lt; 运算符是根据 - 运算符定义的,它是根据 + 运算符定义的,它是根据 += 运算符定义的,它是根据定义的pre-++-- 运算符(输入和双向迭代器种类)。输入迭代器的 pre-++ 运算符被定义为可能导致“过去的”迭代器值(这是 end() 返回的值)。唷。
  • @MichaelBurr 那条评论对我来说是正确的答案。
猜你喜欢
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2021-01-12
  • 2011-05-18
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多