C'è una differenza tra size_t
e container::size_type
?
Quello che ho capito è che size_t
è più generico e può essere utilizzato per qualsiasi messaggio size_type
.
Ma è container::size_type
ottimizzato per tipi specifici di contenitori?
C'è una differenza tra size_t
e container::size_type
?
Quello che ho capito è che size_t
è più generico e può essere utilizzato per qualsiasi messaggio size_type
.
Ma è container::size_type
ottimizzato per tipi specifici di contenitori?
Risposte:
I contenitori standard definiscono size_type
come un typedef to Allocator::size_type
(Allocator è un parametro template), che per std::allocator<T>::size_type
è tipicamente definito come size_t
(o un tipo compatibile). Quindi per il caso standard, sono gli stessi.
Tuttavia, se si utilizza un allocatore personalizzato, è possibile utilizzare un tipo sottostante diverso. Quindi container::size_type
è preferibile per la massima generalità.
size_t
la scommessa era l'attuazione pratica di quei vincoli. Tuttavia, in C ++ 11, ora è definito essenzialmente come: std::make_unsigned<X::difference_type>::type
per impostazione predefinita. Che in pratica sarà probabilmente lo stesso o compatibile con size_t
.
size_type
deprecazione. Cosa succede?
size_t
è definito come il tipo utilizzato per la dimensione di un oggetto ed è dipendente dalla piattaforma .container::size_type
è il tipo utilizzato per il numero di elementi nel contenitore ed è dipendente dal contenitore .Tutti i std
contenitori vengono utilizzati size_t
come size_type
, ma ogni fornitore di libreria indipendente sceglie un tipo che ritiene appropriato per il proprio contenitore.
Se guardi qt, scoprirai che il size_type
contenuto dei contenitori Qt dipende dalla versione. In Qt3 era unsigned int
e in Qt4 è stato cambiato in int
.
int
piuttosto che ssize_t
, int
è una specie di piccolo.
Perché std::[w]string
, std::[w]string::size_type
è uguale a std::allocator<T>::size_type
, che è uguale a std::size_t
. Per altri contenitori, è un tipo intero senza segno definito dall'implementazione.
A volte è utile avere il tipo esatto, quindi per esempio si sa dove va a finire il tipo (like, to UINT_MAX
) in modo da poterlo utilizzare. O per i modelli, dove è veramente necessario passare due tipi identici a modelli di funzione / classe.
Spesso trovo che uso comunque size_t
per brevità o iteratori. Nel codice generico, poiché generalmente non sai con quale istanza di contenitore viene utilizzato il tuo modello e quale dimensione hanno questi contenitori, dovrai utilizzare il Container::size_type
typedef se devi memorizzare le dimensioni dei contenitori.
N1804
e non vedo alcuna relazione traAllocator::size_type
esize_type
. Una rapida occhiata a libstdc ++ non mostra nulla di simile a questo.