Зачем нужны разные категории итераторов?
Зачем реализовывать итераторы типа output или forward если можно просто использовать random access iterator?
Ответы (1 шт):
Во первых не правильно оформлена заголовка вопроса(я позволю себе исправить). Речь ведь не о разных итераторов, а о разных категорий итераторов.
Итератор, это некая абстракция, имеющая конкретные свойства, и одним из этих свойств является его категория. Категория итераторов позволяет проходить по последовательности каким то конкретным(например стеки, очереди, потоки, списки... ) или произвольным способом (массивы, вектора...). Эти категории представляют классы, и они нужны для того, чтобы:
- В случае перегрузки, компилятор мог различить алгоритмы, основываясь
на категории итераторов. Например для того, чтобы определить
расстояние между элементами, написан обобщенный алгоритм
std::distance. Но для разных контейнеров пришлось бы написать
различные версии алгоритма, а вместо этого написаны можно написать
перегрузки функции_помощника, имеющий в аргументах категорию
итераторов(для одних(очереди) вы можете пройти только операцией
++и результат хранить в счетчике а для других можно просто взять разницу указателей), и вызвать эту функцию. И тогда компилятор сам определит какую из версий перегрузки вызвать для различных контейнеров. - Использование категорий итераторов позволяет скрыть детали реализации за соответствующим интерфейсом. Они дают понятия: №1 тут можно только читать по очереди, №2 это для тех последовательностей, где можно только записывать(поток ввода) №3 тут можно и то и другое, а №4 можно получить доступ к произвольному элементу. И эти категории подсказывают для каких типов последовательностей написан конкретный алгоритм(функция).
P.S. "Я не могу позволить какому то сотруднику стать директором, пока он не прошел все стадии для получения этой должности..."