【问题标题】:In a c++ iterator, should I define both operator== and operator!=?在 c++ 迭代器中,我应该同时定义 operator== 和 operator!= 吗?
【发布时间】:2019-07-23 12:57:02
【问题描述】:

当我为自定义容器编写迭代器时, 我应该同时定义operator==operator!=吗?

最初我认为我应该定义两者,但后来我读到here,在必须定义的表达式表中,只有i != j 必须定义。不过,它说它应该等同于!(i==j),所以我不确定是否应该定义后者。

在 clang++-5.0 中,只要我定义了 !=,基于范围的 for 循环就可以正常工作。

如果还需要定义operator==,下一个问题是:为什么?为什么不只要求其中一个并自动计算另一个?

【问题讨论】:

  • 你想要什么样的迭代器?有输入、输出、转发、双向、随机访问。
  • @NathanOliver 我想要一个可以在基于范围的 for 循环中使用的迭代器。是不是叫做“前向迭代器”?
  • 根据您的需要,可以使用输入迭代器。 here 是一个非常好的页面,可以帮助您选择要实现的迭代器类型。

标签: c++ iterator operator-overloading


【解决方案1】:

tl;dr:是的,您应该,但对于基于范围的for,您可能不需要 p>


从您的链接中假设您要创建一个 InputIterator

最初我认为我应该定义两者,但后来我读到这里,在必须定义的表达式表中,只有 i != j 必须定义。不过,它说它应该等同于!(i==j),所以我不确定是否应该定义后者。

是的,应该。该要求来自 EqualityComparable,该页面上也提到了该要求(但未在表中枚举,该表未定义“继承”要求或已属于该语言其他地方使用的类别的要求)。

InputIterator 可能不是你想要的;您可以使用this page 上的表格来决定。但是,乍一看,它们全部最终都以同样的方式要求EqualityComparable

基于范围的for不是根据迭代器类别指定的,而是it needs ++, != and *InputIterator 是与这组要求最匹配的。

至于为什么!=== 是必需的,好吧,标准库可以在任何地方使用!(x == y),但是如果你想要 提供一些 != 以某种方式便宜然后它会被闲置,这会很烦人。这样,如果它所做的只是!(x == y),则只需几秒钟即可定义它并且不会花费您任何费用。

【讨论】:

  • 奇怪的是它不在表中,因为它是第一个需要 EqulityComparable 的迭代器。
  • @NathanOliver 我认为这只是对 EqualityComparable 的定义进行重复数据删除的一种方式(其他地方也需要),但我同意以标准的方式呈现事实在 wiki 上可能不是最清晰的方法。
  • 感谢 EqualityComparable 继承的注释;我没有注意到这一点。但我还是不明白——如果我只需要基于范围的 for 循环,而这些循环按照标准不使用 ==,那我为什么需要定义 ==?
  • @ErelSegal-Halevi:你没有。你问你是否应该,我解释了你必须做什么才能满足各种要求。如果严格遵守标准的定义,基于范围的 for 将仅使用 ++!=*。然而,根据 as-if 规则(并注意迭代器的最低要求,如上所述),可以想象在实践中您可能需要更多。我只需实现迭代器以匹配标准类别之一,那么您就安全了
【解决方案2】:

为什么不只需要其中一个并自动计算另一个?

因为您可能想为速度自定义它

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2023-03-23
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多