繁体   English   中英

为 std::uniqe_ptr 链表实现迭代器

[英]Implement iterator for std::uniqe_ptr Linked list

到目前为止,这是我的代码,它显然不起作用。 我希望这个迭代器能够在基于范围和增量的 for 循环上工作。 我该怎么做?

template<typename T>
class MyList {
  public:
    class Node {
      public:
        Node(const T& data): data(data) {
            this->next = NULL;
        }
        std::unique_ptr<Node> next;
        T data;
    };
    MyList() {
        this->_size = 0;
    }
    int size() const;
    void push_front(const T& data);
    T pop_front();
    T front() const;
    void remove(T data);

    typedef T* iterator;
    typedef const Node* const_iterator;
    iterator begin() {
        return (&_head.get()->data);
    }
    iterator end() {
        return (NULL);
    }

  private:
    int _size;
    std::unique_ptr<MyList<T>::Node> _head;
};

T*不适合作为链表迭代器,因为它在递增时无法到达列表中的下一个节点。 也因为&_head.get()->data在列表为空时无效。

而且Node*也不适用于iteratorconst_iterator ,因为它不能有一个有效的operator++来迭代列表,也不能有一个operator*来访问data 请参阅ForwardIterator的要求。

您最好定义一个单独的类型来充当(const_)iterator ,并让它在内部保存一个Node*以进行迭代和取消引用,例如:

template<typename T>
class MyList {
  public:
    class Node {
      public:
        Node(const T& data): data(data) {}
        std::unique_ptr<Node> next;
        T data;
    };

    template<typename D>
    class my_iterator
    {
      public:
        my_iterator(Node* node) : _current(node) {}
        bool operator==(const my_iterator &rhs) const { return _current == rhs._current; }
        D& operator*() { return _current->data; }
        D* operator->() { return &(_current->data); }
        my_iterator& operator++() { _current = _current->next.get(); return *this; }
        my_iterator operator++(int) { my_iterator tmp(_current); ++(*this); return tmp; }
      private:
        Node* _current;
    };

    using iterator = my_iterator<T>;
    using const_iterator = my_iterator<const T>;

    ...

    iterator begin() {
        return iterator(_head.get());
    }

    const_iterator cbegin() const {
        return const_iterator(_head.get());
    }

    iterator end() {
        return iterator(nullptr);
    }

    const_iterator cend() const {
        return const_iterator(nullptr);
    }

    ...
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM