当我运行以下内容时,我会错过列表中的最后一个数据并获取以前的数据。当我添加一个计数器并试图减去1时我崩溃了。对此有任何帮助将非常感激。
template <typename T>
Iterator<T> Iterator<T>::operator--()
{
ptr = ptr->backward;
return *this;
}
template <typename T>
Iterator<T> DoublyLinkedList<T>::end() const
{
Iterator<T> iObj;
iObj.ptr = this->last;
iObj.capacity = this->count;
return iObj;
}
int main() {
DoublyLinkedList<int> *d = new DoublyLinkedList<int>;
for (int i = 2; i <= 20; i += 2) {
d->insertLast(i);
}
//Get an Iterator which points at the end of the list
Iterator<int> iter = d->end();
--iter;
//Test that it does point to the first
checkTest("testIteratorsDecrement #1", 20, *iter);
//Test that our Iterator can move forward;
--iter;
checkTest("testIteratorsDecrement #2", 18, *iter);
//move it some more
for (int i = 0; i < 7; i++) {
--iter;
}
checkTest("testIteratorsDecrement #3", 4, *iter);
--iter;
checkTest("testIteratorsDecrement #4", 2, *iter);
delete d;
return 0;
}
我尝试通过执行以下操作来修复它,但它崩溃了。 count是受保护的int。
template <typename T>
Iterator<T> DoublyLinkedList<T>::end() const
{
Iterator<T> iObj;
iObj.ptr = this->last + (count -1);
iObj.capacity = this->count;
return iObj;
}
答案 0 :(得分:1)
通常end()
会返回一个无法解除引用的标记值。看起来你正在返回指向最后一个条目的指针,这是你的一个一个错误的来源。
作为实现者,您可以选择您的标记值,但它不应该是列表中的有效条目。
顺便说一句:我没有看到在迭代器中拥有容量成员的充分理由。它是如何保持最新的?
答案 1 :(得分:0)
与数组或向量不同,list不会将其元素逐个存储在内存中。
您的第一个元素可能位于某个开始地址,但下一个元素可以是开始 +5,或开始 -10或其他内容。
基本上,这意味着您无法使用指向列表元素的指针进行算术运算。
如果您想要某种类型的结束元素,我建议您将列表的最后一个元素指向NULLPTR