Как итераторы и указатели связаны?

Код с итераторами в значительной степени походит на код с указателями. Итераторы имеют некоторый неясный тип (как std::vector<int>::iterator например).

То, что я не получаю, - то, как итераторы и указатель связаны друг с другом - действительно ли итератор является оберткой вокруг указателя с перегруженными операциями для усовершенствования к смежным элементам или является им что-то еще?

35
задан David M 28 April 2010 в 09:28
поделиться

4 ответа

Итераторы - это обобщение указателей.

Итератор (в зависимости от вариантов) должен реализовывать * и ++

Итак, указатель ЯВЛЯЕТСЯ итератором. Но не обязательно наоборот.

Если вы хотите перебрать сложную структуру (дерево, граф ...), итератор будет намного больше, чем указатель, и не будет ссылаться на какое-либо реальное место в оперативной памяти.

51
ответ дан 27 November 2019 в 06:56
поделиться

Итератор - это просто тип, который предоставляет требуемый интерфейс. для итераторов - они различны для разных типов итераторов и указаны в разделе 24.1 стандарта C ++ (Требования к итераторам).

Как реализуются итераторы, зависит от того, что они повторяют - для векторов они обычно являются оболочкой вокруг единственного указателя на массив (в любом случае в сборках релизов), для более сложных контейнеров они имеют более сложную реализацию. Для открытых диапазонов они будут содержать состояние любого алгоритма, который используется для генерации элементов.

Обратите внимание, что указатель на элемент в массиве соответствует требованиям итератора с произвольным доступом, поэтому до некоторой степени они взаимозаменяемы.

4
ответ дан 27 November 2019 в 06:56
поделиться

Концептуально да - но они не обязательно должны быть указателями. Их внутреннее устройство и возможности будут зависеть от структуры данных, которую они «оборачивают».

Поэтому существуют разные «классы» итераторов . Например. Однонаправленный, двунаправленный, случайный доступ и т. Д.

Некоторые из них могут иметь несколько классов.

Например. если внутренняя структура представляет собой красно-черное дерево или связанный список, итераторы могут быть двунаправленными, но не случайным доступом. Если они оборачивают вектор (реализованный как массив), у вас будет RandomAccess и Bidirectional.

7
ответ дан 27 November 2019 в 06:56
поделиться

Итераторы - это объекты, которые перегружают определенные операторы, поэтому их использование будет выглядеть так, как если бы они были указателями. Это в пределах возможностей данной категории итераторов. Итераторы произвольного доступа полностью похожи на указатели, другие типы итераторов не предоставляют некоторых операций (например, list :: iterator , который является двунаправленным, не имеет оператора + = среди многие другие, для которых потребуется произвольный доступ).

Что касается «непонятных имен», то использование простого указателя для итератора не совсем немыслимо:

 template <class T>
 class MyContainer
 {
     ...
     typedef T* iterator;
 }

 MyContainer<int>::iterator it; //the type is really int*
9
ответ дан 27 November 2019 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: