据我了解,迭代器的结束函数应该返回 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)
迭代器的结束函数可能会也可能不会返回 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)