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

时间:2016-01-19 11:14:42

标签: c++ stl iterator const-iterator forward-list

大家好,

我在使用Univeristy项目的迭代器实现我自己的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");
}

1 个答案:

答案 0 :(得分:0)

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

_ptr = ptr_->next

我宁愿不实施

self_type operator++(int junk)
迭代器类中的

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

另外,在const_iterator中,确保只返回const指针,这样如果调用者试图使用const_iterator来改变列表,编译器就会发出错误。