См. std::string::at() , он выдаст std::out_of_range
при ошибке. Оператор [] не проверяет границы.
То же самое верно и для стандартных контейнеров, которые обеспечивают произвольный доступ (std::array
, std::vector
, std::deque
, std::map
, std::unordered_map
): обычно в C++ вы должны всегда следить за тем, чтобы доступ за пределы диапазона не происходил. Это позволяет повысить производительность программы. Но в некоторых конкретных случаях может быть полезно использовать вместо этого обработку исключений (через try
и catch
), жертвуя некоторой производительностью.
@AshishChurasia Его поведение зависит от контейнера. Для векторов ничего не проверяет, для карт автоматически вставляет элемент, если он отсутствует, и не работает с множествами. Кроме того, в большинстве компиляторов (точнее, в реализациях стандартных библиотек) есть способ включить проверку границ.
Ваш код имеет неопределенное поведение.
std::string::operator[]
не выполняет никаких связанных проверок.
std::string::at()
, с другой стороны, выполняет проверки границ и выдает исключение типа std::out_of_range
, когда вы получаете доступ к данным, выходящим за пределы.
Означает ли это, что строка «тип данных» в С++ также не ограничена, как массивы?
Конечно, std::string
имеет границы. То, как вы получаете доступ к его содержимому, заключается в том, будут ли выполняться проверки привязки или нет.
Значит ли это, что оператор [] не проверяет границы всего, в чем он используется, например, векторов, карт и наборов в STL?