2016-05-31 92 views
0

嗨,我已經實現了我自己的列表和迭代器。奇怪的自己的迭代器behviour相比,從STL列表

我的主要代碼:

List<int> myList; 
myList.push_back(1); 
myList.push_back(2); 
myList.push_back(3); 

cout << std::string(30, '-') << endl; 
//this shows 1 2 
for(List<int>::iterator it = myList.begin() ; it != myList.end() ; ++it){ 
    cout << *it << " "; 
} 
cout << endl; 

//The same using stl shows 1 2 3 !!!??? 
list<int> myListSTL; 
myListSTL.push_back(1); 
myListSTL.push_back(2); 
myListSTL.push_back(3); 
cout << std::string(30, '-') << endl; 
for(list<int>::iterator it = myListSTL.begin() ; it != myListSTL.end() ; ++it){ 
    cout << *it << " "; 
} 
cout << endl; 

我實現所有的方法爲自己的迭代器。 對於我自己的實現輸出爲:1 2 對於從STL實現輸出列表是:1 2 3

1)我開始()方法:

template<class T> 
typename List<T>::iterator List<T>::begin(){ 
    return iterator(head); 
} 

2)我的end()方法:

template<class T> 
typename List<T>::iterator List<T>::end(){ 
    Node * current = head; 
    while(current->next) 
     current = current->next; 
    return iterator(current); 
} 

3)重載操作!=

template<class T> 
const bool List<T>::iterator::operator!=(const iterator & it){ 
    return (node != it.node); 
} 

4)overloa ded preincrement operator:

template<class T> 
typename List<T>::iterator List<T>::iterator::operator++(){ 
    if(node->next){ 
     node = node->next;  
    } 
    return iterator(node); 
} 

我分析了這一整天,我不知道我能做什麼錯。 Thak您提前任何形式的幫助!

回答

0

end方法應該返回一個迭代過去列表的末尾(不是一個迭代的最後一個元素),所以一般:

template<class T> 
typename List<T>::iterator List<T>::end(){ 
    Node * current = head; 
    while(current->next) 
     current = current->next; 
    return iterator(current); 
} 

應該簡單地成爲這個:

template<class T> 
typename List<T>::iterator List<T>::end(){ 
    return iterator(0); 
} 

然後取出支票operator++使++it會得到你的iterator(0)如果你是最後一個元素(這是你想要的):

template<class T> 
typename List<T>::iterator List<T>::iterator::operator++(){ 
    node = node->next;  
    return iterator(node); 
} 
+0

謝謝您的解決方案!我只是不知道STL的想法,關於在最後的元素後指出! –

0

您的end迭代器需要指向數據的最後一個元素之外的某個元素,以符合STL的end(因此您目前只有一條短)的概念。

+0

謝謝你,我有想法,但如果我最後所返回>下一頁這是NULL,所以我怎麼能比較與++它與這個NULL? –

0

您的end函數應該爲列表中的最後一項返回一個迭代器。目前它返回最後一個項目,所以你沒有看到所有的列表項。

您的迭代器的正確修復應該依賴於您的節點類的實現。例如gcc版本如下所示:

iterator 
    end() _GLIBCXX_NOEXCEPT 
    { return iterator(&this->_M_impl._M_node); }