строка:: тип размера вместо int


const std::string::size_type cols = greeting.size() + pad * 2 + 2;

почему string::size_type? int должно работать! он содержит цифры!!!

3   51   2009-07-25 07:04:00

3 ответа:

короткий держит номера тоже. Как и подписанный символ.

но ни один из этих типов гарантированно быть достаточно большим, чтобы представлять размеры любой строки.

string::size_type гарантирует именно это. Это тип, который достаточно велик, чтобы представлять размер строки, независимо от того, насколько велика эта строка.

для простого примера того, почему это необходимо, рассмотрим 64-разрядные платформы. Интервал, как правило, по-прежнему 32-битные, но у вас гораздо больше чем 2^32 байт памяти.

поэтому, если бы использовался (подписанный) int, вы не смогли бы создать строки размером более 2^31 символов. однако size_type будет 64-разрядным значением на этих платформах, поэтому он может представлять более крупные строки без проблем.

пример, который вы дали,

const std::string::size_type cols = greeting.size() + pad * 2 + 2;

С ускоренный C++ от Koenig. Он также указывает причину своего выбора сразу после этого, а именно:

тип std:: string определяет size_type как имя соответствующий тип для хранения количества символов в строке. Всякий раз, когда нам нужен местный переменная чтобы содержать размер строки, мы должны использовать std::string:: size_type как тип этой переменной.

причина, по которой мы дали cols тип std::string::size_type является чтобы гарантировать, что cols способен содержать количество символов в приветствии, независимо от того, насколько велико это число. Мы могли бы просто сказали, что cols имеет тип int, и действительно, это, вероятно, будет работа. Однако значение cols зависит от размера входных данных для наша программа,и мы не имеем никакого контроля над тем, как долго этот вход может быть. Вполне возможно, что кто-то может дать нашей программе строка так долго что int недостаточно, чтобы содержать его длину.

вложенные size_type typedef является требованием для STL-совместимых контейнеров (которые std::string бывает), поэтому общий код может выбрать правильный целочисленный тип для представления размеров.

нет смысла использовать его в коде приложения size_t вполне ок (int нет, потому что он подписан, и вы получите подписанные/неподписанные предупреждения сравнении).