【问题标题】:How to find tha't circular list's begin?如何找到那个循环列表的开始?
【发布时间】:2020-09-16 17:43:01
【问题描述】:

我正在尝试实现关于列表的列表和列表的迭代器,如 C++ STL。

列表中的节点定义如下:

struct Node{
  Node *prev,*next;
  value_type data;
};

我想重载运算符 > 和

bool list_iterator::operator>(const iterator_impl_base &rhs) const
bool list_iterator::operator<(const iterator_impl_base &rhs) const

这意味着如果我需要调用 next 来到达 rhs.node ,它将在 > 中返回 0 并在 <.> 中返回 1

如果我需要调用 prev 来到达 rhs.node ,它在 > 中返回 1,在 <.> 中返回 0

我使用循环列表实现列表。以下是列表类的一部分:

class List : public ordered_container {
 protected:
  Node* begin_;
  Node* end_;
  size_type size_;
 public:
    List::List() : end_(new Node){
        begin_ = end_->prev = end_->next = end_;
        size_=0;
    }
}

所以,我不知道如何区分我是否只是通过了列表的begin_。有人可以帮我吗?谢谢。

【问题讨论】:

  • 这个问题的上下文是什么?如果您只需要一个循环缓冲区,那么在索引时应用 mod 到向量的长度时向量是否足够?或者你可以使用boost::circular_buffer吗?
  • @TamaMcGlinn 我想知道如何重载这两个运算符。我需要做的是实现自己的列表和迭代器,其工作方式类似于 STL 中的列表。此外,我不能在 STL 中使用任何东西。
  • @willy:你说的是doubly linked list还是circular buffer?我在问,因为排序关系在循环缓冲区上没有意义。每个元素都在其他元素之前,它是一个圆圈......
  • boost 不在 STL 中。告诉你的老师你发现了一个很好的漏洞并使用boost::circular_buffer
  • @phlipsy 例如,我有一个列表: 1->2->3->4 和 4->1 因为它是 circule ,并且 1 是 begin_ , 4 是 end_ 。在这种情况下,1

标签: c++ list c++11 iterator


【解决方案1】:

首先,使用operator&lt; 表示“之前”是奇怪。我知道这是一种锻炼,我只是不想让你认为这是正常的。

现在,您的循环列表将开始和结束存储在顶级容器对象中,因此节点本身无法判断它是头部还是尾迹,或者反转是否环绕。只有容器才能告诉我们这一点。

循环列表的通常解决方案是在头和尾之间有一个哨兵节点。那么sentinel.next 是头部,sentinel.prev 是尾部,你需要一些方法来标记哨兵本身(data 的魔法值或额外的标志)。然后,这个哨兵节点可以替换容器对象中的两个指针(这样就不会浪费任何空间)。

当你遍历列表时,它仍然是循环的,但你可以知道你是否通过了你所环绕的哨兵。

哨兵还有一个额外的好处,就是您永远不必担心空列表中的 nullptrs。


顺便说一句,我觉得很奇怪,讲师一直使用双向链表并且不显示前哨排列。它在我继承的 Elson 的数据结构书的副本中的几页内进行了描述,该书于 1975 年出版。故意教授 bad 双向链表有什么意义?

如果他们想让你自己解决这个问题,他们应该让你完成基本的列表操作,而不是这些奇怪的先行/成功操作符,因为基本操作实际上可以在没有哨兵的情况下工作,但通过它的显着改进补充。

【讨论】:

    【解决方案2】:

    一个元素 a 小于另一个元素 b 如果您可以通过关注 next 在 end 之前到达 b。

    当 b 小于 a 时,一个元素 a 大于另一个元素 b。

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2019-01-30
      • 2014-03-03
      • 2018-03-06
      • 2013-05-16
      • 2020-10-15
      • 2014-10-28
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多