const std::string::size_type cols = greeting.size() + pad * 2 + 2;
Почему string::size_type
? int
должен работать! он содержит числа!!!
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
Почему string::size_type
? int
должен работать! он содержит числа!!!
Короткие числа сдерживания тоже. Как и подписанный char.
Но ни один из этих типов не может быть достаточно большим, чтобы представлять размеры любых строк.
string::size_type
гарантирует именно это. Это тип, который достаточно велик, чтобы представлять размер строки, независимо от того, насколько велика эта строка.
Для простого примера, почему это необходимо, рассмотрите 64-битные платформы. Инт, как правило, по-прежнему 32 бит на них, но у вас гораздо больше 2 ^ 32 байт памяти.
Итак, если использовался (подписанный) int, вы не смогли бы создать строки размером более 2 ^ 31 символов. size_type будет 64-битным значением на этих платформах, поэтому он может представлять большие строки без проблем.
Пример, который вы указали,
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
от Ускоренный С++ от 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
нет, потому что он подписан, и вы получите предупреждения о подписании/без знака).