2015-06-01 4 views
0

Предполагая, связанный список определяется следующим образом:цикл итератора не считается последний элемент

template <typename Object> 
struct Node{ 
    Object data; 
    Node *prev; 
    Node *next; 

    Node(const Object & d = Object(), Node *p = NULL, Node *n = NULL) 
    : data(d), prev(p),next(n){} 
}; 

template <typename Object> 
class List 
{ 
public: 
    iterator begin(){return iterator(head->next);} 
    iterator end(){return iterator(tail);} 
.... 
private: 
    Node *head=nullptr; 
    Node *tail=nullptr; 
... 

Итераторов:

class iterator 
{ 
public: 
    iterator():current(NULL){} 
    Object & operator*(){return retrieve();} 
    iterator & operator++() 
    { 
     current = current->next; 
     return *this; 
    } 
    .... 
private: 
    Node *current; 
    ... 

Существует проблема в этом коде.

for(iterator<Object> itr = list.begin(); itr != list.end(); itr++) 
    std::cout<<(*itr)->name; 

Эта петля считается до элемента одного элемента до последнего. Таким образом, последний член этого списка не учитывается в этом цикле. Как это исправить?

+0

'template ' before 'struct Node'? или что такое «объект»? – mnciitbhu

+0

@mnciitbhu Я избегал сдачи всего кода. Я просто поместил нужный код. Проблема заключается в списке и итераторе. Объектом может быть любой класс. Это не имеет значения. – zahmati

+0

'iterator begin() {return iterator (head-> next);' выглядит неправильно (Головной и хвост держит действительные данные? Являются ли эти дозорные узлы?) –

ответ

5

Ваш «конечный» итератор является указателем на последний элемент. Это неверно.

Предполагается, что это должно быть "one past" the last element.

+0

. Должен ли быть конец nullptr? – zahmati

Смежные вопросы