итератор в контейнере списка - PullRequest
1 голос
/ 23 апреля 2020

Я где-то читал, что контейнер списка реализован в виде двусвязного списка, поэтому, если это так, то как мы можем перебрать контейнер списка с помощью оператора ++ https://www.geeksforgeeks.org/introduction-iterators-c/, здесь дан этот итератор Контейнер списка является двунаправленным, что кажется понятным, но двунаправленный итератор может выполнять итерацию с использованием ++ или --, что не должно быть возможным, как если бы мы могли это сделать, тогда список будет иметь непрерывное выделение памяти, что сделает его похожим на вектор.

Я тоже пытался делать это в коде, и оказалось, что это действительно правильно сделать ++ на list<int>::iterator.

Итак, пожалуйста, скажите мне, где я ошибаюсь.

Ответы [ 2 ]

4 голосов
/ 23 апреля 2020

Итак, скажите, пожалуйста, где я не прав?

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

++ - это просто оператор, который выполняет разные операции с объектами разных типов. , Условно это делает приращение. Для целого числа это значение увеличивается на 1. В итераторе он заставляет итератор ссылаться на следующий элемент-брат. Оператор предварительного увеличения поддерживается всеми итераторами. и постинкремент поддерживается всеми входными итераторами и выходными итераторами.

Указатель является примером типа итератора. Это итератор для массивов. Как и все другие типы итераторов, он также поддерживает оператор ++.

Итераторы для всех других типов, кроме массивов, не являются указателями. Учитывая, что указатели являются единственными фундаментальными типами, которые являются итераторами, это означает, что все другие типы итераторов являются классами. Классы не имеют оператора ++ по умолчанию, но оператор может быть перегружен для классов. Итераторы должны иметь такую ​​перегрузку.

, поэтому в list::iterator есть функция operator++, которая делает this=this->next правильно?

Не совсем. this не может быть изменено. Это было бы что-то вроде this->node = this->node->next.

1 голос
/ 23 апреля 2020

Реализация итератора operator++ зависит от контейнера. Для списка итератор должен как-то отслеживать следующий и предыдущий узлы и возвращать его, когда вы делаете ++ или --.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...