为双向链表实现begin()和end()

use*_*910 3 c++ iterator linked-list list stdlist

我编写了自己的容器类,其原始内部数据结构是std::list.然后我需要创建自己的双向链表.我现在已经实现了我自己的双向链表以及链接列表的自己的迭代器,但是我遇到了问题std::list,特别是begin()end().

根据我的理解,begin()应该指向第一个节点,并且end()应该将一个元素指向最后一个元素.我需要确保当我调用时end(),我可以减少回到有效的最后一个元素.我还需要确保我可以做正常的遍历,比如......

while (beg != end ) { do something; beg++; }
Run Code Online (Sandbox Code Playgroud)

本质上,我的链表只使用包含数据元素的节点,指向前一节点的指针和指向下一个节点的指针.

当我第一次尝试实现我的时候end(),我只有最后一个节点的下一个指针是a nullptr.它可以单独工作,但不会像stl一样工作.

关于如何实现的任何意见begin()end()标准库做同样的方式?

小智 5

您可以引入一个标记节点并具有循环链表.

草图:

class List
{
    private:
    struct Node {
        Node* previous;
        Node* next;

        Node() : previous(this), next(this) {}
    };

    struct DataNode : Node {
        int data;
    };

    public:
    class iterator
    {
        friend class List;

        private:
        iterator(Node* node) : m_node(node) {}

        public:
        iterator() : m_node(0) {}

        iterator& operator ++() {
            m_node = m_node->next;
            return *this;
        }

        int& operator * () {
            // Note: Dereferncing the end (sentinal node) is undefined behavior.
            return reinterpret_cast<DataNode*>(m_node)->data;
        }

        // More iterator functions.

        private:
        Node* m_node;
    };

    public:
    List() : m_sentinal(new Node) {}

    iterator begin() { return iterator(m_sentinal->next); }
    iterator end() { return iterator(m_sentinal); }

    iterator insert(iterator position, int data) {
        DataNode* data_node = new DataNode; // pass data
        Node* current = position.m_node;
        data_node->next = current;
        data_node->previous = current->previous;
        current->previous->next = data_node;
        current->previous = data_node;
        return iterator(current);
    }

    void append(int data) {
        insert(end(), data);
    }

    private:
    Node* m_sentinal;
};
Run Code Online (Sandbox Code Playgroud)