【问题标题】:Iterator end() function not working with pointer arithmetic迭代器 end() 函数不适用于指针算术
【发布时间】:2017-02-21 23:09:29
【问题描述】:

当我运行以下命令时,我错过了列表中的最后一个数据并获取了以前的数据。当我添加一个计数器并尝试减去 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;
}

【问题讨论】:

  • this->last - 1,你为什么要在最后一项的地址上加上count?
  • 是什么让你觉得它差了一个? end,按照惯例,代表一个结束,也许这就是你所看到的。更重要的是,我们需要一个可重现的示例来使用(我们可以编译的东西)
  • 我添加了更多代码,但不知何故我在列表中输出了错误的链接 1。我希望添加一个计数器能让我在最后更进一步。

标签: c++ templates pointers math iterator


【解决方案1】:

通常end() 会返回一个无法取消引用的标记值。看起来您正在返回一个指向最后一个条目的指针,这是您的错误的来源。

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

顺便说一句:我认为迭代器中没有容量成员的充分理由。它是如何保持最新的?

【讨论】:

  • 最后我要在右侧添加一个不可见的链接,这样我就可以通过测试访问全部容量。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2021-05-12
    相关资源
    最近更新 更多