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

Я бы предложил использовать что-то более ясное (особенно думая, кому нужно будет поддерживать код) ... как насчет:

var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
               formats
                 .replace(/([\(\)])/g, "\\$1")
                 .replace(/9/g,"\\d") +
               ")$");

, где регулярное выражение построено из прозрачного шаблона? Добавление нового было бы без проблем, и даже сам клиент мог бы сделать это на странице «Параметры».

4
задан Nathan Doromal 18 March 2019 в 17:07
поделиться

2 ответа

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

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

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

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

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

Категория итераторов в std::reverse_iterator<Iterator> является категорией итераторов в Iterator.


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

0
ответ дан eerorika 18 March 2019 в 17:07
поделиться

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

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

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

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

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

0
ответ дан Barry 18 March 2019 в 17:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: