2017-02-21 49 views
-2

Когда я запускаю следующее, я пропускаю последние данные в списке и получаю предыдущие данные. Когда я добавляю счетчик и пытаюсь вычесть на 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; 
} 
+3

this-> last - 1, почему вы добавляете счет в адрес последнего элемента? – Hal

+0

Что заставляет вас думать, что это одно? «end», условно, представляет собой один конец, возможно, это то, что вы видите. Более того, нам нужен воспроизводимый пример для работы с ним (что-то, что мы можем скомпилировать) – OMGtechy

+0

Я добавил больше кода, но я как-то вывел неверную ссылку в списке на 1. Я надеялся, что добавление счетчика поставит меня дальше в конце. – HamHat

ответ

1

Обычно end() возвратит значение дозорного, который не может быть разыменованным. Похоже, вы возвращаете указатель на последнюю запись, которая является источником вашей ошибки «один за другим».

В качестве разработчика вы можете выбрать значение своего дозорного, но оно не должно быть действительной записью в списке.

В стороне: я не вижу веской причины иметь член емкости в итераторе. Как он обновляется?

+0

В конце концов я собираюсь добавить невидимую ссылку с правой стороны, чтобы я мог получить доступ к полной емкости с помощью тестов. – HamHat

0

В отличие от массивов или векторов, список не сохраняет свои элементы по одному в памяти. Ваш первый элемент может быть в некотором начинаются адрес, но следующий элемент может быть начало +5, или начало -10 или что-то еще. В принципе, это означает, что вы не можете выполнять арифметические операции с указателями на элементы вашего списка. Если вы хотите получить какой-либо конечный элемент, я бы предложил сделать последний элемент вашего списка, чтобы указать на NULLPTR

Смежные вопросы