Есть ли разница между 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
как ЬурейиЕ к Allocator::size_type
(Распределитель является параметром шаблона), который в течение std::allocator<T>::size_type
как правило , определенных , чтобы быть size_t
(или совместимым типом). Так что для стандартного случая они одинаковы.
Однако, если вы используете настраиваемый распределитель, можно использовать другой базовый тип. Так container::size_type
что предпочтительнее для максимальной общности.
size_t
ставка была сделана на практическую реализацию этих ограничений. Однако в C ++ 11 он теперь определяется как: std::make_unsigned<X::difference_type>::type
по умолчанию. Который на практике, вероятно, будет таким же или совместимым с size_t
.
size_type
устаревание. Что дает?
size_t
определяется как тип, используемый для размера объекта, и зависит от платформы .container::size_type
- это тип, который используется для количества элементов в контейнере и зависит от контейнера .Все std
контейнеры используют size_t
как size_type
объект, но каждый независимый поставщик библиотеки выбирает тип, который он считает подходящим для своего контейнера.
Если вы посмотрите на qt, вы обнаружите, что size_type
контейнеры Qt зависят от версии. В Qt3 это было, unsigned int
а в Qt4 было заменено на int
.
int
скорее, чем ssize_t
, 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, если вам нужно сохранить размер контейнеров.
N1804
и не вижу никакой связи междуAllocator::size_type
иsize_type
. Беглый взгляд на libstdc ++ тоже не показывает ничего похожего.