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