自己的迭代器不起作用

时间:2013-12-26 21:14:49

标签: c++ iterator

我在自己的iterator上工作,应该迭代双链表。如果我正在迭代,则立即跳过循环。我没有错误,但是从调试中我读的不多。

for周期:

for(SemestralWork::DoubleList<Student>::iterator it = link->begin(); it != link->end(); ++it){
         //something...
    }

iterator + begin() + end()

class iterator {
private:
    Node<T> * node;
public:
    iterator(){}
    iterator(const iterator& cit){}
    iterator(T t) {

    }
    ~iterator(){}

    iterator& operator=(const iterator& second){
        node = second.node;
        return(*this);
    }
    iterator& operator++(){     
        if (node != NULL){
            node = node->GetNext();
        }
        return(*this);
    }
    iterator operator++(int){
        iterator tmp = *this;   //iterator tmp(*this)
        operator++();
        return tmp;
    }
    bool operator==(const iterator& second) {
        return node == second.node;
    }
    bool operator!=(const iterator& second) {
        return node != second.node;
    }
    T& operator*() {return node->GetData();}
    T* operator->(){return((DoubleList<T>::iterator)*this);} 
};

iterator begin(){
    return iterator(first->GetData());
}

iterator end(){
    return iterator(last->GetData());
}

Node

template <class U>
    class Node{
        Node<U> * next;
        Node<U> * previous;
        U data;
    public:
        Node(const U &data){
            next = NULL;
            previous = NULL;
            this->data = data;
        }
        void SetNext(Node<U> *next) { this->next = next; }
        Node<U> *GetNext(){ return next; }
        void SetPrevious(Node<U> *previous) { this->previous = previous; }
        Node<U> *GetPrevious(){ return previous; }
        U &GetData() { return data; }
    };

2 个答案:

答案 0 :(得分:3)

以下是我注意到的一些事情。这些是否真的能解决您的问题我不知道,因为发布的代码不完整:

  1. 你的iterator应该是从T对象构造的,构造函数的实现应该实际做点什么(我猜想iterator::iterator(T)这个事实什么都不做是你的实际问题)。相反,iterator应该由Node<T>*
  2. 构建
  3. preincrement运算符应该检查是否确实存在下一个元素! operator++()是迭代器可以递增的前提条件。如果有的话,操作员应该在启用调试设置的情况下报告误操作。
  4. 我怀疑您使用last:请注意,结束迭代器是过去最后一个元素的位置。
  5. 您的比较oerators应该是const成员,通常operator!=()只代表operator==(),即:

    bool iterator::operator!=(iterator const& other) const {
        return !(*this == other);
    }
    

    此实施的优势在于operator!=()operator==()一致,即使operator==()的实施已更改。

答案 1 :(得分:1)

您没有发布显示firstlast的列表实现,但我假设最后一个元素有last个点。对于迭代器,end()应将指向最后一个元素,而不是指向最后一个元素。例如,如果列表中只包含1个元素,那么从first == last开始,你的for循环将不会运行,因此begin() == end()