Каждый язык программирования имеет свои собственные инструменты, компоненты и элементы, без которых невозможна реализация функций. В Си-семействе и некоторых других ЯП есть итераторы. Это важный компоненты, которые можно не только использовать в коде, но и создавать.

Далее предстоит изучить, что собой представляет iterator. Эта информация пригодится как новичкам, так и более опытным программистам. Необходимо выяснить, для чего нужны итераторы, как их создавать и использовать на практике.

Определение

Iterator – структура данных, используемая для обращения к тем или иным элементам из STL. Интерфейс, при помощи которого можно получить доступ к компонентам коллекции (включая массивы), а также осуществлять по ним навигацию. В различных системах iterators могу иметь разные общепринятые «имена». В СУБД они описаны в качестве курсоров, в низкоуровневых языках разработки – указателями.

Функции итераторов в обобщенном программировании дают возможность реализовывать универсальные алгоритмы для работы с контейнерами. В C++ используются чаще всего с set и list. У векторов для обращения к компонентам в «изолированных блоках кода» применяются индексы.

Отличие от индексации

Iterator напоминает индексацию. Использование рассматриваемых структур данных в объектно-ориентированных контейнерах предоставляет несколько преимуществ. От индексации итераторы C отличаются:

  1. Совместимостью. Они используются не со всеми структурами данных.
  2. Предоставлением дополнительного последовательного перебора любых структур информации. Этот прием делает код более читабельным и чистым.
  3. Некоторые контейнеры позволяют вносить модификации в свои объекты без непосредственного влияния на сам итератор. Пример – когда «система» уже прошла первый компонент, можно вставить дополнительные элементы в самое начало container без нежелательных последствий. При индексации реализовать соответствующий алгоритм проблематично.

За счет последнего пункта iterator стал популярным средством разработки.

Основные типы данных

Тип данных присваивается переменным при их объявлении или инициализации. Он является важным компонентом разработки. В C++ поддерживаются различные типы данных:

  • int (или integer) – целочисленный;
  • double – с плавающей запятой двойной точности;
  • char – символьный;
  • bool – логический (булевый);
  • float – число с плавающей запятой.

Int – наиболее распространенный тип данных. Помнить поддерживаемые виды информации необходимо не только тем, кто планирует использовать итераторы, но и другим разработчикам.

Виды итераторов

Итерация – это один проход через алгоритм заданного цикла. Характеризует повторение какого-либо действия. Организация обработки данных, при которой операции многократно повторяются, не приводя к вызовам самих себя.

Итерация и итераторы цикла тесно связаны между собой. В C++ выделяют различные типы итераторов:

  1. Выход. Выходной итератор int выполняет итерацию цикла при помощи оператора ++. Записывается элемент всего один раз при помощи *.
  2. Вход. Входной итератор int выполняет итерации по последовательности при помощи ++ и считывает компонент любое количество раз через *. Их можно сравнить при помощи == и !=. После увеличения любой копии входного итератора ни одна из других не может безопасно сравниваться, переименовываться и увеличиваться.
  3. Вперед. Это переадресация по последовательности через ++. Iterator будет считывать компонент или записывать неконстантные элементы любое количество раз через *. Если нужно получить доступ к компонентам цикла, делается это через ->, сравниваются iterators через == и !=. Допускается создание сразу нескольких копий однонаправленного iterator, каждая из которых может быть модифицирована.
  4. Двунаправленный. Двунаправленный iterator способен занять место прямого итератора. Он может быть уменьшен. Доступ к членам iter и их сравнивание осуществляется точно так же, как и однонаправленные.
  5. Случайного доступа. Могут занимать места двунаправленных iterators. Позволяют использовать [] для доступа к компонентам, а также -=, +=, +- для перемещения и вычисления расстояния между iterators.

Все рассматриваемые элементы можно назначать и копировать. Это упрощенные объекты, которые нужны для передачи и возврата по значению, а не по ссылкам.

Создание

Теперь предстоит изучить азы, которые нужны программисту, если он использует класс int iter. Чтобы создать iterators, пользователю необходимо в самом начале кода подключить библиотеку <iterator>.

Итератор в Си-семействе: описание, программирование, использование

Далее для создания необходимо использовать форму записи:

<контейнер> <тип (пример – int )> :: <ключевое слово iterator без кавычек ><имя_итератора>;

Данная запись значит:

  • <контейнер> – указывается container, на который будет ссылаться рассматриваемый объект;
  • <тип> – тип контейнера (чаще всего int ).

Если указать не тот тип информации в рассматриваемом объекте, программа работать не будет. Когда контейнер является int, значит, его итератор тоже должен быть таким.

Методы начала и конца

Каждый контейнер имеет два метода, которые подобно указателям передают изучаемому объекту начало и конец. Это функции begin и end.

Begin значит перемещение iterator в самое начало контейнера. Если разработчик применил метод end, он перейдет в конец container. Система переведет «указатель» на одну ячейку больше последней.

Соответствующие методы можно использовать, не подключая класс (библиотеку) <iter>. При инициализации допускается указание на «место старта»:

Vector <int > a_vector;

Vector <int >:: iter it = a_vector.brgin();

Выше представлен фрагмент, который перенаправит пользователя на самое начало контейнера a_vector.

Работа с vector

Класс итератор может работать с vector int. Для него здесь поддерживаются такие операции как:

  1. Разыменование. В этом случае происходит обращение к значению элемента, на который указывает изучаемый объект: int x = *it.
  2. Применение инкремента it++, ++it и декремента it—, —it.
  3. Использование арифметических операций.
  4. Сравнивание на факт равенства: if (it == it2) { …
  5. Передача переменной итераторной разницы: int X = it-it2.

Использовать арифметические операции: >, <, == допускается только с идентичными объектами.  Такими, которые указывают на один и тот же container и тип (пример – int). Исключение – это создание двух iter на map.

Работа с list, map и set

Функциональность при работе с изучаемым class для list, map, set урезана. Относительно этих компонентов нельзя:

  • использовать арифметические действия;
  • сравнивать «значения».

Все остальные действия у класса итератор для list, set и map работают. Чтобы выполнять операции увеличения и уменьшения, в C++ для iter поддерживается функция advance():

Итератор в Си-семействе: описание, программирование, использование

Для увеличения используется +, для уменьшения –. Здесь можно увидеть наглядные примеры по изученной теме. А лучше и быстрее освоить ее помогут специализированные компьютерные дистанционные курсы.

P. S. Интересует разработка? Обратите внимание на курс «Программист C». Также в Otus доступно множество других современных курсов.