奇怪的自己的迭代器行为与STL的列表相比
weird own iterator behviour compared to list from 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)我的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); }
相关文章:
- 如何检查C ++ STL列表是否为回文?
- 清除 C++ 中的指针的 STL 列表
- 在Visual Studio 2013中编译的STL列表代码在Visual Studio 2019中给出了错误.想知道原
- 使用.txt文件填充 STL 列表不起作用
- 为 STL 列表编写选择排序
- 如何从 STL 列表中删除结构记录
- C++如何将 STL 列表传递给函数
- 漂亮的打印不适用于C ++ STL列表
- 在C++中,是否可以引用像C++中的stl列表这样的数据结构部分
- 如何根据STL列表中的元素数量分配内存
- 我怎么知道,如果我在 STL 列表中找到了我搜索的号码
- 打印列表列表C++ STL 列表
- 我们可以在穿越时插入STL列表吗?
- 使用 c++ 的 STL 列表 ..在传递列表指针的数组中
- 使用 C++11 迭代语法时从 STL 列表中删除
- 如何使用静态 stl 列表的迭代器
- 如何更改 stl 列表中项的值
- STL列表,删除所有奇数
- 如何将函数中的stl列表传递为C 中的参数
- 如何将结构添加到STL列表中