‘size_t’ vs ‘container :: size_type’

Existe uma diferença entre size_t e container::size_type ?

O que eu entendo é size_t é mais genérico e pode ser usado para qualquer size_type s.

Mas é container::size_type otimizado para tipos específicos de contêineres?

Os contêineres padrão definem size_type como um typedef para Allocator::size_type ( Allocator::size_type é um parâmetro de modelo), que para std::allocator::size_type é normalmente definido como size_t (ou um tipo compatível). Então, para o caso padrão, eles são os mesmos.

No entanto, se você usar um alocador personalizado, um tipo subjacente diferente poderá ser usado. Portanto, container::size_type é preferível para a generalidade máxima.

  • size_t é definido como o tipo usado para o tamanho de um object e depende da plataforma .
  • container::size_type é o tipo usado para o número de elementos no contêiner e depende do contêiner .

Todos os contêineres std usam size_t como o size_type , mas cada fornecedor de biblioteca independente escolhe um tipo que julgue apropriado para seu contêiner.

Se você olhar para o qt , você verá que o size_type dos contêineres do Qt é dependente da versão. No Qt3, foi unsigned int e no Qt4 foi alterado para int .

Para std::[w]string , std::[w]string::size_type é igual a std::allocator::size_type , que é igual ao std::size_t . Para outros contêineres, é alguma implementação definida como tipo inteiro sem sinal.

Às vezes, é útil ter o tipo exato, portanto, por exemplo, é possível saber para onde o tipo se envolve (como UINT_MAX ), para que se possa fazer uso disso. Ou para modelos, onde você realmente precisa passar dois tipos idênticos para modelos de function / class.

Muitas vezes eu acho que eu uso size_t para brevidade ou iteradores de qualquer maneira. No código genérico, como geralmente você não sabe com qual instância de contêiner seu modelo é usado e qual o tamanho desses contêineres, você terá que usar o Container::size_type typedef se precisar armazenar o tamanho dos contêineres.