'size_t' против 'container :: size_type'


108

Есть ли разница между size_tи container::size_type?

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

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

Ответы:


108

Стандартные контейнеры определяют size_typeкак ЬурейиЕ к Allocator::size_type(Распределитель является параметром шаблона), который в течение std::allocator<T>::size_typeкак правило , определенных , чтобы быть size_t(или совместимым типом). Так что для стандартного случая они одинаковы.

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


2
Вы можете уточнить этот ответ? Я просмотрел проекты стандартов еще N1804и не вижу никакой связи между Allocator::size_typeи size_type. Беглый взгляд на libstdc ++ тоже не показывает ничего похожего.
Шафик Ягмур,

1
@ShafikYaghmour, Итак, этот ответ немного устарел, но для максимальной переносимости я думаю, что совет все еще актуален: C ++ 03 определил «Таблица 32: size_type: тип, который может представлять размер самого большого объекта в модели распределения». В то время size_tставка была сделана на практическую реализацию этих ограничений. Однако в C ++ 11 он теперь определяется как: std::make_unsigned<X::difference_type>::typeпо умолчанию. Который на практике, вероятно, будет таким же или совместимым с size_t.
Эван Теран,

2
ВНИМАНИЕ, ответ неверен .... см. Stackoverflow.com/questions/4849678/… TL: DR: размер_типа распределителей должен быть size_t, а в C ++ 17 size_type будет устаревшим как есть.
user3063349

1
@ user3063349 Я не вижу ничего на этой странице и в стандарте C ++ 2017 (23.10.8), чтобы намекнуть на size_typeустаревание. Что дает?
Marc 2377

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

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

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


1
Мне кажется немного странным, что размер чего-либо выражается как int. Могли ли мы когда-нибудь иметь отрицательный размер для контейнера?
Mihai Todor

10
@MihaiTodor: люди нередко используют подписанные типы для всего, думаю, Qt следует их примеру. Причина в том, что смешанные операции (в частности, сравнения) являются такой областью бедствия, что многие люди предпочли бы избегать использования беззнаковых типов для чисел, чем иметь дело со смешанными операциями и / или избегать их. Тот факт, что беззнаковые типы не могут выражать отрицательные числа, не означает, что вы должны использовать их для чисел, которые не могут быть отрицательными :-) Признаюсь, я удивлен, что это, intскорее, чем ssize_t, intэто немного.
Стив Джессоп,

2
«Все стандартные контейнеры используют size_t как size_type» очень, очень ложно и вводит в заблуждение. Да, они ОБЫЧНО делают (по крайней мере, все мои компиляторы так поступали), но в справочнике по языку C ++ не указано, что он должен быть похожим для всех контейнеров stl !! so care
user3063349


8

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.