Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代器end()函数不使用指针算术_C++_Templates_Pointers_Math_Iterator - Fatal编程技术网

C++ 迭代器end()函数不使用指针算术

C++ 迭代器end()函数不使用指针算术,c++,templates,pointers,math,iterator,C++,Templates,Pointers,Math,Iterator,当我运行以下命令时,我丢失了列表中的最后一个数据,并获取了以前的数据。当我添加一个计数器并尝试减去1时,我崩溃了。在此方面的任何帮助都将不胜感激 template <typename T> Iterator<T> Iterator<T>::operator--() { ptr = ptr->backward; return *this; } template <typename T> Iterator<T> Do

当我运行以下命令时,我丢失了列表中的最后一个数据,并获取了以前的数据。当我添加一个计数器并尝试减去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;
模板
迭代器迭代器::运算符--()
{
ptr=ptr->向后;
归还*这个;
}
模板
迭代器双链接列表::end()常量
{
迭代器iObj;
iObj.ptr=this->last;
iObj.capacity=此->计数;
返回iObj;
}
int main(){
双链接列表*d=新的双链接列表;
for(int i=2;i insertLast(i);
}
//获取指向列表末尾的迭代器
迭代器iter=d->end();
--iter;
//测试它是否指向第一个
检查测试(“测试仪减量#1”,20,*iter);
//测试迭代器是否可以向前移动;
--iter;
检查测试(“测试仪减量#2”,18,*iter);
//再挪一挪
对于(int i=0;i<7;i++){
--iter;
}
检查测试(“测试仪减量#3”,4,*iter);
--iter;
检查测试(“测试仪减量4”,2,*iter);
删除d;
返回0;
}

我尝试通过执行以下操作来修复它,但它崩溃了

template <typename T>
Iterator<T> DoublyLinkedList<T>::end() const
{
    Iterator<T> iObj;
    iObj.ptr = this->last + (count -1);
    iObj.capacity = this->count;
    return iObj;
}
模板
迭代器双链接列表::end()常量
{
迭代器iObj;
iObj.ptr=this->last+(计数-1);
iObj.capacity=此->计数;
返回iObj;
}
通常
end()
会返回一个无法取消引用的sentinel值。看起来您返回的是指向最后一个条目的指针,这是您的off by one错误源

作为实现者,您可以选择sentinel值,但它不应该是列表中的有效条目


顺便说一句:我不认为迭代器中有一个容量成员有什么好的理由。它是如何保持最新的?

与数组或向量不同,列表不会在内存中逐个存储其元素。 您的第一个元素可能位于某个开始地址,但下一个元素可以是开始+5,或开始-10或其他。 基本上,这意味着您不能使用指向列表元素的指针进行算术运算。
如果您想要某种类型的结束元素,我建议将列表中的最后一个元素指向
NULLPTR

this->last-1,为什么要在最后一项的地址中添加count?是什么让您认为它是一个结束的呢?
end
,传统上,表示结束后的一个,也许这就是您看到的。更重要的是,我们需要一个可复制的例子来处理这里(我们可以编译的东西)我添加了更多的代码,但不知怎么的,我在列表中输出了错误的链接1。我希望添加一个计数器会让我在最后走得更远。最终我会在右侧添加一个不可见的链接,这样我就可以通过测试访问全部容量。