奇怪的自己的迭代器行为与STL的列表相比

weird own iterator behviour compared to list from STL

本文关键字:STL 列表 自己的 迭代器      更新时间:2023-10-16

嗨,我已经实现了自己的列表和迭代器。

我的主要代码是:

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)我的begin()方法:

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

2)我的结束()方法:

  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)重载预递增运算符:

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

分析了一整天,我不知道我能做错什么。提前提醒您以获得任何形式的帮助!!

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);
}

你的end迭代器需要指向数据最后一个元素之外的东西,以与STL的end概念保持一致(所以目前你是一个矮子)。

您的 end 函数应返回列表中最终项之后的一个迭代器。目前它返回最后一项,因此您看不到所有列表项。

迭代器的正确修复应依赖于节点类的实现。例如,gcc 版本如下所示:

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