¿Hay alguna diferencia entre size_t
y container::size_type
?
Lo que entiendo es que size_t
es más genérico y se puede usar para cualquier size_type
s.
¿Pero está container::size_type
optimizado para tipos específicos de contenedores?
¿Hay alguna diferencia entre size_t
y container::size_type
?
Lo que entiendo es que size_t
es más genérico y se puede usar para cualquier size_type
s.
¿Pero está container::size_type
optimizado para tipos específicos de contenedores?
Respuestas:
Los contenedores estándar definen size_type
como un typedef a Allocator::size_type
(Asignador es un parámetro de plantilla), que para std::allocator<T>::size_type
está típicamente define para ser size_t
(o un tipo compatible). Entonces, para el caso estándar, son lo mismo.
Sin embargo, si usa un asignador personalizado, se podría usar un tipo subyacente diferente. Por eso container::size_type
es preferible para la máxima generalidad.
size_t
fue la apuesta práctica la implementación de esas limitaciones. Sin embargo, en C ++ 11, ahora se define esencialmente como: std::make_unsigned<X::difference_type>::type
por defecto. Lo que en la práctica, probablemente será el mismo o compatible con size_t
.
size_type
desaprobación. ¿Lo que da?
size_t
se define como el tipo utilizado para el tamaño de un objeto y depende de la plataforma .container::size_type
es el tipo que se utiliza para el número de elementos del contenedor y depende del contenedor .Todos los std
contenedores utilizan size_t
como el size_type
, pero cada proveedor de biblioteca independiente elige un tipo que considera apropiado para su contenedor.
Si miras qt, encontrará que los size_type
contenedores de Qt dependen de la versión. En Qt3 lo fue unsigned int
y en Qt4 se cambió a int
.
int
lugar de ssize_t
, int
algo pequeño.
Porque std::[w]string
, std::[w]string::size_type
es igual a std::allocator<T>::size_type
, que es igual a std::size_t
. Para otros contenedores, es algún tipo de entero sin signo definido por la implementación.
A veces es útil tener el tipo exacto, así que, por ejemplo, uno sabe dónde se envuelve el tipo (me gusta, a UINT_MAX
) para poder hacer uso de eso. O para plantillas, donde realmente necesita pasar dos tipos idénticos a plantillas de función / clase.
A menudo encuentro que uso size_t
por brevedad o iteradores de todos modos. En código genérico, dado que generalmente no sabe con qué instancia de contenedor se usa su plantilla y qué tamaño tienen esos contenedores, tendrá que usar Container::size_type
typedef si necesita almacenar el tamaño de los contenedores.
N1804
y no veo ninguna relación entreAllocator::size_type
ysize_type
. Un vistazo rápido a libstdc ++ tampoco muestra nada similar a esto.