我在自己的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; }
};
答案 0 :(得分:3)
以下是我注意到的一些事情。这些是否真的能解决您的问题我不知道,因为发布的代码不完整:
iterator
应该不是从T
对象构造的,构造函数的实现应该实际做点什么(我猜想iterator::iterator(T)
这个事实什么都不做是你的实际问题)。相反,iterator
应该由Node<T>*
。operator++()
是迭代器可以递增的前提条件。如果有的话,操作员应该在启用调试设置的情况下报告误操作。last
:请注意,结束迭代器是过去最后一个元素的位置。您的比较oerators应该是const
成员,通常operator!=()
只代表operator==()
,即:
bool iterator::operator!=(iterator const& other) const {
return !(*this == other);
}
此实施的优势在于operator!=()
与operator==()
一致,即使operator==()
的实施已更改。
答案 1 :(得分:1)
您没有发布显示first
和last
的列表实现,但我假设最后一个元素有last
个点。对于迭代器,end()
应将指向最后一个元素,而不是指向最后一个元素。例如,如果列表中只包含1个元素,那么从first == last
开始,你的for循环将不会运行,因此begin() == end()
。