空的迭代器结束函数?
据我所知,迭代器的结束函数应该返回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;
};
一个迭代的结束功能可能会或可能不会返回nullptr,这取决于您的实现。例如,STL向量的end()函数“指向”矢量最后一个元素之后的位置。
从你提供的代码,我不能说是什么导致你的程序崩溃,但我敢打赌,当你调用end()函数时,“tail”是nullptr。检查是否是这种情况。
编辑:
看到你下课后,我同意你的迭代器:: end()函数将返回nullptr。在你的实现中,你返回tail-> next,实际上它应该是nullptr,但是如果tail本身是nullptr(即你的列表中没有节点),你的程序将会崩溃,因为你试图访问一个对象的成员那是空的。 只要做:
LinkList::Iterator LinkList::end() {
return nullptr;
}
运行gdb后,分段错误是由于tail返回nullptr造成的。那么,一个人应该怎么样? – Deprecitus
我不明白downvotes?答案是正确的?请不要从OP的代表判断,但内容请。 –
@Deprecitus它依赖于实现:如果你的链表使用''nulltpr''作为末尾标记,那么你可能想要返回''nullptr''。 – nefas
你明白错了。 –
这里有很多细节。迭代器高度依赖于它们正在迭代的容器。不过,我看到一个'LinkList'类型。嗯...... – InternetAussie
'end()'函数应该返回一个有效的迭代器,它代表它正在迭代的任何元素的末尾*。 – Galik