Есть ли существует различие между size_t
и container::size_type
?
То, что я понимаю, size_t
более универсально и может использоваться для любого size_type
s.
Но container::size_type
оптимизированный для определенных видов контейнеров?
Стандартные контейнеры определяют size_type
как typedef для Allocator :: size_type
(Allocator - это параметр шаблона), который для std: : allocator
обычно определяется как size_t
(или совместимый тип). Так что для стандартного случая они одинаковы.
Однако, если вы используете настраиваемый распределитель, можно использовать другой базовый тип. Так что container :: size_type
предпочтительнее для максимальной универсальности.
Для std :: [w] string
, std :: [w] string :: size_type
равно std :: allocator
, что равно std :: size_t
. Для других контейнеров это определенный реализацией целочисленный тип без знака.
Иногда полезно иметь точный тип, поэтому, например, кто-то знает, где этот тип завершается (например, до UINT_MAX
), чтобы можно было использовать это. Или для шаблонов где вам действительно нужно передать два идентичных типа в шаблоны функций / классов.
Часто я нахожу, что использую size_t
для краткости или итераторы в любом случае. В общем коде, поскольку вы обычно не знаете, с каким экземпляром контейнера используется ваш шаблон и какого размера эти контейнеры, вам придется использовать typedef Container :: size_type
, если вам нужно хранить контейнеры. размер.
size_t
is defined as the type used for the size of an object and is platform dependent.container::size_type
is the type that is used for the number of elements in the container and is container dependent.All std
containers use size_t
as the size_type
, but each independent library vendor chooses a type that it finds appropriate for its container.
If you look at qt, you'll find that the size_type
of Qt containers is version dependent. In Qt3 it was unsigned int
and in Qt4 it was changed to int
.