В чем разница между string::at и string::operator[]?
Меня учили string::at
в школе, но, изучая струнную библиотеку, я увидел string::operator[]
, который мне никогда не показывали раньше.
Я сейчас использую operator[]
и не использовал at
так как, а в чем разница? Вот пример кода:
std::string foo = "my redundant string has some text";
std::cout << foo[5];
std::cout << foo.at(5);
По сути, они одинаковы с точки зрения производства, но есть ли какие-то тонкие различия, о которых я не знаю?
4 ответа
Да, есть одно существенное отличие: использование .at()
выполняет проверку диапазона переданного индекса и выдает исключение, если оно находится за концом строки, в то время как operator[]
просто приносит неопределенное поведение в этой ситуации.
at
выполняет проверку границ, исключение типа std::out_of_range
будет брошен на недопустимый доступ.
operator[]
НЕ проверяет границы и поэтому может быть опасным, если вы пытаетесь получить доступ за пределами строки. Это немного быстрее, чем at
хоть.
станд:: строка:: на
Возвращает ссылку на символ в указанном месте поз. Проверка границ выполняется, исключение типа std::out_of_range будет выдано при недопустимом доступе.
строка:: оператор []
Возвращает ссылку на символ в указанном месте поз. Проверка границ не выполняется. Это неопределенное поведение для доступа к внешним operator[]
,
string::operator[]
должно быть быстрее, чем std::string::at
см ссылку
да, есть разница, .at() проверяет, находится ли строковый индекс, к которому вы пытаетесь получить доступ, вне допустимого диапазона и в этой ситуации выдает исключение out_of_range. Но оператор [] не проверяет диапазон индекса и показывает неопределенное поведение в случаях, когда он выходит за пределы диапазона.