Почему обратный итератор не является формальной категорией итератора согласно стандарту C ++ 17? - PullRequest
4 голосов
/ 18 марта 2019

Обратного итератора нет в списке тегов категории итератора, поэтому, предположительно, это не категория. Так что же это такое?

Ответы [ 2 ]

18 голосов
/ 18 марта 2019

Категории итераторов кодируют уровни функциональности .

  • Итератор ввода - это минимальное минимальное значение - увеличиваемое и разыменованное один раз
  • Прямой итератор - это входной итератор, который можно разыменовывать несколько раз, и он поддерживает многопроходность.
  • Двунаправленный итератор - это прямой итератор, который можно уменьшить
  • Итератор с произвольным доступом - это двунаправленный итератор, который вы можете O (1) продвинуть на +/- n
  • Непрерывный итератор - это итератор с произвольным доступом, который ссылается на непрерывную память

Эти уровни функциональности используются алгоритмами - некоторые алгоритмы требуют определенного уровня функциональности, некоторые алгоритмы могут просто оптимизироваться на основе определенных уровней функциональности (например, advance(it, n) для итераторов произвольного доступа может просто it += n, тогда как для прямых итераторов это должно быть ++it в цикле).

Но «обратное» - это не уровень функциональности, это просто другой способ представления базовых данных. Обращенный итератор не заслуживает своей собственной категории итераторов по той же причине, по которой итератор «move» не делает, или «фильтрованный» итератор не делает, или «посчитанный» итератор - нет. Алгоритмы не заботятся, обращены ли итераторы или нет - они работают одинаково в любом случае. Не важно, каким образом ++it фактически перемещает итератор.

Обратные итераторы - это просто итераторы. std::reverse_iterator известен как адаптер итератора (наряду с кучей других, таких как std::move_iterator) - это итератор, который адаптирует другой итератор. Но вы могли бы написать обратный итератор, который не является адаптером - действительно, вы могли бы даже написать обратный итератор, который не является двунаправленным! Эти два понятия ортогональны.

8 голосов
/ 18 марта 2019

так что предположительно это не категория.

Ваше предположение верно. Обратный итератор не является категорией итераторов.

Так что же это такое?

Стандарт определяет std::reverse_iterator как:

Шаблон класса reverse_iterator - это адаптер итератора, который выполняет итерацию с конца определенной последовательности его основным итератором в начале этой последовательности. Принципиальная связь между реверсом итератор и соответствующий ему итератор i определяются тождеством: & (reverse_iterator (i)) == & (i - 1).

Категория итератора std::reverse_iterator<Iterator> - это категория итератора Iterator.


Аналогичным образом, другие адаптеры итераторов, такие как итераторы перемещения, итераторы фильтра, итераторы шага и т. Д., Также не являются категориями итераторов.

...