Один случай использования, в котором я постоянно находил at()
, полезен для облегчения анализа сложного пользовательского ввода.Например, анализируя код C ++, я обнаруживаю, что двигаюсь по массиву лексических токенов, когда проверяю грамматические конструкции.Логика часто звучит так: «Если этот токен является Идентификатором, а следующий - Равенством, то это должно быть присвоение, поэтому просмотрите маркер точки с запятой, чтобы определить диапазон токенов для выражения».Использование at()
в таком коде означает, что вы можете легко выразить ожидания с некоторым смещением относительно текущей точки, аля:
if (tokens.at(i) == Switch)
{
if (tokens.at(++i) != Left_Parentheses)
// throw or return to say input program's broken...
if (tokens.at(++i) == ...)
...
}
Вы получаете исключение, когда пытаетесь проанализировать недопустимую программу ,Увеличение позиции происходит во многих местах кода, что постоянная проверка размера будет кошмаром (многословно и чрезвычайно подвержено ошибкам), поскольку в такой ситуации вы понимаете, насколько больше должна быть программа, чтобы быть действительной, посколькуприменяются грамматические правила.Использование at()
здесь является кратким, надежным, интуитивно понятным и достаточно производительным по сравнению с альтернативами с функциональным эквивалентом.
FWIW - быстрый поиск нашего производственного кода (200 тыс. Строк, большинство написано до того, как я присоединился к команде) нашелдюжина использований at()
.