【发布时间】:2015-06-01 16:06:47
【问题描述】:
假设链表是这样定义的:
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;
此循环一直计数,直到最后一个项目成员之前的一个项目成员。因此,此列表的最后一个成员不计入此循环。如何解决?
【问题讨论】:
-
template <typename Object>在struct Node之前?或者Object是什么? -
@mnciitbhu 我避免放置整个代码。我只是放了必要的代码。问题来自列表和迭代器。对象可以是任何类。没关系。
-
iterator begin(){return iterator(head->next);看起来不对(头部和尾部是否持有有效数据?这些是哨兵节点吗?) -
最后一个成员对你来说到底是什么? nullptr 还是它之前的那个?
-
@zahmati
tail is pointing to the actual last member.所以你当然不会到达最后一个条目,因为那是你编码的。end迭代器是尾部,你的循环说“继续前进,直到你到达尾部”。也许重新考虑一下你的设计?