Итератор: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
→‎Генераторы: err, {{falseredirect|Генератор (программирование)}}
→‎Описание: последовательность, викификация
Строка 5:
 
== Описание ==
Главное предназначение итераторов заключается в предоставлении возможности пользователю обращаться к любому элементу контейнера при сокрытии внутренней структуры контейнера от пользователя. Это позволяет контейнеру хранить элементы любым способом при допустимости работы пользователя с ним как с простой последовательностью или [[Список (информатика)|списком]]. Проектирование класса итератора обычно тесно связано с соответствующим классом контейнера. Обычно контейнер предоставляет методы создания итераторов.
Итератор похож на [[Указатель (тип данных)|указатель]] своими основными операциями: он указывает на отдельный элемент коллекции объектов (предоставляет ''доступ к элементу'') и содержит функции для перехода к другому элементу списка (следующему или предыдущему). Контейнер, который реализует поддержку итераторов, должен предоставлять первый элемент списка, а также возможность проверить, перебраны ли все элементы контейнера (является ли итератор конечным). В зависимости от используемого языка и цели итераторы могут поддерживать дополнительные операции или определять различные варианты поведения.
 
Итератор похож на  [[Указатель (тип данных)|указатель]]  своими основными операциями: он указывает на отдельный элемент коллекции объектов (предоставляет  ''доступ к элементу'') и содержит функции для перехода к другому элементу списка (следующему или предыдущему). Контейнер, который реализует поддержку итераторов, должен предоставлять первый элемент списка, а также возможность проверить, перебраны ли все элементы контейнера (является ли итератор конечным). В зависимости от используемого языка и цели, итераторы могут поддерживать дополнительные операции или определять различные варианты поведения.
Главное предназначение итераторов заключается в предоставлении возможности пользователю обращаться к любому элементу контейнера при сокрытии внутренней структуры контейнера от пользователя. Это позволяет контейнеру хранить элементы любым способом при допустимости работы пользователя с ним как с простой последовательностью или списком. Проектирование класса итератора обычно тесно связано с соответствующим классом контейнера. Обычно контейнер предоставляет методы создания итераторов.
 
Иногда итератором цикла называют [[счётчик цикла]] называют «итератором цикла». Тем не менее, счётчик цикла обеспечивает только перебор элементов, но не доступ к элементу.
 
=== Отличия от индексации ===
В [[Процедурное программирование|процедурных языках программирования]] широко используется индексация, основанная на  [[Счётчик цикла|счётчике цикла]]  для перебора всех элементов последовательности, (например,  [[Массив (программирование)|массива]]). Хотя индексация может использоваться совместно с некоторыми объектно-ориентированными контейнерами, использование итераторов даёт свои преимущества:
* Индексация не подходит для некоторых структур данных, в частности, для структур данных с медленным  [[Произвольный доступ|произвольным доступом]]  или вообще без поддержки такового (например,  [[Список (информатика)|список]]  или  [[Дерево (структура данных)|дерево]]).
 
* Итераторы предоставляют возможность последовательного перебора любых структур данных, поэтому делают код более читаемым, удобным для повторного использования и менее чувствительным к изменениям структур данных.
Строка 20:
 
* Некоторые контейнеры могут предоставлять возможность модифицировать свои объекты без влияния на сам итератор. Например, после того, как итератор уже «прошёл» первый элемент, можно вставить дополнительные элементы в начало контейнера без каких-либо нежелательных последствий. При использовании индексации это проблематично из-за смены номеров индексов.
Возможность модификации контейнера во время итерации его элементов стала необходимой в современном  [[Объектно-ориентированное программирование|объектно-ориентированном программировании]], где взаимосвязи между объектами и последствия выполнения операций могут быть не слишком очевидными. Использование итератора избавляет от этих видов проблем.
 
=== Неявные итераторы ===