'size_t' vs 'container :: size_type'

108

Existe uma diferença entre size_te container::size_type?

O que entendi é size_tmais genérico e pode ser usado para qualquer size_types.

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

Charles Khunt
fonte

Respostas:

108

Os contêineres padrão definem size_typecomo um typedef to Allocator::size_type(Allocator é um parâmetro de modelo), que geralmentestd::allocator<T>::size_type é definido como (ou um tipo compatível). Portanto, para o caso padrão, eles são os mesmos.size_t

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

Evan Teran
fonte
2
Você pode esclarecer esta resposta? Eu olhei para o rascunho das normas N1804e não vejo qualquer relação entre Allocator::size_typee size_type. Uma rápida olhada em libstdc ++ também não mostra nada semelhante a isso.
Shafik Yaghmour
1
@ShafikYaghmour, Esta resposta está um pouco desatualizada, mas para maximizar a portabilidade, acho que o conselho ainda é válido: C ++ 03 especificou "Tabela 32: size_type: um tipo que pode representar o tamanho do maior objeto no modelo de alocação." Na época, size_tera a aposta prática a implementação dessas restrições. No entanto, em C ++ 11, agora é definido essencialmente como: std::make_unsigned<X::difference_type>::typepor padrão. Que, na prática, provavelmente será o mesmo ou compatível com size_t.
Evan Teran
2
CUIDADO, a resposta está incorreta ... consulte stackoverflow.com/questions/4849678/… TL: DR: os alocadores size_type precisam ser size_t e em C ++ 17 size_type será descontinuado como está.
user3063349
1
@ user3063349 Não vejo nada nessa página, nem no C ++ 2017 Standard (23.10.8), que indique uma suspensão de size_typeuso. O que da?
Marc.2377,
42
  • size_té definido como o tipo usado para o tamanho de um objeto 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 stdcontêineres usam size_tcomo size_type, mas cada fornecedor de biblioteca independente escolhe um tipo que considera apropriado para seu contêiner.

Se você olhar para , você descobrirá que os size_typecontêineres Qt dependem da versão. No Qt3 era unsigned inte no Qt4 foi alterado para int.

TimW
fonte
1
Acho um pouco estranho ter o tamanho de algo expresso como um int. Poderíamos ter um tamanho negativo para um contêiner?
Mihai Todor
10
@MihaiTodor: não é incomum que as pessoas usem tipos assinados para tudo, acho que o Qt está seguindo o exemplo. A razão é que as operações mistas (em particular as comparações) são uma área de desastre que muitas pessoas preferem evitar o uso de tipos sem sinal para os números, do que ter que lidar com e / ou evitar operações mistas. Só porque tipos não assinados não podem expressar números negativos, não significa que você tem que usá-los para números que não pode ser negativo :-) Confesso que estou surpreso que é int, em vez de ssize_t, inté uma espécie de pequeno.
Steve Jessop
2
"Todos os containers std usam size_t como size_type" muito, muito falso e enganoso. Sim, eles costumam fazer (pelo menos todos os meus compiladores faziam dessa forma), mas a referência da linguagem C ++ não afirma que precisa ser semelhante para todos os contêineres stl !! tão cuidado
user3063349
8

Pois std::[w]string, std::[w]string::size_typeé igual a std::allocator<T>::size_type, que é igual a std::size_t. Para outros contêineres, é algum tipo de inteiro não assinado definido pela implementação.

Às vezes é útil ter o tipo exato, por exemplo, sabe-se para onde o tipo vai (como, para UINT_MAX) para que se possa fazer uso disso. Ou para modelos, onde você realmente precisa passar dois tipos idênticos para modelos de função / classe.

Freqüentemente, acho que uso size_tpor brevidade ou iteradores de qualquer maneira. No código genérico, como você geralmente não sabe com qual instância de contêiner seu modelo é usado e qual tamanho esses contêineres têm, você terá que usar o Container::size_typetypedef se precisar armazenar o tamanho dos contêineres.

Johannes Schaub - litb
fonte