首页 > 解决方案 > 在双向链接的循环列表/环中实现迭代器(.end() 的问题)

问题描述

我正在尝试Iterator在我的班级中实现BiRing<Key, Info>班级。

我想知道的是如何实现一个遍历环的所有元素的迭代器?我已经在互联网上搜索了解决方案,但我无法找到任何相关的解决方案。

我遇到的主要困难是如何处理.end()方法。我读过它是通过返回最后一个元素的伪下一个元素来实现的,但我还没有看到任何关于如何在任何自定义容器上执行此操作的指南,更不用说双链接环了。

谁能简要解释一下在一般情况下和我的情况下如何创建这些伪最后元素,是否有其他方法可以实现迭代器,以便我能够遍历环的所有元素?

我的课(简体):

template<typename Key, typename Info>
class BiRing
{
private:
     struct Node
     {
         // key and info, previous and next, constructor
     };
    Node* any;

public:

     struct Iterator
     {
     private:
         Node* iter;

     public:
         Iterator(Node* any) : iter(any) {}

         void operator++() {
         if (iter == nullptr) throw ("nullptr iterator");
         iter = iter->next;
         }
         // *, == and != operators
     };

   Iterator begin() { return Iterator(any); }
   //Iterator end() { return ??? }

   // other methods
};

更新: 意识到“伪最后一个元素”的字面意思是“在不同上下文中处理方式不同的另一个节点”,我通过添加一个名为pseudoLast.

其余的课程BiRingIterator跟进该逻辑。每个Iterator对象都有Node* ptr并且Node* toSkip随后允许我检查迭代器对象是否与正确的BiRing对象一起使用;例如,如果我将 biRing begin()/end() 与不属于该对象的迭代器进行比较, == 和 != 运算符将引发异常。

如果有人想查看我是如何实现它的: Pastebin 链接。

标签: c++listiteratordoubly-linked-list

解决方案


推荐阅读