Категории итераторов кодируют уровни функциональности .
- Итератор ввода - это минимальное минимальное значение - увеличиваемое и разыменованное один раз
- Прямой итератор - это входной итератор, который можно разыменовывать несколько раз, и он поддерживает многопроходность.
- Двунаправленный итератор - это прямой итератор, который можно уменьшить
- Итератор с произвольным доступом - это двунаправленный итератор, который вы можете O (1) продвинуть на +/-
n
- Непрерывный итератор - это итератор с произвольным доступом, который ссылается на непрерывную память
Эти уровни функциональности используются алгоритмами - некоторые алгоритмы требуют определенного уровня функциональности, некоторые алгоритмы могут просто оптимизироваться на основе определенных уровней функциональности (например, advance(it, n)
для итераторов произвольного доступа может просто it += n
, тогда как для прямых итераторов это должно быть ++it
в цикле).
Но «обратное» - это не уровень функциональности, это просто другой способ представления базовых данных. Обращенный итератор не заслуживает своей собственной категории итераторов по той же причине, по которой итератор «move» не делает, или «фильтрованный» итератор не делает, или «посчитанный» итератор - нет. Алгоритмы не заботятся, обращены ли итераторы или нет - они работают одинаково в любом случае. Не важно, каким образом ++it
фактически перемещает итератор.
Обратные итераторы - это просто итераторы. std::reverse_iterator
известен как адаптер итератора (наряду с кучей других, таких как std::move_iterator
) - это итератор, который адаптирует другой итератор. Но вы могли бы написать обратный итератор, который не является адаптером - действительно, вы могли бы даже написать обратный итератор, который не является двунаправленным! Эти два понятия ортогональны.