'size_t' vs 'container:: size_type'

Существует ли разница между size_t и container::size_type?

Я понимаю, что size_t является более общим и может использоваться для любых size_type s.

Но оптимизирован ли container::size_type для конкретных видов контейнеров?

Ответ 1

Стандартные контейнеры определяют size_type как typedef для Allocator::size_type (Allocator - это параметр шаблона), который для std::allocator обычно определяется как size_t (или совместимый тип). Поэтому для стандартного случая они одинаковы.

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

Ответ 2

  • size_t определяется как тип, используемый для размера объекта и зависимый от платформы.
  • container::size_type - тип, который используется для количества элементов в контейнере и зависит от контейнера.

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

Если вы посмотрите qt, вы обнаружите, что size_type контейнеров Qt зависит от версии. В Qt3 это было unsigned int, а в Qt4 оно было изменено на int.

Ответ 3

Для std::[w]string, std::[w]string::size_type равно std::allocator<T>::size_type, что равно std::size_t. Для других контейнеров это определенная реализация, определенная целочисленным типом без знака.

Иногда полезно иметь точный тип, поэтому, например, один знает, где тип обходит вокруг (например, до UINT_MAX), чтобы можно было это использовать. Или для шаблонов, где вам действительно нужно передать два одинаковых типа шаблонам функций/классов.

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