size_t против контейнера :: size_type - PullRequest
95 голосов
/ 28 мая 2009

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

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

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

Ответы [ 3 ]

96 голосов
/ 28 мая 2009

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

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

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

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

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

8 голосов
/ 28 мая 2009

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

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

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

...