Я бы предложил использовать что-то более ясное (особенно думая, кому нужно будет поддерживать код) ... как насчет:
var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
formats
.replace(/([\(\)])/g, "\\$1")
.replace(/9/g,"\\d") +
")$");
, где регулярное выражение построено из прозрачного шаблона? Добавление нового было бы без проблем, и даже сам клиент мог бы сделать это на странице «Параметры».
так что предположительно это не категория.
blockquote>Ваше предположение верно. Обратный итератор не является категорией итераторов.
Так что же это такое?
blockquote>Стандарт определяет
std::reverse_iterator
как:Шаблон класса reverse_iterator - это адаптер итератора, который выполняет итерацию с конца последовательности, определенной его основным итератором, до начала этой последовательности. Фундаментальное соотношение между обратным итератором и его соответствующим итератором i определяется тождеством: & amp; (reverse_iterator (i)) == & amp; (i - 1).
blockquote>Категория итераторов в
std::reverse_iterator<Iterator>
является категорией итераторов вIterator
.
Аналогичным образом, другие адаптеры итераторов, такие как итераторы перемещения, итераторы фильтра, итераторы шага и т. д., также не являются категориями итераторов.
Категории итераторов кодируют уровней функциональности .
n
Эти уровни функциональности используются алгоритмами - некоторые алгоритмы требуют определенного уровня функциональности, некоторые алгоритмы можно просто оптимизировать на основе определенных уровней функциональности (например, advance(it, n)
для итераторов с произвольным доступом можно просто выполнить it += n
, тогда как для прямых итераторов это должно быть ++it
в цикле).
Но «обратное» - это не уровень функциональности - это просто другой способ представления базовых данных. Обращенный итератор не заслуживает своей собственной категории итераторов по той же причине, по которой итератор «move» не делает, или «фильтрованный» итератор не делает, или «посчитанный» итератор - нет. Алгоритмы не заботятся, обращены ли итераторы или нет - они работают одинаково в любом случае. Не важно, каким образом ++it
фактически перемещает итератор.
Обратные итераторы - это просто итераторы. std::reverse_iterator
известен как адаптер итератора (наряду с кучей других, таких как std::move_iterator
) - это итератор, который адаптирует другой итератор. Но вы могли бы написать обратный итератор, который не является адаптером - действительно, вы могли бы даже написать обратный итератор, который не является двунаправленным! Эти два понятия являются ортогональными. [+1121]