Есть ли разница между size_t
и container::size_type
?
То, что я понимаю, size_t
является более общим и может использоваться для любых size_type
s.
Но container::size_type
оптимизирован ли он для конкретных типов контейнеров?
c++
size-type
container-data-type
Чарльз Хант
источник
источник
N1804
и не вижу никакой связи междуAllocator::size_type
иsize_type
. Беглый взгляд на libstdc ++ тоже не показывает ничего похожего.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, если вам нужно сохранить размер контейнеров.источник