空的迭代器结束函数?

问题描述:

据我所知,迭代器的结束函数应该返回null。当我尝试返回nullptr时,程序崩溃。有人可以解释结束函数应该如何表现吗?空的迭代器结束函数?

末()

LinkList::Iterator LinkList::end() 
{ 
    return tail->next; 
} 

更新

这是我的链表类。其他两个嵌套在里面。

class LinkList 
{ 
public: 

class Node 
{ 
public: 
    Node() 
    { 
     next = prev = NULL; 
    } 
    Node(int num) 
    { 
     data = num; next = prev = NULL; 
    } 

    int data; 
    Node *next; 
    Node *prev; 
}; 

class Iterator 
{ 
public: 
    Iterator(Node* ptr); 
    Iterator operator ++(); 
    int operator *(); 
    bool operator ==(Iterator it); 
    bool operator !=(Iterator it); 
    Node *ptr; 
}; 

public: 
    LinkList(); 
    virtual ~LinkList(); 
    LinkList(const LinkList& other); 
    LinkList& operator=(LinkList& other); 

    bool insert(int num); 
    void insert(const initializer_list<int>& il); 

    void merge(LinkList & src); 
    Iterator *it; 
    Iterator begin(); 
    Iterator end(); 

    int size(); 
    void clear(); 

private: 
    Node *head, *tail, *temp; 
    int count; 
}; 
+1

你明白错了。 –

+0

这里有很多细节。迭代器高度依赖于它们正在迭代的容器。不过,我看到一个'LinkList'类型。嗯...... – InternetAussie

+1

'end()'函数应该返回一个有效的迭代器,它代表它正在迭代的任何元素的末尾*。 – Galik

一个迭代的结束功能可能会或可能不会返回nullptr,这取决于您的实现。例如,STL向量的end()函数“指向”矢量最后一个元素之后的位置。

从你提供的代码,我不能说是什么导致你的程序崩溃,但我敢打赌,当你调用end()函数时,“tail”是nullptr。检查是否是这种情况。

编辑:

看到你下课后,我同意你的迭代器:: end()函数将返回nullptr。在你的实现中,你返回tail-> next,实际上它应该是nullptr,但是如果tail本身是nullptr(即你的列表中没有节点),你的程序将会崩溃,因为你试图访问一个对象的成员那是空的。 只要做:

LinkList::Iterator LinkList::end() { 
    return nullptr; 
} 
+0

运行gdb后,分段错误是由于tail返回nullptr造成的。那么,一个人应该怎么样? – Deprecitus

+2

我不明白downvotes?答案是正确的?请不要从OP的代表判断,但内容请。 –

+0

@Deprecitus它依赖于实现:如果你的链表使用''nulltpr''作为末尾标记,那么你可能想要返回''nullptr''。 – nefas