Каковы преимущества использования vector :: at по сравнению с vector :: operator []?
Когда мне следует использовать vector :: at, а не vector :: size + vector :: operator []?
Важным моментом здесь является то, что исключения позволяют отделить нормальный поток кода от логики обработки ошибок, а один блок перехвата может обрабатывать проблемы, возникающие в любом из множества сайтов выброса, даже если они разбросаны глубоко внутри вызовов функций. Таким образом, дело не в том, что at()
обязательно проще для однократного использования, а в том, что иногда это становится проще - и меньше запутывает логику обычного случая - когда у вас много индексации для проверки.
Следует также отметить, что в некоторых типах кода индекс увеличивается сложным образом и постоянно используется для поиска в массиве. В таких случаях гораздо проще обеспечить правильные проверки, используя at()
.
В качестве примера из реальной жизни у меня есть код, который разбивает C ++ на лексические элементы, а затем другой код, который перемещает индекс по вектору токенов. В зависимости от того, с чем столкнулись, я могу увеличить и проверить следующий элемент, например:
if (token.at(i) == Token::Keyword_Enum)
{
ASSERT_EQ(tokens.at(++i), Token::Idn);
if (tokens.at(++i) == Left_Brace)
...
or whatever
В такой ситуации очень сложно проверить, не достигли ли вы ненадлежащим образом конца ввода, потому что это очень зависит от того, какие именно токены встречаются. Явная проверка в каждой точке использования является болезненной, и существует гораздо больше возможностей для ошибок программиста, таких как приращения до / после, смещения в точке использования, ошибочные рассуждения о продолжении действия некоторого более раннего теста и т. Д.