String:: size_type вместо int

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

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

Ответ 1

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

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

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

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

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

Ответ 2

Пример, который вы указали,

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 недостаточно, чтобы содержать его длину.

Ответ 3

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

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