微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Node* 类型值如何以迭代器类型返回?

如何解决Node* 类型值如何以迭代器类型返回?

我创建了一个链表类,它有一个 Node 类型的头指针。 在方法 begin() 中,我想返回一个 Iterator 类型的对象。 但是如果我在 begin() 方法中返回一个 Node* 类型的指针,它就能够正常编译和运行。为什么???

class LinkedList {
    class Node;
    Node* head;

public:
    class Node {
    public:
        int data;
        Node* next;
        Node(int item) : data{ item },next{ } { }
    };

    void insert(std::initializer_list<int> list) {
        head = nullptr;
        Node* ptr{};
        for (auto ele : list) {
            if (head == nullptr) {
                head = new Node(ele);
                ptr = head;
                continue;
            }
            
            ptr->next = new Node(ele);
            ptr = ptr->next;
        }
    }

    void printList() {
        Node* ptr = head;
        
        while (ptr) {
            std::cout << ptr->data << " ";
            ptr = ptr->next;
        }
    }

class Iterator {
        Node* m_ptr;
    public:
        std::forward_iterator_tag o1;
        std::ptrdiff_t p1{};
        using value_t = Node;
        using pointer_t = Node*;
        using reference_t = Node&;

        Iterator(pointer_t ptr) : m_ptr{ ptr } {}
        
        reference_t operator*() { return *m_ptr; }
        pointer_t operator->() { return m_ptr; }
        Iterator& operator++() {
            m_ptr++;
            return *this;
        }
        Iterator operator++(int) {
            pointer_t temp = m_ptr;
            ++m_ptr;
            return temp;
        }
        friend bool operator==(const Iterator& a,const Iterator& b) { return a.m_ptr == b.m_ptr; }
        friend bool operator!=(const Iterator& a,const Iterator& b) { return a.m_ptr != b.m_ptr; }

    };

    Iterator begin() { return head; }
    Iterator end() {
        Node* ptr = head;
        
        while (ptr->next != nullptr) {
            ptr = ptr->next;
        }

        return ptr;
    }
};

解决方法

它通过 Iterator(pointer_t ptr) 构造函数将 Node* 隐式转换为 Iterator。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。