【问题标题】:Why does bi-directional/forward operators don't support inequality relational operators?为什么双向/正向运算符不支持不等式关系运算符?
【发布时间】:2020-10-15 19:06:34
【问题描述】:

我目前正在学习迭代器类型,但有些东西我完全不明白。首先,据我了解,迭代器类型是类指针类型,这意味着它们可以指向容器中的任何元素,也可以执行算术运算(如指针)。似乎随机访问迭代器类型支持不等式关系运算符,我认为这意味着我们可以比较两个迭代器(不管这意味着什么,如果有人能对此有所了解的话)。但是为什么我们不能对正向和双向迭代器类型这样做呢?我的意思是,相等运算符为他们定义得很好。通过不等式关系运算符,我的意思是以下运算符<=, <, >, >=。 编辑:我没有具体的例子,但我在cplusplus.com 上看到过这个

【问题讨论】:

  • 请澄清你在哪里看到这个? (编译失败的例子会更好)可能只是看起来不等式不存在。
  • 在你链接的图片中,它们在同一个盒子里(?)
  • 所有迭代器必须支持不等式关系operator!=。您的意思是operator<operator>operator<=operator>=,它们仅对随机访问迭代器是必需/保证的?

标签: c++ iterator operators


【解决方案1】:

它不起作用,因为使用运算符比较指针,在这种内存分配中,索引 0 的内存地址可能大于索引 1 的内存地址,依此类推。

【讨论】:

    【解决方案2】:

    为什么双向/正向运算符不支持不等式关系运算符?

    我的意思是以下运算符<=, <, >, >=

    因为不可能有效地1为所有双向/前向迭代器实现此类运算符。

    例如,考虑如何为链表的迭代器实现这样的运算符。你会发现没有有效的1解决方案。

    1 具有恒定的渐近时间和空间复杂度。

    所以在比较两个迭代器时,我们是在比较它们指向的两个元素(即它们的值)而不是它们的地址?

    我们正在比较它们在序列中的相对顺序。

    【讨论】:

    • 所以在比较两个迭代器时,我们是在比较它们指向的两个元素(即它们的值)而不是它们的地址?
    【解决方案3】:

    a < b 用于迭代器意味着a 元素是否在容器中的b 元素之前。这很容易检查底层是连续的东西,即。支持随机访问。例如,对于只指向下一个元素的东西,下一个元素可以放在内存中的任何位置 - 因此回答任何两个迭代器都需要迭代(太昂贵)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多