‘size_t’ frente a ‘container :: size_type’

¿Hay una 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 .

Pero, ¿ container::size_type optimizado para tipos específicos de contenedores?

Los contenedores estándar definen size_type como typedef a Allocator::size_type (Allocator es un parámetro de plantilla), que para std::allocator::size_type se define típicamente como 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. Entonces container::size_type es preferible para la máxima generalidad.

  • 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 usa para la cantidad de elementos en el contenedor y depende del contenedor .

Todos los contenedores size_type usan size_t como size_type , pero cada proveedor de biblioteca independiente elige un tipo que considere apropiado para su contenedor.

Si miras qt , verás que size_type de los contenedores Qt depende de la versión. En Qt3 no tenía unsigned int y en Qt4 se cambió a int .

Para std::[w]string , std::[w]string::size_type es igual a std::allocator::size_type , que es igual a std::size_t . Para otros contenedores, es una implementación definida tipo entero sin signo.

A veces es útil tener el tipo exacto, así que, por ejemplo, uno sabe dónde se ajusta el tipo (como, a UINT_MAX ) para que uno pueda hacer uso de eso. O para plantillas, donde realmente necesita pasar dos tipos idénticos a plantillas de función / clase.

A menudo me parece que uso size_t para la brevedad o iteradores de todos modos. En el código genérico, dado que generalmente no se sabe con qué instancia de contenedor se utiliza su plantilla y qué tamaño tienen esos contenedores, tendrá que usar el tipo de Container::size_type typedef si necesita almacenar el tamaño de los contenedores.