В чем разница между 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. Но оператор [] не проверяет диапазон индекса и показывает неопределенное поведение в случаях, когда он выходит за пределы диапазона.

Другие вопросы по тегам