实现我自己的列表和迭代器 STL C++

Implementation my own List and iterator STL C++

大家好,

我在为 University 的项目使用迭代器实现自己的 List 时遇到问题。我应该怎么做才能正确迭代循环?有人可以帮帮我吗?如果我的英语不正确,请见谅。

#ifndef __List__
#define __List__

template <class type>
class List
{
public:
    struct Node
    {
        type value;
        Node* next;
    };
    Node* root;
    class iterator
    {
    public:
        typedef iterator self_type;
        typedef Node& reference;
        typedef Node* pointer;
        typedef std::forward_iterator_tag iterator_category;
        typedef int difference_type;
        iterator(pointer ptr) : ptr_(ptr) { }
        self_type operator++() { self_type i = *this->ptr_->next; return i; }
        self_type operator++(int junk) { ptr_++; return *this; }
        reference operator*() { return ptr_; }
        type operator->() { return ptr->value; }
        bool operator==(const self_type& rhs) { return ptr_ == rhs.ptr_; }
        bool operator!=(const self_type& rhs) { return ptr_ != rhs.ptr_; }
    private:
        pointer ptr_;
    };

    class const_iterator
    {
    public:
        typedef const_iterator self_type;
        typedef type value_type;
        typedef Node& reference;
        typedef Node* pointer;
        typedef int difference_type;
        typedef std::forward_iterator_tag iterator_category;
        const_iterator(pointer ptr) : ptr_(ptr) { }
        self_type operator++() { self_type i = *this->ptr_->next; return i; }
        self_type operator++(int junk) { ptr_++; return *this; }
        const reference operator*() { return *ptr_; }
        const type operator->() { return ptr->value; }
        bool operator==(const self_type& rhs) { return ptr_ == rhs.ptr_; }
        bool operator!=(const self_type& rhs) { return ptr_ != rhs.ptr_; }
    private:
        pointer ptr_;
    };

    List();
    List(std::initializer_list<type> vals);
    ~List();
    iterator begin()
    {
        return iterator(root);
    }
    iterator end()
    {
        return iterator(nullptr);
    }
    const_iterator begin() const
    {
        return const_iterator(root);
    }
    const_iterator end() const
    {
        return const_iterator(nullptr);
    }
    Node* last();
    void push_back(type obj);
};

template <class type>
List<type>::List()
{
    root = nullptr;
}

template <class type>
List<type>::List(std::initializer_list<type> vals)
{
    root = nullptr;
    for (auto& elem : vals)
        push_back(elem);
}

template <class type>
List<type>::~List()
{
}

template <class type>
typename List<type>::Node* List<type>::last()
{
    Node* tmp = root;
    while (tmp->next != nullptr)
        tmp = tmp->next;
    return tmp;
}

template <class type>
void List<type>::push_back(type obj)
{
    Node* tmp = new Node;
    tmp->value = obj;
    tmp->next = nullptr;
    if (root == nullptr)
        root = tmp;
    else
    {
        Node* l = last();
        l->next = tmp;
    }
}

#endif

我想像第一个循环甚至第二个循环一样遍历我的列表。

int main()
{
    List<Product*> ProductBase{ new Product("Lubella Spaghetti 500 g", 10.0, 3.1, 0.23, 1), new Product("Nescafé Gold Blend 200 g", 20.0, 1.2, 0.23, 1) };
    for (auto i = ProductBase.begin(); i != ProductBase.end(); ++i)
        i->display_product();
    for (auto elem : ProductBase)
        elem->display_product();
    system("PAUSE");
}

在迭代器的operator++和const_iterator中需要添加

_ptr = ptr_->next

我宁愿不实施

self_type operator++(int junk)

在迭代器中class。列表迭代器通常只能前进一步。

此外,在 const_iterator 中,确保只有 return 常量指针,这样如果调用者试图使用 const_iterator 来改变列表。