空迭代器结束函数?

Dep*_*tus -1 c++ iterator

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

结尾()

LinkList::Iterator LinkList::end()
{
    return tail->next;
}
Run Code Online (Sandbox Code Playgroud)

更新

这是我的 LinkList 类。另外两个嵌套在其中。

班级

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;
};
Run Code Online (Sandbox Code Playgroud)

jmd*_*mds 5

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

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

编辑:

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

LinkList::Iterator LinkList::end() {
    return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白downvotes?答案是否正确?不要从 OP 的代表中判断,但请从内容中判断。 (2认同)
  • @Deprecitus 如果您提供迭代器类中的代码,那么帮助您会更容易:) 您的 end() 函数实际上取决于您的实现 (2认同)