【问题标题】:What are end() iterators in a set data structure supposed to return?集合数据结构中应该返回的 end() 迭代器是什么?
【发布时间】:2017-11-14 11:07:40
【问题描述】:

这确实是编程硬件,但我不是要代码,而是当我调用迭代器函数 end() 时我想返回什么?最大值/Right-Most 设置节点?

我相信对于 begin(),我们只是获取 root 的迭代器,对,因为它是我们输入的第一件事。

同样对于这个Set Data Structure迭代器中的operator++,我们只是根据从根开始遍历树来递增迭代器?

感谢您的帮助。

【问题讨论】:

  • 好吧,在你调用++ 的次数足够多之后,begin() 会有什么价值?
  • 它返回引用结构“结束后的一个”元素的内容。所以如果一个迭代器等于这个end()元素,它是无效的
  • begin() for std::set 返回一个指向最小元素而不是根的迭代器,++it 指向该元素的后继元素。
  • @JoshG79: 迭代器 not 无效,无法取消引用,但它是 有效 迭代器。
  • 所以基本上,C.R.,begin() 从最左边的节点开始(因为那将是最小值),然后使用 ++ 运算符相应地遍历树到树的末尾,然后传递最后一个节点迭代器到最后(哪个在最大的已知值之后)?因此节点结构将保留一个数据成员“父级”,以便它可以返回树以便更容易遍历。一旦它到达 null 父级,那会假设它是根并找到一次通过的最大值?但我在 c++ 参考站点注意到,这些操作应该是 O(1)。所以,我一定是哪里错了。

标签: c++ iterator set


【解决方案1】:

传统上,end() 返回结构末尾的一个过去。否则,您将无法使用 current != end() 循环遍历整个结构。 std::vector 就是这种情况,但是对于更复杂的数据结构,迭代器更复杂。但是您应该始终能够通过在指向可迭代结构中最后一个元素的迭代器上使用 operator++ 来访问 end()

您不能取消引用 end() 元素,这通常是未定义的行为。

【讨论】:

  • 这个答案中缺少的一个要求是,您需要能够通过递减 end() 迭代器来到达有序横向中的最后一个节点。这很重要,因为它排除了使用持有空指针而不是指向真实节点的指针的迭代器。
  • 仅当它符合反向迭代器时:) - 对于随机访问迭代器,您也需要能够使用 operator+= 和 operator-= 完成上述所有操作。但是是的
  • 对于 set 数据结构,迭代器很可能是双向的(不是 reverse
【解决方案2】:

如果您自己实现数据结构,您可以决定end() 的含义。它必须是一个正确类型的迭代器,并且是一个可以与将普通迭代器递增到集合中最后一个元素之外的结果相匹配的值。因为集合中的迭代器是双向的,所以您返回的特定值需要能够走到集合中的前一个值。

一种常见的方法是在容器中使用一个哨兵节点,该节点保存指向数据结构中第一个和最后一个元素的指针,并在该节点中使用迭代器(不包含正确的值)作为@987654322 @迭代器。

begin()的情况下,它不代表树根的值,而是最小的值,所以它将是树中最左边的节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2018-08-13
    • 2011-09-21
    • 2016-11-10
    • 1970-01-01
    • 2020-03-22
    • 2014-07-30
    相关资源
    最近更新 更多