2009-05-27 20 views
83

¿Hay una diferencia entre size_t y container::size_type?'size_t' vs 'container :: size_type'

Lo que entiendo es size_t es más genérico y se puede utilizar para cualquier size_type s.

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

Respuesta

88

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 es típicamente definido para ser size_t (o un tipo compatible). Entonces, para el caso estándar, son lo mismo.

Sin embargo, si usa un asignador personalizado, podría utilizarse un tipo subyacente diferente. Entonces, container::size_type es preferible para la máxima generalidad.

+2

¿Puedes aclarar esta respuesta? He repasado los borradores de estándares desde 'N1804' y no veo ninguna relación entre' Allocator :: size_type' y 'size_type'. Un rápido vistazo a libstdC++ tampoco muestra nada similar. –

+1

@ShafikYaghmour, por lo que esta respuesta está desactualizada, pero para maximizar la portabilidad, creo que el consejo sigue siendo correcto: C++ 03 especificado "Tabla 32: tamaño_tipo: un tipo que puede representar el tamaño del objeto más grande en el modelo de asignación. " En ese momento, 'size_t' era la implementación práctica de esas restricciones. Sin embargo, en C++ 11, ahora se define esencialmente como: 'std :: make_unsigned :: type' de forma predeterminada. Que en la práctica, probablemente será el mismo o compatible con 'size_t'. –

+1

CUIDADO la respuesta es incorrecta .... ver http: // stackoverflow.com/questions/4849678/c-for-loop-size-type-vs-size-t TL: DR: los asignadores size_type deben ser size_t y en C++ 17 size_type quedarán obsoletos como están. – user3063349

8

Para 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 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, al UINT_MAX) para que uno pueda usar eso. O para plantillas, donde realmente necesita pasar dos tipos idénticos a plantillas de función/clase.

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

32
  • size_t se define como el tipo utilizado para el tamaño de un objeto y es dependiente de la plataforma.
  • container::size_type es el tipo que se utiliza para la cantidad de elementos en el contenedor y es contenedor dependiente.

Todo std contenedores de uso size_t como el size_type, pero cada proveedor biblioteca independiente elige un tipo que encuentra apropiado para su contenedor.

Si mira , encontrará que el size_type de contenedores Qt depende de la versión. En Qt3 fue unsigned int y en Qt4 se cambió a int.

+1

Me parece un poco extraño tener el tamaño de algo expresado como int. ¿Podríamos tener un tamaño negativo para un contenedor? –

+8

@MihaiTodor: no es inusual que las personas usen tipos firmados para todo, supongo que Qt lo sigue. La razón es que las operaciones mixtas (en particular las comparaciones) son un área de desastre tal que muchas personas preferirían evitar el uso de tipos sin firmar para los números, que tener que lidiar y/o evitar operaciones mixtas. El hecho de que los tipos sin firmar no puedan expresar números negativos, no significa que * tienes * que usarlos para números que no pueden ser negativos :-) Confieso que me sorprende que sea 'int' en lugar de' ssize_t', ' int' es algo pequeño. –

+0

@Steve Sí, tienes un punto. Gracias. –