Существует ли разница между size_t
и container::size_type
?
Я понимаю, что size_t
является более общим и может использоваться для любых size_type
s.
Но оптимизирован ли container::size_type
для конкретных видов контейнеров?
Существует ли разница между size_t
и container::size_type
?
Я понимаю, что size_t
является более общим и может использоваться для любых size_type
s.
Но оптимизирован ли container::size_type
для конкретных видов контейнеров?
Стандартные контейнеры определяют size_type
как typedef для Allocator::size_type
(Allocator - это параметр шаблона), который для std::allocator
обычно определяется как size_t
(или совместимый тип). Поэтому для стандартного случая они одинаковы.
Однако, если вы используете пользовательский распределитель, можно использовать другой базовый тип. Поэтому container::size_type
является предпочтительным для максимальной общности.
size_t
определяется как тип, используемый для размера объекта и зависимый от платформы.container::size_type
- тип, который используется для количества элементов в контейнере и зависит от контейнера.Все контейнеры std
используют size_t
как size_type
, но каждый независимый поставщик библиотеки выбирает тип, который он считает подходящим для своего контейнера.
Если вы посмотрите qt, вы обнаружите, что size_type
контейнеров Qt зависит от версии. В Qt3 это было unsigned int
, а в Qt4 оно было изменено на int
.
Для std::[w]string
, std::[w]string::size_type
равно std::allocator<T>::size_type
, что равно std::size_t
. Для других контейнеров это определенная реализация, определенная целочисленным типом без знака.
Иногда полезно иметь точный тип, поэтому, например, один знает, где тип обходит вокруг (например, до UINT_MAX
), чтобы можно было это использовать. Или для шаблонов, где вам действительно нужно передать два одинаковых типа шаблонам функций/классов.
Часто я нахожу, что я использую size_t
для краткости или итераторов. В общем коде, поскольку вы, как правило, не знаете, какой экземпляр контейнера используется вашим шаблоном и какой размер имеют эти контейнеры, вам нужно будет использовать Container::size_type
typedef, если вам нужно сохранить размер контейнеров.