Зачем нужны разные категории итераторов?

Зачем реализовывать итераторы типа output или forward если можно просто использовать random access iterator?


Ответы (1 шт):

Автор решения: AR Hovsepyan

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

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

  • В случае перегрузки, компилятор мог различить алгоритмы, основываясь на категории итераторов. Например для того, чтобы определить расстояние между элементами, написан обобщенный алгоритм std::distance. Но для разных контейнеров пришлось бы написать различные версии алгоритма, а вместо этого написаны можно написать перегрузки функции_помощника, имеющий в аргументах категорию итераторов(для одних(очереди) вы можете пройти только операцией ++ и результат хранить в счетчике а для других можно просто взять разницу указателей), и вызвать эту функцию. И тогда компилятор сам определит какую из версий перегрузки вызвать для различных контейнеров.
  • Использование категорий итераторов позволяет скрыть детали реализации за соответствующим интерфейсом. Они дают понятия: №1 тут можно только читать по очереди, №2 это для тех последовательностей, где можно только записывать(поток ввода) №3 тут можно и то и другое, а №4 можно получить доступ к произвольному элементу. И эти категории подсказывают для каких типов последовательностей написан конкретный алгоритм(функция).

P.S. "Я не могу позволить какому то сотруднику стать директором, пока он не прошел все стадии для получения этой должности..."

→ Ссылка