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

标签: c++ templates iterator


【解决方案1】:

您的“结束”迭代器是指向最后一个元素的指针。错了。

应该是"one past" the last element

【讨论】:

  • 那么 end 应该是 nullptr 吗?
猜你喜欢
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2011-07-11
  • 2016-08-25
相关资源
最近更新 更多