Введение в Iterator в C ++

Обход ваших очень сложных данных, хранящихся в различных типах контейнеров, таких как массив, вектор и т. Д., За наименьшее время выполнения возможен благодаря итератору в C ++, компоненту стандартной библиотеки шаблонов (STL). Не волнуйтесь, это просто указатель, похожий на объект, но он умный, потому что не имеет значения, какой контейнер вы используете, он сделает ваш алгоритм независимым от типа контейнера, предоставляя общий интерфейс для всех типов контейнеров, таких как мост между алгоритм и контейнер. Итератор не только уменьшает сложность программы, но и значительно ускоряет выполнение.

Например, алгоритм sort (), который имеет два параметра, итератор окончания и запуска, будет выполнять сортировку по порядку независимо от того, какой тип контейнера вы используете. Итератор позволяет применять универсальные алгоритмы к структурам данных. Структуры данных могут использовать итератор для представления диапазона элементов.

Операции с использованием итератора

  • begin (): эта функция вернет итератор, указывающий на первый элемент контейнера.
  • end (): эта функция вернет итератор, указывающий на последний последний элемент контейнера.
  • advance (): эта функция будет увеличивать позицию итератора до указанного аргумента.
  • next (): эта функция вернет новый итератор, который будет указан итератором после увеличения позиций в аргументах.
  • previous (): эта функция возвратит новый итератор, который будет указан итератором после уменьшения позиций в аргументах.
  • insertter (): эта функция вставит элемент в любую позицию контейнера.

Практическая реализация

1. C ++ код для реализации итератора

Код

#include
#include
#include
using namespace std;
int main()
(
//Declaring a Vector
std::vector v(1, 2, 3, 4, 5, 6, 7);
//Declaring Iterator
vector::iterator i;
//Function for iterating through vector elements
for(i=v.begin();i!=v.end();i++)
(
std::cout << *i <<" ";
)
return 0;
)

Выход:

2. C ++ код для демонстрации функциональности итератора

Код

#include
#include
#include
using namespace std;
int main()
(
//Declaring a Vector
vector v(1, 2, 3, 4, 5, 6, 7, 8);
//Declaring Iterator
vector::iterator i;
//Function
v.insert(v.begin()+1, 10);
for(i=v.begin();i!=v.end();i++) (
cout << *i <<" ";
)
return 0;
)

Выход:

Категории итераторов

Начиная с C ++ 17, существует 5 различных типов итераторов, которые можно классифицировать в зависимости от типа функциональности, как показано на блок-схеме ниже:

  • Input Iterator (stdin) : из-за ограниченной функциональности они являются самыми слабыми из всех итераторов с функциями только для чтения и продвижения вперед. Он не может изменить значение контейнера. Оператор разыменования (*), оператор неравенства (! =), Оператор приращения (++) и оператор равенства (==) могут использоваться в качестве входных итераторов. Также для последовательных операций ввода.
  • Выходной Итератор (stdout): Итератор только для хранения, итератор только для записи, который используется для изменения значения контейнера. Они также имеют очень ограниченную функциональность. Итератор не может получить доступ к элементу. Оператор присваивания (=) и оператор приращения (++) могут использоваться в качестве выходных итераторов. Только в однопроходном алгоритме.
  • Прямой итератор (односвязный список): этот итератор содержит функциональные возможности итераторов ввода и вывода. Он может двигаться вперед в одном направлении за раз. Для чтения и записи в контейнер это наиболее предпочтительный итератор, который поддерживает повторное использование и сохранение. Поддерживаются все вышеперечисленные операторы.
  • Двунаправленный итератор (двусвязный список): поскольку название уже предлагает двунаправленный, что делает его сильнее, чем вышеупомянутые итераторы. Он также поддерживает чтение и запись в контейнер. Поддерживает оператор Decrement (-).
  • Итератор произвольного доступа (массивы): самый сильный итератор является самым мощным итератором, так как он может читать, записывать и иметь произвольный доступ. Указатель как функциональность, как сложение и вычитание указателя.

Преимущества Iterator в C ++

Если вам нужно перейти от одного элемента, этот итератор в данный момент указывает на другой элемент, который потенциально находится на расстоянии n шагов от вашего текущего итератора. На первые четыре в иерархии потребуется линейное количество времени, в то время как итератор с произвольным доступом может делать это в постоянное время, и это гораздо более увлекательно, потому что именно там экономится время. Это самая важная функция, которую предоставляет Iterator. Некоторые другие упомянуты ниже

  • Эффективность кода: если у нас есть P видов контейнеров данных и Q вещей, которые мы хотим с ними сделать, то в итоге мы напишем алгоритмы P * Q. Если данные также имеют R различных типов, то мы можем в конечном итоге использовать алгоритм P * Q * R. Таким образом, используя итераторы, мы можем сделать это в алгоритме P + Q. Мы сэкономили 90% времени и работы. Вывод эффективности кода на новый уровень. Концепция эффективности заключается в том, что итератор ввода по исходному и выходной итератор по целевой последовательности не обязательно должен быть одного типа.
  • Динамическая обработка. Итераторы имеют динамические функции, такие как обмен в одном и том же контейнере, назначение с копированием, увеличение, разыменование и уменьшение. Итератор предоставляет функциональные возможности для удаления и динамического добавления элементов в контейнер. Поскольку все итераторы могут быть увеличены, входные итераторы могут сравниваться и разыменовываться до значения. Двунаправленные итераторы могут быть уменьшены. Основной аспект - написать одну функцию и использовать ее для любого контейнера.

Недостатки Итератора в C ++

  • Вы не можете переходить из одной структуры данных в другую одновременно каким-то сложным способом. Итератор не будет работать в этом случае.
  • Если вы обрабатываете список и что-то забыли, а теперь хотите вернуться назад, вы не сможете, потому что итераторы не будут работать таким образом.
  • В случае, если вам нужно обновить структуру во время обхода, вы тоже не сможете этого сделать из-за способа сохранения своей позиции итератором.

Вывод

При использовании итераторов всегда помните об этих двух вещах, чтобы сделать код эффективным. Всегда передавайте итератор в функцию вместо контейнеров. Вы никогда не должны возвращать контейнеры вместо return или pass итератор. Вы можете получить любой элемент, используя итератор, разыменование и передачу пары итераторов в алгоритм

Рекомендуемые статьи

Это руководство к Итератору в C ++. Здесь мы обсуждаем операции в итераторе, категории, преимущества и недостатки с кодами и выходными данными. Вы также можете просмотреть другие наши статьи, чтобы узнать больше-

  1. Массивы в C ++
  2. Что такое C ++
  3. Функции массива C ++
  4. Циклы в C ++
  5. PHP Array Функции | Типы функций массива в PHP